1、背景
F1TENTH 平跑车架的底盘还没搞定,想跑一下 ROS 上层应用,刚好发现 gmapping 可以不需要里程计信息、只用激光雷达数据就能建图,因此借底盘还没搞定的机会在虚拟机上跑一下 gmapping。
2、硬件连接
司岚 A1 激光雷达通过串口连接到笔记本的USB接口。就这么简单!一根线就搞定了通信和供电。
虚拟机:Ubuntu 1804
ROS版本: Melodic
3、laser_scan_matcher
通过源码安装
mkdir -p ~/RPLIDAR_test_ws/src
cd ~/RPLIDAR_test_ws/src
git clone https://github.com/ccny-ros-pkg/scan_tools.git
cd ..
catkin_make // 会发现 fail, 此时进入到scan_tools/ 目录下把除laser_scan_matcher 目录之外的所有文件(夹)都删掉。
catkin_make // 此时又报错,看下面的注释解决
catkin_make
sudo sh -c 'echo "source /home/jyc/RPLiDAR_test_ws/devel/setup.bash" >> ~/.bashrc'
注:
报错如下:
解决:sudo apt-get install ros-melodic-csm
4、测试
roslaunch laser_scan_matcher demo.launch
不过,demo.launch 运行结果是在 rviz 中播放.bag
数据包,我们要使用真实激光雷达(思岚 A1)建图,具体做法见下个标题。
5、使用思岚 A1 激光雷达运行 gmapping
在~/RPLiDAR_test_ws/src/laser_scan_matcher/demo
文件夹下,有一个demo_gmapping.launch
文件,运行该.launch
文件同样是用.bag
数据来播放 gmapping 的结果。对这个.launch
文件进行修改,用实时的激光数据代替.bag
数据,代码如下(可直接复制替换):
<!--
Example launch file: uses laser_scan_matcher together with
slam_gmapping
-->
<launch>
#### set up data playback from bag #############################
<!-- 此处,用激光数据 替换掉bag数据 -->
<!-- <param name="/use_sim_time" value="true"/> -->
<!-- <node pkg="rosbag" type="play" name="play"
args="$(find laser_scan_matcher)/demo/demo.bag delay=5 clock"/> -->
<include file="$(find rplidar_ros)/launch/rplidar.launch"/>
#### 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 /laser 40" />
#### start rviz ################################################
<node pkg="rviz" type="rviz" name="rviz"
args="-d $(find laser_scan_matcher)/demo/demo_gmapping.rviz"/>
#### start the laser scan_matcher ##############################
<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="max_iterations" value="10"/>
</node>
#### start gmapping ############################################
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="map_udpate_interval" value="1.0"/>
<param name="maxUrange" value="12.0"/>
<param name="sigma" value="0.1"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.15"/>
<param name="astep" value="0.15"/>
<param name="iterations" value="1"/>
<param name="lsigma" value="0.1"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="1"/>
<param name="srr" value="0.1"/>
<param name="srt" value="0.2"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.2"/>
<param name="linearUpdate" value="1.0"/>
<param name="angularUpdate" value="0.5"/>
<param name="temporalUpdate" value="0.4"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="10"/>
<param name="xmin" value="-10.0"/>
<param name="ymin" value="-10.0"/>
<param name="xmax" value="10.0"/>
<param name="ymax" value="10.0"/>
<param name="delta" value="0.02"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.05"/>
<param name="lasamplerange" value="0.05"/>
<param name="lasamplestep" value="0.05"/>
</node>
</launch>
测试 gmapping :
roslaunch laser_scan_matcher demo_gmapping.launch
报错:
解决:
在~/RPLiDAR_test_ws/src
目录下安装rplidar_ros
包,并重新在~/RPLiDAR_test_ws
目录下编译:cd ~/RPLiDAR_test_ws/src git clone https://github.com/Slamtec/rplidar_ros.git cd .. catkin_make
报错:
[rplidarNode-2] process has died [pid 20367, exit code -6, cmd /home/jyc/RPL
原因:
USB串口的权限不够(我也不能从报错中看出这个端倪,百度到的解决办法,能解决问题就行)
解决:sudo chmod 777 /dev/ttyUSB0
注:
因为虚拟机只连接了激光雷达的这一个串口,因此这个串口被Linux分配的设备名一定是/dev/ttyUSB0