Robot Troli 2.0. Bagian 1. Navigasi otonom dari robot rumahan berdasarkan ROS

Proyek ini dibangun atas dasar proyek terkenal lainnya di lingkarannya - linorobot (linorobot.org), menggunakan komponen yang tersedia untuk orang awam yang sederhana. Tujuan yang ditetapkan: untuk mencapai gerakan otonom robot di rumah menggunakan komponen biaya rendah, untuk mengevaluasi kinerja mini-PC untuk tujuan yang dinyatakan, untuk mengkonfigurasi tumpukan navigasi untuk bergerak di ruang sempit Khrushchev.



Besi


Daftar komponen dalam padatan adalah sebagai berikut:

  • raspberry pi 3b - 2800 r .;
  • lidar rplidar a1 - 7500 p .;
  • jembatan daya l298n -2pcs - 400 gosok;
  • wheelset dengan encoders tipe A dan B - 2000 r. (210 rpm - tautan )
  • teenzy 3.2 - 2100 r.;
  • imu 9250 (baik 9150 atau 6050) - 240 p .;
  • bank daya pada 10000mH - 1500 r.
  • 3 baterai 18650 dan dudukan -600 p.
  • konverter step-down dc-dc c 5V ke 3.3V - 20p.
  • sepotong kayu lapis, parket -? menggosok.

Total: 17160 p.

* Biaya dapat dikurangi dengan mengganti teenzy dengan arduino mega 2560 (600 p.), Dan Lidar dengan mengganti kinect v.1 (1000 p.):



Namun, perlu dicatat bahwa kinect pertama memiliki visibilitas minimum (area buta) 0,5 m, yang dapat mempengaruhi navigasi secara negatif dalam kondisi sempit dan agak besar. Lidar memiliki zona buta kurang dari 0,2 m. Kinect v.2 tidak akan cocok dengan raspberry 3b (tidak ada usb 3.0). Arduino mega lebih rendah dari ukuran teenzy (dan beberapa karakteristik), selain itu, Anda harus sedikit mengolah kode.

Secara umum, "desain" terlihat seperti ini:





Tidak ada keindahan di sini, tentu saja, tetapi ini bukan tentang itu.

Selain robot itu sendiri, sangat diinginkan untuk memiliki PC eksternal di mana cangkang grafis untuk memvisualisasikan tindakan robot (rviz, gazebo) akan diluncurkan.

Perakitan robot


Itu dilukis secara rinci di situs web proyek - tautan , jadi mari kita membahas poin-poin yang menyebabkan kesulitan. Pertama, Anda perlu mempertimbangkan bahwa enkoder pada wheelset didukung oleh 3.3V dan, ketika 5V diterapkan, gagal dengan sempurna.

Skrip instalasi linorobot berhasil diinstal di ubuntu 16.04, ubuntu 18.04. Versi ROS: ROS kinetic atau ROS melodic. Pada raspberry 3b, Anda harus terlebih dahulu membuat file swap.

Kode teenzy utama ada di sepanjang jalan:

roscd linorobot/teensy/firmware/lib/config
nano lino_base_config.h

Dan dituangkan ke dalamnya dengan perintah:

roscd linorobot/teensy/firmware
platformio run --target upload

Kumpulan perintah di atas akan digunakan cukup sering, jadi masuk akal untuk menambahkannya ke alias.

Karena kesulitan dalam merakit robot, korelasi yang benar dari kontak yang terhubung dari l298n ke teenzy bisa menyusahkan. Meskipun diagram koneksi sangat jelas, roda dapat berperilaku berbeda dan harus bereksperimen, memilih penugasan pin yang benar dalam kode.

Dalam kasus saya, ternyata seperti ini:

/// ENCODER PINS
#define MOTOR1_ENCODER_A 14
#define MOTOR1_ENCODER_B 15 

#define MOTOR2_ENCODER_A 11
#define MOTOR2_ENCODER_B 12 
//MOTOR PINS
#ifdef USE_L298_DRIVER
  #define MOTOR_DRIVER L298

  #define MOTOR1_PWM 21
  #define MOTOR1_IN_A 1
  #define MOTOR1_IN_B 20

  #define MOTOR2_PWM 5
  #define MOTOR2_IN_A 8
  #define MOTOR2_IN_B 6

Poin kedua adalah menentukan spesifikasi roda robot:

