Selamat siang pembaca! Kami pernah menyentuh pada topik pelokalan dan SLAM dalam sebuah artikel tentang Hector SLAM . Kami terus berkenalan dengan algoritme untuk membangun peta medan dan lokalisasi di ROS. Hari ini kita akan mencoba untuk membangun peta daerah tanpa sumber odometry, hanya menggunakan Hokuyo URG-04LX-UG01 Lidar dan algoritma gmapping dan melokalkan robot pada peta yang dibangun menggunakan algoritma amcl . Laser_scan_matcher akan membantu kami dalam hal ini . Siapa yang peduli, tolong, di bawah kucing.Menginstal Paket laser_scan_matcher
Jadi mari kita mulai! Untuk percobaan kami akan menggunakan ROS Indigo, tetapi Anda dapat menggunakan versi ROS yang berbeda (Jade, Kinetic, Hydro). Menginstal paket harus dilakukan dengan cara yang sama (mungkin hanya di ROS Kinetic beberapa paket tidak akan tersedia melalui apt-get).Paket laser_scan_matcher adalah alat untuk perekaman tambahan data laser, yang diimplementasikan berdasarkan metode Canonical Scan Matcher, yang dapat dibaca di sini . Anda dapat membaca tentang paket di sini . Paket ini dapat digunakan tanpa data odometry, ia melakukan penilaian odometry sendiri.Instal paket:sudo apt-get install ros-indigo-laser-scan-matcher
Mari kita coba demo:roscore
roslaunch laser_scan_matcher demo.launch
Kita akan melihat sesuatu yang serupa di rviz:Yang ditampilkan di sini adalah laser_scan_matcher beraksi pada data Lidar yang direkam dalam file tas. Sekarang coba paket langsung. Agar tidak kehilangan waktu, kami akan segera mencobanya dengan algoritma gmapping. Buat paket dengan file my_gmapping_launch.launch untuk memulai gmapping:cd ~/catkin_ws/src
catkin_create_pkg my_laser_matcher
cd src/my_laser_matcher
mkdir launch
vim launch/my_gmapping_launch.launch
Salin kode berikut ke file my_gmapping_launch.launch:Kode my_gmapping_launch.launch<?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>
Di sini kita menjalankan static_transform_publisher dari paket tf untuk menerbitkan transformasi antara base_link → sistem koordinat laser, laser_scan_matcher dan node slam_gmapping. Kode sumber file dapat diunduh dari sini . Untuk menggunakan Lidu Hokuyo, kita perlu menginstal paket ROS hokuyo_node :sudo apt-get install ros-indigo-hokuyo-node
Jalankan node getID dari paket hokuyo_node untuk mendapatkan informasi lidar:rosrun hokuyo_node getID /dev/ttyACM0
Kesalahan dapat terjadi:Error: Failed to open port. Permission denied.
[ERROR] 1263843357.793873000: Exception thrown while opening Hokuyo.
Failed to open port: /dev/ttyACM0. Permission denied (errno = 13). You probably don't have premission to open the port for reading and writing. (in hokuyo::laser::open) You may find further details at http://www.ros.org/wiki/hokuyo_node/Troubleshooting
Dalam hal ini, kita perlu menambahkan izin untuk port / dev / ttyACM0:sudo chmod a+rw /dev/ttyACM0
Jalankan getID dari paket hokuyo_node lagi dan dapatkan output yang serupa:Device at /dev/ttyACM0 has ID H0906078
Sekarang jalankan node hokuyo_node:rosrun hokuyo_node hokuyo_node
Akhirnya, jalankan file launcher kami my_gmapping_launch.launch:roslaunch my_laser_matcher my_gmapping_launch.launch
rosrun rviz rviz
Mari daftar topik:rostopic list
Di antara topik kita akan melihat hal berikut:/initialpose
/move_base_simple/goal
/odom
/pose2D
...
/imu/data
Dengan cara ini kami mendapatkan posisi odometry dan robot berkat laser_scan_matcher.Tambahkan ke rviz tampilan tipe LaserScan dengan topik / pindai seperti yang dijelaskan dalam artikel . Juga tambahkan tampilan untuk Peta Peta dan untuk transformasi TF. Luaskan bagian TF dan Bingkai di dalamnya, lalu catat poinnya: odom, map, base_link. Biarkan saya mengingatkan Anda bahwa ini adalah sistem koordinat odometer, peta, dan robot masing-masing. Ingatlah untuk mengatur nilai / peta ke bidang bingkai Tetap di sebelah kiri panel Menampilkan di bagian Opsi global.Di rviz kita akan melihat gambar yang serupa:
Selanjutnya, cukup pindahkan robot di ruang angkasa untuk membangun peta area yang lengkap. Kami menggunakan utilitas map_saver dari paket map_server untuk menyimpan peta:rosrun map_server map_saver
Lokalisasi dengan amcl
Sekarang mari kita coba melokalkan robot menggunakan algoritma amcl. Buat file my_localize.launch di dalam paket kami dengan konten berikut:Kode my_localize.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 name="hokuyo" pkg="hokuyo_node" type="hokuyo_node" respawn="false" output="screen">
<param name="calibrate_time" type="bool" value="false"/>
<param name="port" type="string" value="/dev/ttyACM0"/>
<param name="intensity" type="bool" value="false"/>
</node>
<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/vladimir/catkin_ws/map.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="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>
Di sini, kami, mirip dengan peluncur untuk pemetaan, mempublikasikan transformasi / laser → / base_link menggunakan simpul static_transform_publisher, node hokuyo_node dan laser_scan_matcher. Kemudian kita menjalankan map_server untuk menerbitkan peta yang kita buat, di mana dalam args kita melewatkan path ke peta dalam file yaml. Akhirnya, mulai simpul amcl dengan parameter. Anda dapat membaca tentang parameter amcl di halaman algoritma resmi .Kode file peluncur juga dapat diunduh dari repositori github . Jalankan file peluncur kami:roslaunch my_laser_matcher my_localize.launch
Sekarang mari kita pindah ke rviz. Tetapkan nilai peta untuk bingkai Tetap di bagian Opsi global. Mari daftar topik:rostopic list
Topik-topik baru akan muncul dalam daftar:...
/amcl/parameter_descriptions
/amcl/parameter_updates
/amcl_pose
...
/map
/map_metadata
/map_updates
...
/particlecloud
Topik amcl_pose sesuai dengan posisi robot yang diterbitkan oleh amcl.Mari kita lihat tulisan di topik:rostopic echo /amcl_pose
Dapatkan data tentang posisi robot:header:
seq: 15
stamp:
secs: 1482430591
nsecs: 39625000
frame_id: map
pose:
pose:
position:
x: 0.781399671581
y: 0.273353260585
z: 0.0
orientation:
x: 0.0
y: 0.0
z: -0.636073020536
w: 0.771628869694
covariance: [0.2187289446708912, -0.010178711317316846, 0.0, 0.0, 0.0, 0.0, -0.010178711317316819, 0.23720047371620548, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07106236846890918]
---
Dalam rviz kita mendapatkan gambar berikut:
Seperti yang Anda lihat, titik pindai dari LIDAR sebagian bertepatan dengan dinding pada peta. Inilah yang terlihat seperti setup saya:
Mari kita coba menggerakkan robot. Posisi robot dan sudut pandang peta harus berubah secara bersamaan di jendela rviz. Setelah memindahkan robot, posisi robot mungkin tidak ditentukan secara akurat oleh algoritma amcl. Kita perlu menyesuaikan posisi robot menggunakan alat Pose Estimate 2D. Untuk melakukan ini, klik pada tombol Perkirakan Pose 2D di bilah alat atas di rviz, klik pada titik perkiraan pusat sistem koordinat robot pada peta di rviz (sistem koordinat base_link) dan tahan tombol mouse. Panah hijau muncul, yang berasal dari pusat robot:
Tarik panah mengubah arahnya dan mencoba menggabungkan titik-titik pemindaian dari Lidar dengan tepi hitam (dinding) pada peta. Setelah menerima kombinasi terbaik, lepaskan tombol mouse.
Kami akan menerima pesan seperti itu di terminal tempat my_localize.launch dijalankan:[ INFO] [1482431993.717411186]: Setting pose (1482431993.717383): -0.413 -0.071 0.057
Pada video pendek, Anda dapat menonton semua yang terjadi:Topic / particlecloud menyajikan data tentang ketidakpastian posisi robot dalam bentuk posisi berorientasi (Pose) atau yang disebut awan partikel. Jenis pesan adalah geometry_msgs / PoseArray.Tambahkan tampilan bernama topic / particlecloud :
Dalam rviz, awan partikel akan muncul dalam bentuk sekelompok tebal panah merah:
Semakin tebal kelompok partikel, semakin tinggi kemungkinan posisi robot pada posisi ini. Anda dapat membaca tentang alat perkiraan Pose 2D, partikel awan, dan konsep lain di amcl dalam tutorial di ros.org.Itu saja! Semua algoritma yang dipertimbangkan (gmapping dan amcl) adalah bagian dari tumpukan Navigasi besar di ROS, Anda dapat menemukan banyak informasi tentang hal itu di Internet. Hari ini kami mencoba alat laser_scan_matcher, algoritma gmapping dan amcl lokalisasi dalam aksi. Sekarang Anda dapat dengan mudah mulai bekerja pada pelokalan dan navigasi robot seluler dan membuat robot sepenuhnya otonom yang dapat menavigasi di ruang angkasa tanpa perlu kontrol manual.Berlangganan grup kami di ROS Vkontakte dan ikuti perkembangan artikel dan berita baru tentang platform ROS. Saya berharap Anda semua semoga sukses dalam eksperimen dan melihat Anda segera!PS: Semua dengan 2017 mendatang!