Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

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:

Mengapa Isaac SDK dan bukan ROS?

Mengapa bagian Lego?

Memilih jalur ini memang menimbulkan beberapa tantangan:

BAGIAN 1:Memulai

1. Isaac SDK

2. Pengenalan suara (opsional)

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 
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


Proses manufaktur

  1. AI Pengemudi Otomatis untuk Pengumpul Sampah Mobil Keledai
  2. Tank Hari 23:Jangkauan dan Bantalan
  3. Robot Otonom Berkaki Empat JQR
  4. Mempersiapkan masa depan yang mandiri
  5. Model Tank Tempur mesin CNC
  6. Robot Otonom Membuka Pintu
  7. Perakitan Otonom Merakit
  8. Apa yang dimaksud dengan Tangki Cadangan?
  9. Tips Keamanan untuk Pengelasan Tangki Bahan Bakar
  10. Bagaimana cara memperbaiki kebocoran gas di mobil saya?