Posting dalam seri:
8. Kami mengontrol dari ponsel-ROS Control, GPS-node7. Lokalisasi robot: gmapping, AMCL, titik referensi pada peta kamar6. Odometri dengan enkoder roda, peta ruang, lidar5. Kami bekerja di rviz dan gazebo: xacro, sensor baru.4. Buat simulasi robot menggunakan editor rviz dan gazebo.3. Mempercepat, mengganti kamera, memperbaiki gaya berjalan2. Perangkat Lunak1. BesiTerakhir kali, setelah memasang anggaran Lidar RPlidar-A1, kami berhasil membangun peta ruang, bekerja dengan odometri. Namun, robot, meskipun memiliki kartu dan menyesuaikan odometri dari sensor optik, masih merasa tidak aman di lingkungan.
Sebaliknya, dia tidak melihatnya sama sekali. Dan dia mengendarai sepanjang peta yang sudah selesai jauh dan luas, rintangan bukan untuknya. Ini membuat kita bahagia dan sedih pada saat bersamaan. Di satu sisi, jangan khawatir tentang hambatan dan bepergian ke mana pun yang diinginkan hati Anda, di sisi lain, tidak mungkin untuk pergi ke kamar lain atau ke dapur. Oleh karena itu, kita akan berbicara tentang pelokalan robot di ruang angkasa menggunakan algoritma yang disediakan ROS, dan juga set lidar dan encoders dari gentleman kita. Tapi sebelum kita langsung ke pelokalan, mari kita bicara tentang paket ROS lain, yang juga memungkinkan Anda untuk membangun peta 2D ruangan, dan kadang-kadang berfungsi lebih baik baginya daripada paket ROS dari pos sebelumnya. Mengenal gmapping.
Rm klan gmapping
Kami tidak akan asli dan kami akan menggunakan perkembangan dari artikel Habr yang sudah ada tentang topik tersebut, tetapi kami akan memperluas, memperbarui dan memperdalam informasi yang terkandung di dalamnya. Artikel itu disebut
Membangun Peta dan Melokalisasi Robot Seluler di ROS tanpa Odometry Menggunakan Laser_scan_matcher .
Bagian dari manipulasi (aplikasi yang sangat dimuat - rviz) akan dilakukan pada Komputer (di luar robot), sisanya (driver gerak, simpul peluncuran lidar) - pada Robot.
Pertama, instal laser_scan_matcher untuk ROS-kinetic di Komputer sesuai dengan skenario artikel di atas (artikel itu indigo):
sudo apt-get install ros-kinetic-laser-scan-matcher
Sekarang jalankan.
Mengangguk dengan Lidar pada Robot:
roslaunch rplidar_ros rplidar.launch
Di Komputer:
roslaunch laser_scan_matcher demo.launch
* Tidak perlu menjalankan roscore, karena master node mulai setiap kali Robot memuat.
Di rviz awal, kontur ruangan dan sampah di dalamnya akan terlihat:

kita perlu laser_scan_matcher untuk bekerja dengan paket ROS gmapping. Tidak perlu menginstal gmapping sendiri, itu sudah ada di mesin virtual sebagai bagian dari ROS Kinetic. Periksa paket di sistem:

Sekarang mari kita buat file peluncuran menggunakan gmapping di Komputer (bukan pada Robot), seperti pada artikel di atas ,:
roscd roscd rosbots_description/launch nano my_gmapping_launch.launch
kode <?xml version="1.0"?> <launch> <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 40" /> <node pkg="laser_scan_matcher" type="laser_scan_matcher_node" name="laser_scan_matcher_node" output="screen"> <param name="fixed_frame" value = "odom"/> <param name="use_odom" value="true"/> <param name="publish_odom" value = "true"/> <param name="use_alpha_beta" value="true"/> <param name="max_iterations" value="10"/> </node> <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> <param name="map_udpate_interval" value="1.0"/> <param name="delta" value="0.02"/> </node> </launch>
Seperti yang dapat Anda lihat dari kode, penulis memulai 3 node: tf, laser_scan_matcher dan gmapping.
Mari kita jalankan Lidar pada Robot lagi:
roslaunch rplidar_ros rplidar.launch
Di Komputer, file peluncuran yang baru dipanggang dan editor rviz:
roslaunch rosbots_description my_gmapping_launch.launch
rosrun rviz rviz
Di rviz kami mendapatkan gambar yang mirip dengan yang diperoleh saat membuat peta di pos kami sebelumnya tentang Robot Cart. Hanya kali ini paket gmapping berfungsi.
Dan saya harus mengakui, itu tidak bekerja dengan buruk. Jika hector_slam meninggalkan banyak artefak di peta ketika lidar berputar di sekitar sumbunya, kali ini hampir tidak ada artefak:

Setelah perjalanan di sekitar ruangan, peta yang dibangun juga disimpan:
rosrun map_server map_saver -f map-1
, di mana map-1 adalah nama peta yang akan disimpan.
Lokalisasi dengan amcl
Algoritma yang digunakan untuk menentukan lokasi robot pada peta disebut AMCL. AMCL menggunakan filter multi-partikel untuk melacak posisi robot di peta. Dalam robot kami, kami menggunakan paket ROS (http://wiki.ros.org/amcl) untuk mengimplementasikan AMCL.
Jalankan AMCL untuk robot kami.
Untuk melakukan ini, pada Komputer di folder proyek, buat file peluncuran lain.
Sebut saja dia
amcl-2.launch <launch> <param name="/use_sim_time" value="false"/> <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.0 0.0 0.0 0.0 0.0 0.0 /base_link /laser 40" /> <node pkg="laser_scan_matcher" type="laser_scan_matcher_node" name="laser_scan_matcher_node" output="screen"> <param name="fixed_frame" value = "odom"/> <param name="use_alpha_beta" value="true"/> <param name="max_iterations" value="10"/> </node> <node name="map_server" pkg="map_server" type="map_server" args="/home/pi/catkin_ws/src/rosbots_description/maps/map-3.yaml"/> <node pkg="amcl" type="amcl" name="amcl" output="screen" > <param name="odom_model_type" value="diff"/> <param name="odom_alpha5" value="0.1"/> <param name="transform_tolerance" value="0.2" /> <param name="gui_publish_rate" value="10.0"/> <param name="laser_max_beams" value="30"/> <param name="min_particles" value="500"/> <param name="max_particles" value="5000"/> <param name="kld_err" value="0.05"/> <param name="kld_z" value="0.99"/> <param name="odom_alpha1" value="0.2"/> <param name="odom_alpha2" value="0.2"/> <param name="laser_min_range" value="-1"/> <param name="laser_max_range" value="-1"/> <param name="odom_alpha3" value="0.8"/> <param name="odom_alpha4" value="0.2"/> <param name="laser_z_hit" value="0.5"/> <param name="laser_z_short" value="0.05"/> <param name="laser_z_max" value="0.05"/> <param name="laser_z_rand" value="0.5"/> <param name="laser_sigma_hit" value="0.2"/> <param name="laser_lambda_short" value="0.1"/> <param name="laser_lambda_short" value="0.1"/> <param name="laser_model_type" value="likelihood_field"/> <param name="laser_likelihood_max_dist" value="2.0"/> <param name="update_min_d" value="0.2"/> <param name="update_min_a" value="0.5"/> <param name="odom_frame_id" value="odom"/> <param name="base_frame_id" type="str" value="base_link" /> <param name="global_frame_id" type="str" value="map" /> <param name="resample_interval" value="1"/> <param name="transform_tolerance" value="0.1"/> <param name="recovery_alpha_slow" value="0.0"/> <param name="recovery_alpha_fast" value="0.0"/> <param name="use_map_topic" value="true" /> <param name="first_map_only" value="true" /> </node> </launch>
Kode ini benar-benar identik dengan artikel yang telah disebutkan, dengan pengecualian:
- mengecualikan node yang meluncurkan hokuyo lidar (ini berjalan pada Robot)
- jalur dan nama peta kamar berbeda (map-3.yaml)
Kode menjalankan 4 node:
- tf
- map_server
- laser_scan_matcher
- dll
Node amcl menggunakan peta yang diterbitkan map_server untuk pelokalan robot selanjutnya.
Jalankan file peluncuran dan lihat hasilnya.
Tetapi untuk Robot:
roslaunch rplidar_ros rplidar.launch
Di Komputer:
Terminal 1:
roslaunch rosbots_description amcl-2.launch
Terminal 2:
roslaunch rosbots_description rviz.launch
Setelah rviz dimulai, langkah selanjutnya dalam editor ini adalah sebagai berikut:- tambahkan tampilan ke rviz:
β’ LaserScan
β’ Peta
β’ PoseArray

- melokalkan robot pada tahap awal, karena ketika mulai amcl tidak tahu di mana robot dimulai dan di mana itu. Butuh "inisialisasi awal".
Untuk ini, di rviz Anda harus memilih "Perkiraan Pose 2D" dan gunakan panah hijau tepat di jendela tempat robot ditampilkan untuk menunjukkan posisinya:

Operasi ini harus dilakukan dengan memilih Frame "map" di rviz:

Di terminal kami mendapatkan koordinat (pose) robot:
[ INFO] [1572374324.454855505]: Setting pose (1572374324.454806): -0.014 -0.012 0.655
Anda dapat mengatur posisi robot di peta menggunakan panah hijau di peta berulang kali.
Sangat diinginkan bahwa data dari LIDAR (perbatasan merah) pada peta bertepatan atau dekat dengan lokasi aktual dinding ruangan:

Di jendela visualisasi rviz, kita mendapatkan karakteristik panah merah di sekitar robot *:

* sebagai robot, kami memiliki sumbu untuk kejelasan (seluruh model rviz yang dicat masih tersembunyi).
** Jika panah tidak muncul, maka Anda dapat mencoba untuk menghapus dan memeriksa kembali tampilan PoseArray yang ditambahkan ke rviz.
Terlepas dari kenyataan bahwa kami secara langsung ditunjukkan pada peta di mana robot berada, sistem masih mengasumsikan bahwa itu bisa di tempat-tempat di mana panah merah ditarik. Ini kemungkinan lokasi robot di peta. Sejumlah besar panah dan sebarannya di peta menunjukkan bahwa sistem masih belum tahu lokasi pasti dari robot. Namun, tempat penembak lebih padat, robot lebih cenderung.
Agar sistem lebih akurat memahami di mana robot itu berada, Anda perlu naik peta dengan menjalankan node yang menentukan lokasi robot. Kami memiliki dari set ini: LIDAR dan encoders.
Tetapi kami melakukan perjalanan di peta hanya dengan lidar yang diluncurkan, pada saat yang sama mencari tahu apakah mungkin untuk melokalkan robot secara andal hanya dengan bantuan (lidar).
-
naik robot di petaPada robot:
rosrun rosbots_driver part2_cmr.py
Di Komputer:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
Selama perjalanan, amcl akan mulai membaca topik / pemindaian, / peta, / tf dan mempublikasikan lokasi robot dalam topik / amcl_pose dan / particlecloud.
Saat Anda bepergian, Anda dapat mengamati bahwa jumlah anak panah berkurang dan mereka semakin mengembun di satu titik dengan lokasi sebenarnya dari robot:
Gambar menunjukkan bagaimana model berjalan (dalam bentuk pohon koneksi). Dan juga terlihat bahwa LIDAR tidak cukup akurat mengatasi lokalisasi pada batas-batas ambigu ruangan.
Apa arti parameter lain dalam kode simpul amcl?
Secara konvensional, mereka dibagi menjadi dasar (Umum), parameter filter (Filter), Parameter laser (lidar) (Parameter Laser).
Parameter kunci:- odom_model_type (default: "diff"): menentukan model odometry mana yang digunakan. Kami memiliki diff, yang berarti diferensial. Dapat diubah menjadi βomni,β βdiff-corrected,β atau βomni-corrected.β
- odom_frame_id (default: "odom"): mendefinisikan frame (baca topik) yang terkait dengan odometry. Biasanya diterbitkan dalam topik odom.
- base_frame_id (default: "base_link"): bingkai untuk basis robot.
- global_frame_id (default: "map"): bingkai peta, seperti yang dipetakan oleh server peta dalam peta topik
- use_map_topic (default: false): menentukan apakah peta akan dimuat melalui topik atau dengan memanggil layanan (kami ingat bahwa selain topik di ROS, ada juga layanan dan tindakan.
Parameter FilterOpsi ini memungkinkan Anda menyesuaikan cara kerja filter partikel.
- min_particles (default: 100): Menetapkan jumlah minimum partikel untuk filter. Kami memiliki 500.
- max_particles (default: 5000): Mengatur jumlah maksimum partikel untuk filter.
- kld_err (default: 0,01): Mengatur kesalahan maksimum yang diijinkan antara distribusi yang sebenarnya dan distribusi yang dihitung. Kami memiliki 0,05
- update_min_d (default: 0.2): Mengatur jarak linear (dalam meter) yang harus dilalui robot untuk memperbarui filter.
- update_min_a (default: pi / 6.0): Menetapkan jarak sudut (dalam radian) yang harus dipindahkan robot untuk memperbarui filter. Kami memiliki 0,5
- resample_interval (default: 2): Menyetel jumlah pembaruan filter yang diperlukan sebelum mengambil ulang. Kami punya 1.
- transform_tolerance (default: 0.1): Waktu (dalam detik) di mana transformasi yang dipublikasikan harus diberi tanggal untuk menunjukkan bahwa transformasi ini valid di masa mendatang.
- gui_publish_rate (default: -1.0): Kecepatan maksimum (dalam Hz) di mana pemindaian dan jalur diterbitkan untuk visualisasi. Jika nilai ini -1.0, fungsi ini dinonaktifkan. Kami punya 10.
Parameter laser (Lidar) (Parameter Laser)Parameter ini memungkinkan Anda untuk mengonfigurasi bagaimana amcl berinteraksi dengan laser lidar.
- laser_min_range (default: -1.0): Rentang pemindaian minimum untuk dipertimbangkan; -1.0 akan menggunakan rentang minimum yang ditentukan dalam laporan laser.
- laser_max_range (default: -1.0): Rentang pemindaian maksimum untuk dipertimbangkan; -1.0 akan menggunakan rentang laser maksimum.
- laser_max_beams (default: 30): Berapa banyak balok yang didistribusikan secara merata di setiap pemindaian akan digunakan saat memperbarui filter.
- laser_z_hit (default: 0.95): Bobot komponen z_hit pada model robot.
- laser_z_short (default: 0.1): Bobot komponen z_short dari model robot.
- laser_z_max (default: 0,05): Berat komponen z_max dari model robot.
- laser_z_rand (default: 0,05): Bobot komponen z_rand dari model robot.
Mari kita lihat apa yang mempengaruhi parameter min_particles dan max_particles. Jika Anda mengurangi nilainya, maka saat Anda meluncurkan file peluncuran, jumlah partikel dalam editor visual akan jelas kurang.
Semua parameter membawa beban semantik, tetapi sulit untuk mengurai efek mengubah masing-masing dalam kerangka artikel.
Poin referensi di peta kamar
Namanya menarik dan menyiratkan posisi robot di peta pada saat tertentu.
Untuk apa mereka? Untuk memahami bahwa robot datang dari titik A di ruangan ke titik B di dapur.
Data tentang posisi (pose) robot dapat diperoleh dengan simpul kerja amcl (apa yang dimulai pada artikel di atas).
Dan lihat di topik / amcl_pose:
rostopic echo -n1 /amcl_pose
* kunci n1 - untuk "memperbaiki" aliran pesan dalam topik.

Mari kita membuat layanan yang, ketika dipanggil, akan memberikan posisi (koordinat) robot sehingga setiap kali tidak melihat topik.
1. Buat paket ros baru.
cd catkin_ws/src catkin_create_pkg get_pose rospy cd get_pose/src
2. Di folder, buat file:
* Jangan lupa untuk membuatnya executable chmod + x get_pose_service.py
3. Mari kita buat peluncuran untuk file dengan kode simpul:
cd .. mkdir launch && cd launch
nano
get_pose_service.launch <launch> <node pkg="get_pose" type="get_pose_service.py" name="service_server" output="screen"> </node> </launch>
4. Jangan lupa untuk membangun kembali catkin:
cd catkin_ws catkin_make
Sekarang kita akan memulai kembali semuanya, termasuk file peluncuran baru.
Tetapi untuk Robot:
roslaunch rplidar_ros rplidar.launch
Di Komputer:
1- : roslaunch rosbots_description amcl-2.launch 2- : roslaunch rosbots_description rviz.launch 3- : roslaunch get_pose get_pose_service.launch
Kami beralih ke layanan baru, yang akan memberi kami posisi robot saat ini di peta (kami akan memanggil layanan ROS):
rosservice call /get_pose_service
Di terminal menjalankan launch get_pose, kita akan mendapatkan koordinat robot di peta:

Kemungkinan kesalahan.
[rviz.launch] bukan file peluncuran dalam paket [rosbots_description] juga bukan [rosbots_description] nama file peluncuran
solusi:
cd catkin_ws source devel/setup.bash