本文将介绍两种使用激光雷达的建图方法
本文所使用的代码:网盘链接 (包括前两篇的代码)
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