激光雷达建图后基于amcl实现自动定位
雷達型號:robosens helios(32線)
系統平臺:Linux18.04+ros
新手思路僅供參考。
由于手頭只有一個激光雷達,前期在選擇建圖算法的時候使用的是hector-slam,見連接:學習筆記, 對辦公室進行了建圖和保存,下面使用amcl進行定位。
amcl(adaptiveMonteCarloLocalization)自適應的蒙特卡洛定位,是用于2D移動機器人的概率定位系統。它實現了自適應(或KLD采樣)蒙特卡洛定位方法,該方法使用粒子過濾器根據已知地圖跟蹤機器人的姿態。
調用只需要通過ros安裝navigation包即可(如果沒記錯的話navigation里面包含amcl,只需要安裝navigation就行)。
安裝后在自己的工作空間創建啟動的launch文件。
<launch> <arg name="map_file" default="/home/test/map_files/mymap_office0.yaml"/><!--加載地圖--> <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" /><!--amcl start--> <node pkg="amcl" type="amcl" name="amcl" output="screen"><!-- Publish scans from best pose at a max of 10 Hz --><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"/><!-- translation std dev, m --><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_model_type" value="beam"/> --><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="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"/> </node> </launch>launch文件主要干兩件事,一個是加載地圖,一個是啟動amcl節點(同時也給以amcl中的部分參數進行定義)。
這里有個坑就是因為進行定位需要激光雷達和慣導同時進行的,由于手頭只有激光雷達,在啟動激光雷達、啟動轉換二維點(amcl使用的是二維匹配)、啟動amcl節點后,會發現激光雷達和地圖尺寸不匹配、相對位置也不對,并且無法給定初始點。
此處需要增加一個插件laser_scan_matcher,它是利用激光消息/scan來估計位姿,從而發布/odom,可以理解為模擬了慣導。
首先安裝:
或者安裝scan-tools也可以,這個里面包含了laser_scan_matcher。
sudo apt-get install ros-melodic-scan-tools然后寫launch文件(文章中的launch可以嘗試結合起來,這樣不用一個一個啟動,但是需要搞清楚先后順序)。
<launch><!-- set up data playback from bag or not--><param name="/use_sim_time" value="false"/><!--publish an example base_link -> laser transform --><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 /rslidar 10" /><!--start the laser scan_matcher --><node pkg="laser_scan_matcher" type="laser_scan_matcher_node" name="laser_scan_matcher_node" output="screen"><param name="use_imu" value="false"/><param name="use_odom" value="false"/><param name="use_cloud_input" value="false"/><param name="fixed_frame" value = "odom"/><param name="max_iterations" value="10"/></node> </launch>然后需要通過激光雷達、三維轉二維點云、laser_scan_matcher、amcl節點即可將激光雷達和地圖匹配顯示在rviz中,可以通過在rviz中通過2D-Pose-Estimate可實現手動發布初始位姿,PoseArray可顯示粒子情況。需要注意的是,需要在fixed frame :map下進行初始位姿的發布。此時貌似就能夠通過前后左右自主定位,但是由于初始粒子聚在一起定位過程十分緩慢(不知道我的理解對不對)。
后續想要相對便捷的自主定位,讓初始的粒子分布整個地圖,以便計算位姿,可以通過前后左右移動激光雷達進行自主定位,我這里是加在了amcl的launch包里,在amcl節點啟動后面加上如下命令。
<param name="initial_cov_xx" value="4"/><param name="initial_cov_yy" value="4"/><param name="initial_cov_aa" value="4"/>激光雷達自主定位
不過這種方法比較慢,尤其是對于有重復相似場景的地方容易定位出現問題,可以手動給一個大概的初始位置然后再讓其自主定位,這樣會快很多。
如果出現定位出錯的時候,可以在終端在終端可以調用ros里面的global_localization服務:
重新調用后粒子會重新鋪滿整個地圖。
總結
以上是生活随笔為你收集整理的激光雷达建图后基于amcl实现自动定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 犹如“笼中困兽”的中国半导体,正在冒着敌
- 下一篇: 程序员看芯片行业