Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Autonomer Panzer

Hinzufügen einer viel billigeren Alternative zur Carter- und Kaya-Designreferenz mit einem Lego EV3-Set.

In diesem Projekt werde ich den Bau eines Kettenfahrzeugs dokumentieren, das aus Lego Technic-Teilen und -Motoren besteht, mit LiDAR verbessert und von einem Jetson Nano-Board mit dem neuesten Isaac SDK gesteuert wird. Springe zu Teil 8 oder 10 für eine vollständige Demo der autonomen Navigation.

Das Projekt besteht aus den folgenden Komponenten:

Warum Isaac SDK und nicht ROS?

Warum Lego-Teile?

Die Wahl dieses Weges bringt einige Herausforderungen mit sich:

TEIL 1:Erste Schritte

1. Isaac-SDK

2. Spracherkennung (optional)

3. Ev3dev-Bild

Laden Sie das neueste Image für EV3 (ev3dev-stretch) herunter und flashen Sie es auf eine microSD- oder microSDHC-Karte. Das MicroSDXC-Format wird vom EV3-Stein nicht unterstützt.

4. ARM-Cross-Compiler für ev3dev

$ sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi 

Dieser Teil war besonders schwer richtig einzurichten. Ubuntu 18.04 (Hostcomputer und Jetson Nano) verwendet GLIBC_2.28, während ev3dev Debian Stretch und GLIBC_2.24 verwendet. Alles, was mit der standardmäßigen arm-linux-gnueabi-g++-Compilerkonfiguration kompiliert wurde, war von GLIBC_2.28 abhängig und läuft nicht auf EV3. Statisches Verknüpfen funktionierte nicht, da etwas Komplexeres als eine Hallo-Welt Segfaults verursachte. Die Lösung, die ich gefunden habe, bestand darin, alles außer der mathematischen Bibliothek dynamisch zu verknüpfen. Weitere Informationen finden Sie in der Datei jetson-ev3/toolchain/CROSSTOOL. Eine andere Lösung besteht darin, ein Docker-Image von Debian 9 zu verwenden.

5. Jetson + EV3-Arbeitsbereich

$ git clone https://github.com/andrei-ace/jetson-ev3.git 
local_repository(
name ="com_nvidia_isaac",
path ="/home/andrei/ml/isaac"
)
# bearbeiten Sie mit Ihrem Pfad zur Toolchain
linker_flag:"-L/home/andrei/ml/jetson-ev3/toolchain"

6. Jetson Nano mit EV3 verbinden

Im nächsten Teil werde ich viele Linux-Befehle posten. Da es sich um drei beteiligte Systeme handelt, poste ich sie genau so, wie sie in meinem Terminal aussehen würden, d. h.:

[email protected]:~/ml/jetson-ev3$ #this is run on my PC
[email protected]:~$ #this is on Jetson Nano
[email protected]:~$ $ #this in on EV3

Die IPs meines Jetson Nano sind 192.168.0.173 (Ethernet) und 192.168.0.218 (WiFi). Wenn Sie also einen Befehl sehen, der diese Werte verwendet, ersetzen Sie sie durch Ihre.

Ich habe ein USB-A-auf-Mini-Kabel verwendet, um das Jetson-Board mit den folgenden Schritten mit dem EV3-Stein zu verbinden.

Versuchen Sie, über das Jetson-Board zu ssh:

[email protected]:~$ ssh [email protected] 

Das Standardpasswort ist maker.

7. Das Ping-Pong-Tutorial

Isaac hat eine Anleitung, die ein sehr einfaches Codelet erklärt. Ich schlage vor, dieses Tutorial zuerst zu machen. Es führt Sie in die Konzepte ein, die zum Erstellen einer auf Isaac ausgeführten App erforderlich sind.

Rufen Sie nun das Verzeichnis jetson-ev3/apps/ev3/ping_pong/ auf. Dies ist eine modifizierte Version des vorherigen Tutorials, mit einer Wendung senden wir den Ping an den EV3-Stein.

Die meisten Dateien sind aus dem vorherigen Tutorial bekannt. Wir werden Cap’n Proto RPC für Anrufe zwischen Jetson und EV3 verwenden. Cap’n Proto wird stark für die Kommunikation zwischen verschiedenen Isaac-Komponenten verwendet, daher ist es sinnvoll, es hier zu verwenden. Dafür brauchen wir einige neue Dateien:

Kompilieren Sie den ev3_pong-Server:

[email protected]:~/ml/jetson-ev3$ bazel build --config=ev3dev //apps/ev3/ping_pong:ev3_pong 

Kopiere es auf EV3 mit scp zuerst auf Jetson und dann auf EV3.

Erstellen Sie das Ping-Pong-Beispiel und stellen Sie es für Jetson bereit:

[email protected]:~/ml/jetson-ev3$ /engine/build/deploy.sh --remote_user  -p //apps/ev3/ping_pong:ping_pong-pkg -d jetpack43 -h  

Weitere Informationen zum Bereitstellen und Ausführen Ihrer Apps auf Jetson hier.

Führen Sie beide Apps aus:

[email protected]:~$ ./ev3_pong ev3dev.local:9999
[email protected]:~/deploy/andrei/ping_pong-pkg$ . /apps/ev3/ping_pong

Wenn alles funktioniert hat, solltest du die von der Ping-Komponente gesendeten Nachrichten an den Lautsprecher von EV3 hören.

8.Steuerung eines Motors von Isaac

Gleiche Prinzipien, nur etwas komplexer. Ich habe eine andere Anleitung von Isaac verwendet, um mit einem EV3-Motor zu interagieren:

Das Tutorial verwendet eine Segway RMP-Basis. Da ich keinen herumliegen oder 10000$ zum Kaufen habe, habe ich einen Treiber erstellt, der stattdessen die EV3-Motoren steuert. Der Code ist hier.

Der Server, der auf EV3 läuft, ist hier und kann mit dem folgenden Befehl erstellt und ausgeführt werden:

[email protected]:~/ml/jetson-ev3$ bazel build --config=ev3dev //packages/ev3/ev3dev:ev3_control_server
[email geschützt]:~$ ./ev3_control_server ev3dev.local:9000

Ich habe den virtuellen Joystick von Sight verwendet, wie hier erklärt.

9.DifferentialBase für EV3

Der Ev3ControlServer-Server antwortet auf 2 Aufrufe:

Die Kinematik wird hier und hier genauer erklärt.

Ich habe die Beispiel-App proportional_control_cpp verwendet, um den Roboter 1 m zu fahren und die Odometriedaten (Linear- und Winkelgeschwindigkeiten) des EV3 in Drehimpulsen (Tachozählungen) pro Sekunde zu melden. Unter Verwendung der berechneten Reisedistanz (von Isaac) und der Messung der tatsächlichen Distanz habe ich eine Konstante gefunden, um die gemeldeten Werte so anzupassen, dass sie mit den tatsächlichen Ergebnissen übereinstimmen. Das hat gut funktioniert und die Ergebnisse waren viele Male reproduzierbar und das nicht nur in geraden Linien. Sie können diese Werte auch berechnen, indem Sie den Radius des Rads (oder in unserem Fall der Spur) verwenden.

Teil 2:Bau des Roboters

Die Basis ist Legos EV3 Track3r sehr ähnlich, einem der offiziellen Modelle für das EV3-Kit: https://www.lego.com/biassets/bi/6124045.pdf

Der Fall für Jetson Nano ist von hier: https://github.com/3D-printable-lego-technic/PELA-blocks

Teil 3:Isaac-Apps

Eine Isaac-App besteht aus drei Hauptteilen:

Beispiel-App:

{
"name":"voice_control",
"modules":[
"//apps/ev3/voice_control:voice_control_goal_generator",
"@com_nvidia_isaac//packages/navigation",
"@com_nvidia_isaac//packages/planner"
],
"config_files":[
" apps/ev3/voice_control/model/isaac_vcd_model.metadata.json"
],
"config":{
"2d_ev3.ev3_hardware.ev3":{
"isaac.Ev3Driver ":{
"Adresse":"ev3dev.local",
"Port":9000
}
},
"navigation.imu_odometry.odoometry":{
"DifferentialBaseWheelImuOdometry":{
"use_imu":false
}
},
"commander.robot_remote":{
"isaac.navigation.RobotRemoteControl ":{
"angular_speed_max":0.6,
"linear_speed_max":0.3
}
},
"websight":{
"WebsightServer":{
"webroot":"external/com_nvidia_isaac/packages/sight/webroot",
"ui_config":{
"windows":{
"Voice Command Detection":{
"renderer":"plot" ,
"dims":{
"width":400,
"height":200
},
"channels":[
{
"name":"voice_control/voice_detection.voice_command_detector/isaac.audio.VoiceCommandConstruction/voice_command_id",
"active":true
}
]
}
}
}
}
},
"navigation.shared_robot_model":{
"SphericalRobotShapeComponent":{
"Kreise":[
{ "center":[0.0, 0.0], "radius":0.075 },
{ "center":[0.02, 0.03464], "radius":0.055 },
{ "center":[0.02, -0.03464], "radius":0.055 },
{ "center":[-0.04, 0.0], "radius":0.055 },
{ "center":[0.0525, 0.09093 ], "radius":0.035 },
{ "center":[0.0525, -0.09093], "radius":0.035 },
{ "center":[-0.105, 0.0], "radius ":0.035 }
]
}
},
"navigation.control.lqr":{
"isaac.planner.DifferentialBaseLqrPlanner":{
"manual_mode_channel":"commander.robot_remote/isaac.navigation.RobotRemoteControl/manual_mode"
}
},
"navigation.control.control":{
"isaac.planner.DifferentialBaseControl":{
"manual_mode_channel":"commander.robot_remote/isaac.navigation.RobotRemoteControl/manual_mode"
}
}
},
"graph":{
"nodes":[
{
"name":"voice_control_components",
"Komponenten":[
{
"name":"message_ledger",
"type":"isaac::alice::MessageLedger"
},
{
"name":"goal_generator",
"type":"isaac::VoiceControlGoalGenerator"
}
]
},
{
"name":"voice_detection",
"subgraph":"apps/ev3/voice_control/voice_command_detection.subgraph.json"
},
{
"name":"2d_ev3",
"subgraph":"apps/ev3/2d_ev3.subgraph.json"
},

{
"name":"navigation",
"subgraph":"@com_nvidia_isaac//packages/navigation/apps/differential_base_navigation.subgraph.json"
},
{
"name":"commander",
"subgraph":"@com_nvidia_isaac//packages/navigation/ apps/differential_base_commander.subgraph.json"
}
],
"edges":[
{
"source":"voice_detection.subgraph/interface/detected_command" ,
"target":"voice_control_components/goal_generator/detected_command"
},
{
"source":"voice_control_components/goal_generator/goal",
"target" :"navigation.subgraph/interface/goal"
},
{
"source":"2d_ev3.subgraph/interface/base_state",
"target":"navigation. subgraph/interface/state"
},
{
"source":"navigation.subgraph/interface/command",
"target":"commander.subgraph/interface/ control"
},
{
"source":"commander.subgraph/interface/command",
"target":"2d_ev3.subgraph/interface/base_command"
},
{
"source":"2d_ev3.subgraph/interface/flatscan",
"target":"navigation.subgraph/interface/flatscan_for_localization"
},
{
"source":"2d_ev3.subgraph/interface/flatscan",
"target":"navigation. subgraph/interface/flatscan_for_obstacles"
}
]
}
}

Beispiel Untergraph:

{
"modules":[
"@com_nvidia_isaac//packages/audio",
"@com_nvidia_isaac//packages/ ml:tensorflow"
],
"graph":{
"nodes":[
{
"name":"subgraph",
" Komponenten":[
{
"name":"message_ledger",
"type":"isaac::alice::MessageLedger"
},
{
"name":"interface",
"type":"isaac::alice::Subgraph"
}
]
},
{
"name":"audio_capture",
"components":[
{
"name":"ml",
"type":"isaac::alice ::MessageLedger"
},
{
"name":"isaac.audio.AudioCapture",
"type":"isaac::audio::AudioCapture"
}
]
},
{
"name":"voice_command_detector",
"Komponenten":[
{
" name":"ml",
"type":"isaac::alice::MessageLedger"
},
{
"name":"isaac.audio.VoiceCommandFeatureExtraction" ,
"type":"isaac::audio::VoiceCommandFeatureExtraction"
},
{
" name":"isaac.ml.TensorflowInference",
"type":"isaac::ml::TensorflowInference"
},
{
"name":"isaac. audio.VoiceCommandConstruction",
"type":"isaac::audio::VoiceCommandConstruction"
}
]
}
],
"edges" :[
{
"source":"audio_capture/isaac.audio.AudioCapture/audio_capture",
"target":"voice_command_detector/isaac.audio.VoiceCommandFeatureExtraction/audio_packets"
},
{
"source":"voice_command_detector/isaac.audio.VoiceCommandFeatureExtraction/feature_tensors",
"target":"voice_command_detector/isaac.ml.TensorflowInference/input_tensors"
},
{
"source":"voice_command_detector/isaac.ml.TensorflowInference/output_tensors",
"target":"voice_command_detector/isaac.audio.VoiceCommandConstruction/keyword_probabilities"
},
{
"source":"voice_command_detector/isaac.audio.VoiceCommandConstruction/detected_command",
"target":"subgraph/interface/detected _command"
}
]
},
"config":{
"audio_capture":{
"isaac.audio.AudioCapture":{
"sample_rate":16000,
"num_channels":1,
"audio_frame_in_milliseconds":100,
"ticks_per_frame":5
}
},
"voice_command_detector":{
"isaac.audio.VoiceCommandFeatureExtraction":{
"audio_channel_index":0,
"minimum_time_ between_inferences":0.1
},
"isaac.ml.TensorflowInference":{
"model_file_path":"apps/ev3/voice_control/model/isaac_vcd_model.pb",
"config_file_path":"apps/ev3/voice_control/model/isaac_vcd_config. pb"
},
"isaac.audio.VoiceCommandConstruction":{
"command_list":[
"jetson",
"jetson left",
"jetson right"
],
"command_ids":[0, 1, 2],
"max_frames_allowed_after_keyword_detected":14
}
}
}
}