//define your robot' specs here
#define MAX_RPM 210               // motor's maximum RPM
#define COUNTS_PER_REV 1365       // wheel encoder's no of ticks per rev
#define WHEEL_DIAMETER 0.065       // wheel's diameter in meters
#define PWM_BITS 8                // PWM Resolution of the microcontroller
#define LR_WHEELS_DISTANCE 0.235  // distance between left and right wheels
#define FR_WHEELS_DISTANCE 0.30   // distance between front and rear wheels. Ignore this if you're on 2WD/ACKERMANN
#define MAX_STEERING_ANGLE 0.415  // max steering angle. This only applies to Ackermann st

RPM dapat ditemukan dalam spesifikasi roda, tetapi CPR (COUNTS_PER_REV) adalah nilai yang dihitung.
CPR = PPR x 4. PPR roda kami 341.

* PPR dapat dilihat dalam spesifikasi atau menjalankan kode pada linorobot roslaunch robot minimal. Jalankan dan putar roda 360 derajat. PPR akan sama dengan nilai numerik yang akan ditampilkan di layar setelah rotasi roda:



* PPR = abs (RECENT_COUNT - INITIAL_COUNT).

Jadi CPR = 1364. Anda juga perlu mengatur WHEEL_DIAMETER dan LR_WHEELS_DISTANCE dalam meter. Selain itu, LR_WHEELS_DISTANCE adalah jarak antara poros tengah roda, dan bukan dari ujung ke ujung. Indikator lain dapat diabaikan jika robot itu roda dua, diferensial (bukan omni).

Poin ketiga yang dapat menyebabkan kesulitan - imu kalibrasi. Untuk melakukan ini, dengan mengikuti instruksi, perlu untuk memperbaiki robot di posisi tertentu. Petunjuk akan berada dalam kode ketika mengeksekusi skrip do_calib imu_calib rosrun :



setelah selesai imu_calib.yaml dengan pengaturan akan dihasilkan.

Lebih baik melakukan kalibrasi, meskipun ada file default dengan pengaturan imu.
* Selain itu, ternyata kalibrasi imu dapat mempengaruhi arah pergerakan robot melalui teleop (kiri bukan kanan dan sebaliknya, sedangkan gerakan bolak-balik itu benar). Situasi tidak diselesaikan dengan penataan ulang pin dalam kode. Imu sendiri telah diperbaiki dan dikalibrasi dengan kurung terbalik, seperti diperbaiki di bagian belakang pangkalan robot. (Imu) lanjutnya flip tanpa kalibrasi ulang menyelesaikan masalah.

Poin keempat - kal pid.

Di situs web proyek, prosedur untuk bagaimana menerapkan penyesuaian dijelaskan secara rinci - tautan .

Namun, akan sulit bagi pemula untuk mencari tahu apa itu dan bagaimana bekerja dengannya. Secara umum, regulasi pid diperlukan untuk memastikan bahwa robot bergerak secara seragam, tanpa menyentak / mendadak pengereman. Tiga parameter bertanggung jawab untuk ini: p, i, d. Nilai-nilainya terkandung dalam kode utama yang diunggah ke teenzy:

#define K_P 2.0 // P constant angle
#define K_I 0.3 // I constant
#define K_D 0.1 // D constant

Anda dapat bereksperimen dengan mereka dengan menjalankan robot:

roslaunch linorobot minimal.launch

Selanjutnya pada PC eksternal di tiga terminal berbeda:

rosrun lino_pid pid_configure
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
rqt

Dengan memindahkan slider p, d, i di terminal rqt, dan kemudian mengendalikan robot di terminal teleop_twist_keyboard, Anda dapat mencapai hasil yang diperlukan tanpa harus mengunduh kode dengan parameter pid baru setiap kali di teenzy:



Yaitu, semuanya terjadi dengan cepat dan saat itu di firmware teenzy mungkin memiliki arti yang sangat berbeda. * Anda tidak dapat fokus pada grafik, karena secara visual, dan itu akan dipahami BAGAIMANA robot bepergian.

Mereka merekomendasikan untuk memulai dengan mengatur nilai p = 1.0, d = 0.1, i = 0.1. Dalam kasus kami, nilainya adalah sebagai berikut (diperoleh secara eksperimental) p = 2.0, i = 0,3, d = 0,1.

Selanjutnya, nilai-nilai ini harus ditetapkan dalam kode dan diisi teenzy.

Juga, jangan lupa untuk mengatur kode (DEBUG 0 dan bukannya DEBUG 1):

#define DEBUG 0

Odometri


