本文將介紹兩種使用激光雷達的建圖方法
本文所使用的代碼:網盤鏈接 (包括前兩篇的代碼)
hector_mapping建圖與定位
這種方法的優點是簡便,只需要有一個激光雷達即可,支持手持建圖,不需要底層的里程計數據,
這里我推薦一篇文章https://blog.csdn.net/weixin_41459903/article/details/102795148
slam_gampping建圖
准備工作
首先,我們在他的官方文檔中可以看到,gmapping功能包訂閱了 tf 和 scan,這個tf包括了odom和base_link的變換以及激光雷達和base_link的變換,在之前的文章里為我們介紹了前者,那么接下來將介紹后者的配置。
那么我們需要下載 rplidar_ros 和 slam_gmapping 兩個功能包,git太慢的話可以下載我網盤里的。網盤鏈接
配置串口
由於激光雷達插在電腦或者其他設備上時串口號總是變來變去,修改代碼太麻煩,那么我們將設備和串口號做一個映射就可以解決這個問題了下載網盤的文件,在serial_port/serial_port_sh/rplida/ 下 運行create_udev_rules.sh這個腳本,便可以綁定。對於具體內容可以參考這篇博客,若有不明白的可以私信我。
編寫rplida.launch
這個文件中,我們可以看到首先啟動了激光雷達的節點,同時在填寫串口號的地方,我們改成 /dev/rplidar 這就是因為上文將設備對應的串口號映射為rplidar。
另外,在原文件中是沒有做tf變換的,由於我們需要知道雷達與機器人的相對位置,所以還需要加上tf。
<launch> <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> <param name="serial_port" type="string" value="/dev/rplidar"/> <param name="serial_baudrate" type="int" value="115200"/><!--A1/A2 --> <!--param name="serial_baudrate" type="int" value="256000"--><!--A3 --> <param name="frame_id" type="string" value="laser"/> <param name="inverted" type="bool" value="false"/> <param name="angle_compensate" type="bool" value="true"/> </node> <!-- tf 包的static_transform_publisher 節點 相對車的xyz方向位置以及xyz方向的角度偏轉 父級坐標和雷達坐標,100ms廣播一次--> <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.01 0 0.01 0 0 0 1 /base_link /laser 100" /> </launch>
編寫slam_gmapping.launch
<launch> <param name="use_sim_time" value="false"/> <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> <!--remap from="scan" to="base_scan"/--> <param name="map_update_interval" value="5.0"/> <param name="maxUrange" value="14.0"/> <param name="sigma" value="0.05"/> <param name="kernelSize" value="1"/> <param name="lstep" value="0.05"/> <param name="astep" value="0.05"/> <param name="iterations" value="5"/> <param name="lsigma" value="0.075"/> <param name="ogain" value="3.0"/> <param name="lskip" value="0"/> <param name="srr" value="0.01"/> <param name="srt" value="0.02"/> <param name="str" value="0.01"/> <param name="stt" value="0.02"/> <param name="linearUpdate" value="0.5"/> <param name="angularUpdate" value="0.218"/> <param name="temporalUpdate" value="5.0"/> <param name="resampleThreshold" value="0.5"/> <param name="particles" value="80"/> <param name="xmin" value="-1.0"/> <param name="ymin" value="-1.0"/> <param name="xmax" value="1.0"/> <param name="ymax" value="1.0"/> <param name="delta" value="0.05"/> <param name="llsamplerange" value="0.01"/> <param name="llsamplestep" value="0.01"/> <param name="lasamplerange" value="0.005"/> <param name="lasamplestep" value="0.005"/> </node> </launch>
編寫bringup_base.launch
這個launch文件用於啟動我們前兩篇文章所提到的節點,包括串口通信,里程計和鍵盤,順便把雷達也啟動了
<launch> <node pkg="serial_port" type="port_SubAndPub.py" name="serial_data_contral" launch-prefix="xterm -e"/> <node pkg="serial_port" type="keyboard.py" name="car_teleop" launch-prefix="xterm -e"/> <node pkg="odom_tf_package" type="odom_tf_pub" name="odom_tf_pub" launch-prefix="xterm -e" ></node> <include file="$(find bringup)/launch/include/rplidar.launch" /> </launch>
啟動建圖
roslaunch bringup bringup_base.launch
roslaunch bringup slam_gmapping.launch
rviz
打開rviz后設置一下fixed frame 為odom 然后點擊add,添加map,LaserScan,至此,通過鍵盤移動機器人就可以建圖了(沒實物的話先熟悉下流程,后面會更新仿真環境)
保存地圖
rosrun map_server map_saver -f ~/map/rplidar_gmapping