Ein Untergraph kann in vielen Apps wiederverwendet werden. Tatsächlich wird der Navigationsstack von isaac als Untergraph verwendet.

Teil 4:Isaac-Apps auf EV3 ausführen

Der Treiber (jetson-ev3/packages/ev3/BUILD) reagiert auf dieselben Befehle wie der Segway RMP-Basistreiber. Das bedeutet, dass es mit vielen Apps funktioniert, die auf Kaya oder Carter funktionieren, was es zu einer dritten Option und viel billiger macht!

Ich habe einige der Apps angepasst, die erstellt wurden, um die Bots Carter und Kaya zu präsentieren:

Teil 5:Odometrie

Für das Fahren im autonomen Modus ist eine gute Odometrie wichtig. Dies wird verwendet, um die Position des Roboters im Zeitverlauf abzuschätzen. Lass es uns mit der ev3-App anpassen:

[email protected]:~/ml/jetson-ev3$ ./engine/build/deploy.sh --remote_user andrei -p //apps/ev3:ev3 -pkg -d jetpack43 -h 192.168.0.173

[email protected]:~$ brickrun ./ev3_control_server ev3dev.local:9000

[email protected]:~/deploy /andrei/ev3-pkg$ ./apps/ev3/ev3 --graph ./apps/assets/maps/map.graph.json --config ./apps/assets/maps/map.config.json

Wir müssen zwei Dinge schätzen:

Die Formeln für Linear- und Winkelgeschwindigkeiten lauten:

Die Winkelgeschwindigkeit zu finden ist einfach:ist die Differenz des rechten und linken Motors geteilt durch die Basislänge.

Das Ermitteln der Lineargeschwindigkeit ist etwas komplexer. Wir haben 3 Fälle:

Winkelgeschwindigkeitsexperiment:

Wir werden die manuelle Steuerung verwenden, um den Roboter um 360 Grad zu drehen. Dies geschieht, indem der linke und der rechte Motor mit entgegengesetzten Geschwindigkeiten bewegt werden. Wenn wir die Geschwindigkeiten beider Motoren kennen, können wir die Winkelgeschwindigkeit berechnen.

Versuchen wir es:

Winkel- und Lineargeschwindigkeitsexperiment:

Ich werde den Panzer herumfahren und am Ende versuchen, ihn wieder an den Startort zu bringen. Die Odometriedaten sollten am Ende so nah wie möglich an 0 liegen, wenn wir die Geschwindigkeiten richtig berechnen.

Teil 6:Alles zusammenbringen

Ok, wir sind so weit gekommen, nur einen teuren RC-Panzer zu haben? Nein, wir können jetzt all die verschiedenen Teile von Isaac verwenden. Zum Beispiel Sprachbefehle ausgeben und den Roboter dazu bringen, sich autonom zu bewegen. Ein Beispiel dafür finden Sie in der voice_control.

Es verwendet die Audio- und Machine-Learning-Edelsteine ​​von Isaac. Was ist ein Edelstein? Im Handbuch heißt es:„GEMs:Eine Sammlung von Robotik-Algorithmen von der Planung bis zur Wahrnehmung, die meisten davon GPU-beschleunigt.“

