Tangki Otonom
Menambahkan alternatif yang jauh lebih murah ke referensi desain Carter dan Kaya menggunakan set Lego EV3.
Dalam proyek ini, saya akan mendokumentasikan konstruksi kendaraan lacak yang dibuat dengan suku cadang dan motor Lego Technic, disempurnakan dengan LiDAR dan dikendalikan oleh papan Jetson Nano yang menjalankan Isaac SDK terbaru. Lompat ke Bagian 8 atau 10 untuk demo lengkap navigasi otonom.
Proyek ini terdiri dari komponen-komponen berikut:
- A NVIDIA Jetson Nano dev board – menjalankan Mesin Robot Isaac
- Sebuah Batu EV3 – mengontrol motor (tersedia di EV3 31313 Robot Kit )
- Basis yang dilacak – dibuat menggunakan suku cadang Lego Technic dan dua motor besar (semua yang diperlukan tersedia di EV3 31313 Robot Kit )
- YDLIDAR x4 LiDAR
- Pixy2 Kamera untuk penglihatan
Mengapa Isaac SDK dan bukan ROS?
- Ada begitu banyak tutorial untuk ROS (Sistem Operasi Robot) tetapi hampir tidak ada untuk Isaac (selain dari SDK itu sendiri)
- Tampaknya menjadi pilihan yang lebih baik untuk Jetson Nano (dibuat untuk keluarga perangkat keras ini)
- Algoritme robotika tingkat lanjut mulai dari perencanaan hingga persepsi, sebagian besar dipercepat GPU . Ini adalah bagian penting. Tanpa akselerasi GPU, Jetson Nano sama sekali tidak berbeda dengan board Raspberry Pi 4
- IsaacSim Unity3D lebih fotorealistik daripada Gazebo yang akan meningkatkan hasil dari simulasi ke kenyataan
Mengapa bagian Lego?
- Aku punya banyak
- Suku cadangnya berkualitas tinggi (servo bagus)
- Saya tidak punya printer 3D (meminta teman untuk mencetak casing Jetson Nano yang kompatibel dengan Lego tapi itu satu-satunya bagian yang dicetak 3D)
- Tidak perlu menyolder
Memilih jalur ini memang menimbulkan beberapa tantangan:
- Perangkat keras Lego tidak didukung oleh Isaac SDK. Hanya ada dua robot referensi: Carter dan Kaya. Bahkan JetBot tidak didukung.
- Isaac SDK hanya dapat bekerja dengan komponen perangkat keras dalam jumlah terbatas
- Mengkompilasi untuk 3 target (x86-64, arm64 dan armv5tejl)
- Tidak semuanya open-source
BAGIAN 1:Memulai
1. Isaac SDK
- Lakukan langkah-langkah yang dijelaskan di sini
- Coba jalankan beberapa contoh yang disediakan di Isaac SDK untuk memeriksa apakah semuanya berfungsi
- Pastikan Anda menggunakan versi SDK 2019.3!!!
2. Pengenalan suara (opsional)
- Instal CUDA 10.0, CUDNN 7.6.3, dan TensorRT 6.0
- Instal TensorFlow 1.15.0 (percepatan perangkat keras)
3. Gambar Ev3dev
Unduh dan flash gambar terbaru untuk EV3 (ev3dev-stretch) pada kartu microSD atau microSDHC. Format MicroSDXC tidak didukung oleh EV3 brick.
4. Kompiler lintas ARM untuk ev3dev
$ sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
Bagian ini sangat sulit untuk diatur dengan benar. Ubuntu 18.04 (komputer host dan Jetson Nano) menggunakan GLIBC_2.28 sementara ev3dev menggunakan Debian stretch dan GLIBC_2.24. Apa pun yang dikompilasi dengan konfigurasi kompiler arm-linux-gnueabi-g++ default bergantung pada GLIBC_2.28 dan tidak akan berjalan pada EV3. Penautan statis tidak berfungsi karena sesuatu yang lebih kompleks daripada hello world menyebabkan segfault. Solusi yang saya temukan adalah menautkan semuanya secara dinamis kecuali perpustakaan matematika. Anda dapat menemukan info lebih lanjut di file jetson-ev3/toolchain/CROSSTOOL. Solusi lain adalah dengan menggunakan gambar buruh pelabuhan dari Debian 9.
5. Ruang kerja Jetson + EV3
$ git clone https://github.com/andrei-ace/jetson-ev3.git
- Edit jetson-ev3/WORKSPACE dan setel jalur ke Isaac SDK.
local_repository(
name ="com_nvidia_isaac",
path ="/home/andrei/ml/isaac"
)
- Edit jetson-ev3/toolchain/CROSSTOOL dan setel jalur ke direktori tempat file ini berada.
# edit dengan jalur Anda ke rantai alat
linker_flag:"-L/home/andrei/ml/jetson-ev3/toolchain"
6. Hubungkan Jetson Nano dengan EV3
Di bagian selanjutnya saya akan memposting banyak perintah Linux. Karena ada tiga sistem yang terlibat, saya akan mempostingnya persis seperti yang terlihat di terminal saya, artinya:
[email protected]:~/ml/jetson-ev3$ #ini dijalankan di PC saya
[email protected]:~$ #ini aktif Jetson Nano
[email protected]:~$ $ #this in on EV3
IP Jetson Nano saya adalah 192.168.0.173 (Ethernet) dan 192.168.0.218 (WiFi), jadi setiap kali Anda melihat perintah yang menggunakan nilai tersebut, gantilah dengan milik Anda.
Saya menggunakan kabel USB A ke mini untuk menghubungkan papan Jetson dengan EV3 brick menggunakan langkah-langkah ini.
Coba ssh dari papan Jetson:
[email protected]:~$ ssh [email protected]
Kata sandi default adalah pembuat.
7. Tutorial pingpong
Isaac memiliki tutorial yang menjelaskan Codelet yang sangat sederhana. Saya sarankan melakukan tutorial ini terlebih dahulu. Ini akan memperkenalkan Anda pada konsep yang diperlukan untuk membangun aplikasi apa pun yang berjalan di Isaac.
Sekarang, buka direktori jetson-ev3/apps/ev3/ping_pong/ . Ini adalah versi modifikasi dari tutorial sebelumnya, dengan twist, kami akan mengirimkan ping ke EV3 brick.
Sebagian besar file sudah familiar dari tutorial sebelumnya. Kami akan menggunakan Cap’n Proto RPC untuk panggilan antara Jetson dan EV3. Cap'n Proto banyak digunakan untuk komunikasi antara berbagai komponen Isaac sehingga masuk akal untuk menggunakannya di sini. Untuk ini kita memerlukan beberapa file baru:
- jetson-ev3/apps/ev3/ping_pong/ping.capnp – ini mendefinisikan antarmuka antara klien, yang akan berjalan di Isaac Robot Engine, dan server, yang akan berjalan di EV3.
- jetson-ev3/apps/ev3/ping_pong/PongEv3Server.cpp ini adalah server yang berjalan pada EV3 brick
- jetson-ev3/apps/ev3/ping_pong/Pong.cpp ini diubah untuk memanggil server Pong yang berjalan di EV3
Kompilasi server ev3_pong:
[email protected]:~/ml/jetson-ev3$ bazel build --config=ev3dev //apps/ev3/ping_pong:ev3_pong
Salin ke EV3 menggunakan scp dulu ke Jetson lalu ke EV3.
Buat dan terapkan contoh ping-pong ke Jetson:
[email protected]:~/ml/jetson-ev3$ /engine/build/deploy.sh --remote_user -p //apps/ev3/ping_pong:ping_pong-pkg -d jetpack43 -h
Informasi selengkapnya tentang cara menerapkan dan menjalankan aplikasi Anda di Jetson di sini.
Jalankan kedua aplikasi:
[email protected]:~$ ./ev3_pong ev3dev.local:9999
[email protected]:~/deploy/andrei/ping_pong-pkg$ . /apps/ev3/ping_pong
Jika semuanya berfungsi, Anda akan mendengar pesan yang dikirim oleh komponen Ping ke speaker EV3.
8.Mengendalikan motor dari Isaac
Prinsipnya sama, hanya sedikit lebih rumit. Saya menggunakan tutorial Isaac lainnya untuk berinteraksi dengan motor EV3:
Tutorial menggunakan basis RMP Segway. Karena saya tidak memilikinya atau $ 10.000 untuk membelinya, saya membuat driver yang akan mengontrol motor EV3. Kodenya ada di sini.
Server yang berjalan di EV3 ada di sini dan dapat dibuat dan dijalankan dengan perintah berikut:
[email protected]:~/ml/jetson-ev3$ bazel build --config=ev3dev //packages/ev3/ev3dev:ev3_control_server
[email dilindungi]:~$ ./ev3_control_server ev3dev.local:9000
Saya menggunakan joystick virtual dari Sight seperti yang dijelaskan di sini.
9.DifferentialBase untuk EV3
Server Ev3ControlServer akan menanggapi 2 panggilan:
- command(cmd :Control) – mengambil kecepatan linier dan sudut sebagai parameter dan mengontrol kedua motor untuk mencapai kecepatan yang diminta
- status() -> (status :Dinamika); – mengembalikan kecepatan linier dan sudut robot yang sebenarnya
Kinematika dijelaskan lebih detail di sini dan di sini.
Saya menggunakan aplikasi sampel proportional_control_cpp untuk menggerakkan robot 1 m dan melaporkan data Odometri (kecepatan linier dan sudut) EV3 dalam pulsa putar (jumlah tacho) per detik. Menggunakan jarak perjalanan yang dihitung (oleh Isaac) dan mengukur jarak sebenarnya, saya mendapatkan konstanta untuk menyesuaikan nilai yang dilaporkan sehingga cocok dengan hasil sebenarnya. Ini bekerja dengan baik dan hasilnya dapat direproduksi berkali-kali dan tidak hanya dalam garis lurus. Anda juga dapat menghitung nilai ini dengan menggunakan jari-jari roda (atau lintasan dalam kasus kami).
Bagian 2:Membangun robot
Basisnya sangat mirip dengan EV3 Track3r Lego, salah satu model resmi untuk kit EV3: https://www.lego.com/biassets/bi/6124045.pdf
Kasing untuk Jetson Nano berasal dari sini: https://github.com/3D-printable-lego-technic/PELA-blocks
Bagian 3:Aplikasi Isaac
Aplikasi Isaac terdiri dari tiga bagian utama:
- graph – node:Bagian ini mendefinisikan semua komponen yang membuat aplikasi. Sebuah node juga dapat berupa grafik lain yang didefinisikan dalam file lain. Node “deteksi_suara” dari contoh adalah subgraf.
- graph – edge:Bagian ini mendefinisikan aliran pesan antar node. Tepi memiliki sumber dan target. Misalnya perintah yang terdeteksi dari node “voice_detection” (subgraf) akan dikirim ke komponen yang menghasilkan tujuan.
- konfigurasi – bagian ini mengonfigurasi simpul grafik
Contoh aplikasi:
{
"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 ":{
"address":"ev3dev.local",
"port":9000
}
},
"navigation.imu_odometry.odometry":{
"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":{
"Deteksi Perintah Suara":{
"renderer":"plot" ,
"redup":{
"width":400,
"height":200
},
"channels":[
{
"name":"voice_control/voice_detection.voice_command_detector/isaac.audio.VoiceCommandConstruction/voice_command_id",
"aktif":true
}
]
}
}
}
}
},
"navigation.shared_robot_model":{
"SphericalRobotShapeComponent":{
"circles":[
{ "pusat":[0.0, 0.0], "jari-jari":0,075 },
{ "pusat":[0.02, 0.03464], "jari-jari":0,055 },
{ "pusat":[0.02, -0.03464], "jari-jari":0,055 },
{ "pusat":[-0,04, 0,0], "jari-jari":0,055 },
{ "pusat":[0,0525, 0,09093 ], "jari-jari":0,035 },
{ "pusat":[0,0525, -0,09093], "jari-jari":0,035 },
{ "pusat":[-0,105, 0,0], "jari-jari ":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",
"komponen":[
{
"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",
"subgraf":"@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"
}
]
}
}
Contoh subgraf:
{
"modules":[
"@com_nvidia_isaac//packages/audio",
"@com_nvidia_isaac//packages/ ml:tensorflow"
],
"graph":{
"nodes":[
{
"name":"subgraph",
" komponen":[
{
"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",
"components":[
{
" 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"
}
]
}
],
"tepi" :[
{
"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
}
}
}
}
Subgraf dapat digunakan kembali di banyak aplikasi. Faktanya, tumpukan navigasi isaac digunakan sebagai subgraf.
Bagian 4:Menjalankan Aplikasi Isaac di EV3
Driver (jetson-ev3/packages/ev3/BUILD) merespons perintah yang sama seperti driver dasar RMP Segway. Artinya, ini akan bekerja dengan banyak aplikasi yang bekerja di Kaya atau Carter, menjadikannya opsi ketiga dan jauh lebih murah!
Saya mengadaptasi beberapa aplikasi yang dibuat untuk menampilkan bot Carter dan Kaya:
- aplikasi joystick – ini mengontrol robot DifferentialBase dengan joystick. Ini memiliki LiDAR untuk menghasilkan peta lokal
- pemetaan terdistribusi: ev3 dan host dari robot Kaya – ini memungkinkan untuk membuat GMap menggunakan robot EV3 dan YDLIDAR X4.
- navigasi lengkap – Saya menambahkan subgrafik untuk perangkat keras dan navigasi 2D untuk robot EV3 sehingga dapat digunakan oleh aplikasi lain semudah menggunakan Carter atau Kaya.
Bagian 5:Odometri
Untuk berlari dalam mode otonom, penting untuk memiliki odometri yang baik. Ini digunakan untuk memperkirakan posisi robot dari waktu ke waktu. Mari kita sesuaikan menggunakan aplikasi ev3:
[email protected]:~/ml/jetson-ev3$ ./engine/build/deploy.sh --remote_user andrei -p //apps/ev3:ev3 -pkg -d jetpack43 -h 192.168.0.173
[dilindungi email]:~$ brickrun ./ev3_control_server ev3dev.local:9000
[dilindungi email]:~/deploy /andrei/ev3-pkg$ ./apps/ev3/ev3 --graph ./apps/assets/maps/map.graph.json --config ./apps/assets/maps/map.config.json
Kita perlu memperkirakan dua hal:
- kecepatan linier
- kecepatan sudut
Rumus untuk kecepatan linier dan sudut adalah:
Menemukan kecepatan sudut itu mudah:adalah selisih dari motor kanan dan kiri dibagi dengan panjang alasnya.
Menemukan kecepatan linier sedikit lebih rumit. Kami memiliki 3 kasus:
- ketika kedua kecepatan motor sama – kecepatan linier sama dengan kecepatan kanan (dan kecepatan kiri)
- ketika kecepatan motor kiri berlawanan dengan kecepatan motor kanan, kecepatan linier adalah 0, tangki akan berputar di tempat
- ketika kecepatan motor kiri adalah 0 (kasus yang dijelaskan di sebelah kanan). Kecepatan linier adalah setengah dari kecepatan yang tepat (pusat robot bergerak pada busur yang lebih kecil).
Eksperimen kecepatan sudut:
Kami akan menggunakan kontrol manual untuk memutar robot 360 derajat di tempat. Ini dilakukan dengan menggerakkan motor kiri dan kanan dengan kecepatan yang berlawanan. Dengan mengetahui kecepatan kedua motor, kita dapat menghitung kecepatan sudut.
Mari kita coba:
Eksperimen kecepatan sudut dan linier:
Saya akan mengemudikan tangki, dan pada akhirnya mencoba mengembalikannya ke lokasi awal. Data odometri harus sedekat mungkin dengan 0 di akhir jika kita menghitung kecepatannya dengan benar.
Bagian 6:Mengumpulkan semuanya
Ok, jadi sejauh ini kita hanya memiliki tangki RC yang mahal? Tidak, kita bisa menggunakan semua bagian yang berbeda dari Isaac sekarang. Mengeluarkan perintah suara misalnya dan membuat robot bergerak secara mandiri. Periksa kontrol_suara untuk contohnya.
Ini menggunakan permata pembelajaran audio dan mesin dari Isaac. Apa itu permata? Sebagaimana dinyatakan dalam manual:“PERMATA:Kumpulan algoritme robotika mulai dari perencanaan hingga persepsi, sebagian besar dipercepat GPU.”
Saya melatih RNN saya sendiri dengan mengikuti langkah-langkah yang dijelaskan dalam tutorial ini. Pastikan Anda memiliki banyak data, terutama untuk kasus kata kunci/keheningan/gangguan acak yang tidak diketahui.
Saya melatih saya untuk mengenali 3 kata:"jetson", "kiri" dan "kanan". Anda dapat menemukan model yang disimpan di sini. Dengan 3 kata ini kita dapat membuat 2 perintah:“jetson left” dan “jetson right”.
Bagian deteksi dijelaskan di sini, dalam subgrafnya sendiri, siap digunakan dan digunakan kembali.
Pada dasarnya apa yang dilakukannya adalah mendengarkan mikrofon dan jika salah satu perintah diambil, ia akan mengeluarkan voice_command_id. Ia menggunakan RNN yang telah dilatih sebelumnya untuk itu.
Kita dapat mengambil perintah_deteksi itu dan meneruskannya ke Codelet kita sendiri:
{
"source":"voice_detection.subgraph/interface/detected_command",
"target":"voice_control_components/goal_generator/detected_command"
}
dari Codelet kami dapat membuat Sasaran dan memublikasikannya:
proto otomatis =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();
Ini menetapkan tujuan untuk memutar robot ke kiri dengan 90 derajat. Kita dapat menetapkan tujuan yang berbeda dalam bingkai yang berbeda. Bisa saja pergi ke koordinat dalam bingkai "dunia", seperti koordinat dapur. Itu bisa saja mengatur Pose2::Translate(1.0, 0) di bingkai robot untuk memajukan robot sejauh 1 meter.
Dan dari sana kami meneruskan tujuan ke Perencana Global.
{
"source":"voice_control_components/goal_generator/goal",
"target":"navigation.subgraph/interface/goal"
}
Di mana semua keajaiban terjadi:
Sayangnya itu hanya akan bekerja dalam mode 10 W, bukan 5 W, yang terlalu banyak untuk baterai saya. Dalam mode 5W, inferensi terlalu lama:
Saya mencoba dengan RNN yang lebih kecil dan meningkatkan dari 2 core cpu yang tersedia (nvpmodel -m 1) menjadi 3 tetapi tidak banyak membantu. Ini mengurangi waktu menjadi 30 md untuk inferensi, masih terlalu lama untuk hasil yang akurat.
Bagian 7:Pemetaan
Untuk membuat peta, kita perlu menjalankan satu instance Isaac di Jetson dan satu lagi di komputer host. Pemetaan membutuhkan banyak sumber daya, lebih dari yang dapat ditangani Jetson Nano.
[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
[dilindungi email]:~/deploy/andrei/gmapping_distributed_ev3-pkg$ ./apps/ev3/gmapping_distributed_ev3
[email protected]:~/ml/jetson-ev3$ bazel run apps/ev3:gmapping_distributed_host
Jangan lupa ganti file apps/ev3/gmapping_distributed_host.app.json dengan IP Jetson Anda:
"tcp_subscriber":{
"isaac.alice.TcpSubscriber":{
"port":5000,
"host" :"192.168.0.218"
}
}
Sumber:Tank Otonom