Untuk orientasi robot dan navigasi selanjutnya, data lidar, imu dan data enkoder digunakan. Jika kalibrasi imu dilakukan dengan benar, lidar dipasang dengan benar, dan nilai-nilai encoder sudah benar, maka seharusnya tidak ada masalah dengan odometri.

Untuk memastikan odometry benar, Anda perlu sedikit naik robot melalui teleop dan melihat nilai-nilai dalam topik odom, ini ditulis pada halaman proyek - tautan .

Dan juga melihat ke dalam shell visual rviz:



Satu sel di rviz adalah 1 m, jadi disarankan bagi robot untuk melewati meteran ini baik dalam editor visual dan juga dalam bentuk barang.

Selain itu, jarak yang ditempuh ditampilkan dalam indikator w:



Ini juga harus cenderung 1 m.

Hal yang sama berlaku untuk sudut rotasi robot:



* Di rviz dan hidup, robot harus berputar pada sudut yang sama.

Odometry dari lidar didefinisikan dengan cara yang sama - sebuah tautan. Jarak dari lidar ke dinding terdekat baik hidup dan di rviz harus cocok.

TF


Dalam ROS, perhatian khusus diberikan pada transformasi - tf. Secara umum, konsep ini menggambarkan korelasi objek relatif satu sama lain dalam ruang. Agar objek tidak menggantung di udara, dan program memahami bagaimana mereka disajikan relatif satu sama lain, perlu memperhatikan pengaturan.

Dalam proyek ini, semua koneksi sudah dikonfigurasi relatif satu sama lain dan Anda hanya perlu menyesuaikan indikator, misalnya, menunjukkan bagaimana Lidar berada. Ini perlu bagi robot untuk memahami bahwa hambatan tidak muncul langsung di depannya, tetapi di depan lidar, yang dipisahkan dari pusat robot pada jarak tertentu.

Mari kita pergi ke direktori yang sesuai:

roscd linorobot/launch
nano bringup.launch

Pangkalan itu sendiri terletak pada jarak 0,065 m dari lantai:

<node pkg="tf_ros" type="static_transform_publisher" name="base_footprint_to_base_link" args="0 0 0.065 0 0 0  /base_footprint /base_link "/>

Di laser.launch, Anda perlu mengatur lokasi lidar relatif terhadap pusat basis robot:

roscd linorobot/launch/include
nano laser.launch

Dalam kasus saya, LIDAR digeser sepanjang sumbu x: -0,08, y: 0,04 dan "naik" di atas basis (sumbu z): 0,08m:

<node pkg="tf2_ros" type="static_transform_publisher" name="base_link_to_laser"
args="-0.08 0.04 0.08 0 0 0  /base_link /laser "/>

Di rviz, lokasi ini dapat diamati secara visual:



Meskipun tidak jauh dari Lidar, kami akan menyesuaikan frekuensinya sehingga memberikan lebih banyak poin (secara default memberi 4k), ini akan membantu dalam membangun peta:

cd linorobot/launch/include/lidar
nano rplidar.launch

Tambahkan parameter:

<param name="scan_mode"  type="string" value="Boost"/>

dan berubah

<param name="angle_compensate"    type="bool"   value="false"/>

Sekarang 8k siap membantu kami: Lokasi



fisik Lidar pada robot juga penting:



Membangun peta ruang 2d


Di situs web proyek diusulkan untuk membangun peta ruang dengan meluncurkan di dua terminal:

roslaunch linorobot bringup.launch
roslaunch linorobot slam.launch

Namun, praktik telah menunjukkan bahwa slam, yang datang dengan proyek secara default, menolak untuk bekerja ketika mode lidar adalah 8k:



sementara dalam mode 4k, kartunya tidak terlalu sukses, mereka sangat berisik.

Karena itu, lebih baik menggunakan slam lain - hector-slam.

Cara menginstalnya ditunjukkan di sini .

Setelah instalasi, prosedur untuk membuat peta akan sama, tetapi alih-alih roslaunch linorobot slam.launch, jalankan roslaunch my_hector_mapping my_launch.launch

Maps lebih bersih, tetapi kemudian mereka lebih baik untuk memodifikasi dalam editor grafis, menghapus yang tidak perlu, terutama jika tutup bertabrakan dengan cermin ketika membangun peta. :



Jangan lupa untuk menyimpan peta kamar:

rosrun map_server map_saver -f my-map

* Peta lebih baik diperoleh di senja yang menyenangkan, ini akan memeras maksimal dari anggaran Lidar.

Bersambung.

All Articles