Ich habe mein eigenes RNN trainiert, indem ich die in dieser Anleitung beschriebenen Schritte befolgt habe. Stellen Sie nur sicher, dass Sie über viele Daten verfügen, insbesondere für den Fall unbekannte Schlüsselwörter/Stille/zufälliges Rauschen.

Ich habe meinem beigebracht, 3 Wörter zu erkennen:„Jetson“, „links“ und „rechts“. Das gespeicherte Modell finden Sie hier. Mit diesen 3 Wörtern können wir 2 Befehle zusammensetzen:„jetson left“ und „jetson right“.

Der Erkennungsteil wird hier in einem eigenen Unterdiagramm beschrieben, das sofort verwendet und wiederverwendet werden kann.

Im Grunde hört es auf das Mikrofon und wenn einer der Befehle aufgenommen wird, wird eine voice_command_id ausgegeben. Es verwendet dafür das zuvor trainierte RNN.

Wir können diesen erkannten_Befehl nehmen und an unser eigenes Codelet übergeben:

{
"source":"voice_detection.subgraph/interface/detected_command",
"target":"voice_control_components/goal_generator/detected_command"
}

aus dem Codelet können wir ein Ziel generieren und veröffentlichen:

auto proto =rx_detected_command().getProto();
int id =proto.getCommandId();
auto goal_proto =tx_goal(). initProto();
goal_proto.setStopRobot(true);
goal_proto.setTolerance(0.1);
goal_proto.setGoalFrame("robot");
ToProto(Pose2d::Rotation( 90), goal_proto.initGoal());
tx_goal().publish();

Damit wird das Ziel gesetzt, den Roboter um 90 Grad nach links zu drehen. Wir können unterschiedliche Ziele in verschiedenen Rahmen setzen. Es könnte sein, auf eine Koordinate im Rahmen „Welt“ zu gehen, wie die Koordinaten der Küche. Es könnte eine Pose2::Translate(1.0, 0) im Roboterrahmen gesetzt haben, um den Roboter um 1 Meter vorzurücken.

Und von dort geben wir das Ziel an den Global Planner weiter.

{
"source":"voice_control_components/goal_generator/goal",
"target":"navigation.subgraph/interface/goal"
}

Wo all die Magie passiert:

Leider funktioniert es nur im 10 W Modus, nicht 5 W, was für meinen Akku etwas zu viel ist. Im 5W-Modus dauert die Inferenz zu lange:

Ich habe es mit kleineren RNNs versucht und von 2 verfügbaren CPU-Kernen (nvpmodel -m 1) auf 3 erhöht, aber nicht viel geholfen. Die Zeit für die Inferenz wurde auf 30 ms verkürzt, was für genaue Ergebnisse immer noch zu lang ist.

Teil 7:Kartierung

Um eine Karte zu erstellen, müssen wir eine Instanz von Isaac auf Jetson und eine auf dem Hostcomputer ausführen. Das Mapping erfordert viele Ressourcen, mehr als Jetson Nano verarbeiten kann.

[email protected]:~/ml/jetson-ev3$ ./engine/build/deploy.sh --remote_user andrei -p //apps/ev3:gmapping_distributed_ev3 -pkg -d jetpack43 -h 192.168.0.218

[email protected]:~/deploy/andrei/gmapping_distributed_ev3-pkg$ ./apps/ev3/gmapping_distributed_ev3

[email protected]:~/ml/jetson-ev3$ bazel run apps/ev3:gmapping_distributed_host

Vergessen Sie nicht, die Datei apps/ev3/gmapping_distributed_host.app.json mit Ihrer Jetson-IP zu ändern:

"tcp_subscriber":{
"isaac.alice.TcpSubscriber":{
"port":5000,
"host" :"192.168.0.218"
}
}

Quelle:Autonomer Panzer


Herstellungsprozess

  1. KI für autonomes Fahren für Donkey Car Garbage Collector
  2. Panzertag 23:Reichweite und Peilung
  3. JQR vierbeiniger autonomer Roboter
  4. Vorbereitung auf eine autonome Zukunft
  5. CNC-gefrästes Kampfpanzermodell
  6. Autonomer Roboter öffnet Türen
  7. Autonome Monteure montieren
  8. Was ist ein Reservetank?
  9. Sicherheitstipps für das Schweißen von Kraftstofftanks
  10. Wie behebe ich ein Gasleck in meinem Auto?