所参考的大佬教程如下
大佬1 大佬2 大佬3
前情介绍
任务背景为:要使用思岚A1M8激光雷达实现建图及避障、导航等功能
本次为实现建图
Gmapping是基于滤波SLAM框架的常用开源SLAM算法,在ROS中使用Gmapping建图需要提供 Odometry(里程计信息)和laser(激光数据),但是只用一个激光雷达也可以进行Gmapping建图
其实我们是有双目相机T265可以提供姿态信息的,但受限于当前知识水平,暂且使用较为方便的Gmapping算法进行操作
采用的方法就是使用 laser_scan_matcher 功能包,其为增量激光扫描配准工具。该软件包允许扫描连续的 sensor_msgs / LaserScan 消息之间的匹配,并将估计的激光位置发布为 geometry_msgs / Pose2D 或 tf 变换。该包可以在没有其他传感器提供的任何测距估计的情况下使用。因此,它可以作为独立的里程计算器估算器。
具体步骤
创建工作空间
1 2
| mkdir -p ~/rplidar_ws/src && cd ~/rplidar_ws/src
|
下载所需的功能包
1 2
| git clone https://github.com/Slamtec/rplidar_ros.git git clone https://github.com/CCNYRoboticsLab/scan_tools.git
|
获取gmapping功能包
网址为:https://github.com/CCNYRoboticsLab/scan_tools.git
下载或克隆仓库后将其中的gmapping文件夹复制到工作空间下的src中(比如我的就是~/rplidar_ws/src
)
接着下载必要功能包
1 2 3
| sudo apt-get install ros-melodic-csm sudo apt-get install ros-melodic-gmapping
|
编译工作空间
1 2 3 4
| cd ~/rplidar_ws
catkin_make
|
修改启动launch文件
1
| cd ~/Library/rplidar_ws/src/scan_tools-indigo/laser_scan_matcher/demo
|
这里原先的demo_gmapping.launch
文件则为启动launch文件,这里要做的就是修改它以实行自己的设备
这里提供我的launch文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
<launch>
#### set up data playback from bag #############################
<param name="/use_sim_time" value="flase"/>
#### rplidar_a2 ################################################ <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> <param name="serial_port" type="string" value="/dev/ttyUSB0"/> <param name="serial_baudrate" type="int" value="115200"/>
<param name="frame_id" type="string" value="laser"/> <param name="inverted" type="bool" value="false"/> <param name="angle_compensate" type="bool" value="true"/> <param name="scan_mode" type="string" value="Sensitivity"/> </node>
#### 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"/>
<param name="base_frame" value = "base_link"/> <param name="use_odom" value="false"/> <param name="publy_pose" value = "true"/> <param name="publy_tf" value="true"/>
</node>
#### start gmapping ############################################
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> <param name="base_frame" value="/base_link"/> <param name="odom_frame" value="/odom" /> <param name="map_frame" value="/map" />
<param name="map_udpate_interval" value="1.0"/> <param name="maxUrange" value="5.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="-5.0"/> <param name="ymin" value="-5.0"/> <param name="xmax" value="5.0"/> <param name="ymax" value="5.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>
|
其中 重点修改的为
1 2 3 4 5 6 7 8
| <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> <param name="serial_port" type="string" value="/dev/ttyUSB0"/> <param name="serial_baudrate" type="int" value="115200"/> <param name="frame_id" type="string" value="laser"/> <param name="inverted" type="bool" value="false"/> <param name="angle_compensate" type="bool" value="true"/> <param name="scan_mode" type="string" value="Sensitivity"/> </node>
|
第一行的rplidarNode
及rplidar_ros
需要按照自己的激光雷达启动节点而定
第三行的波特率数值需要根据雷达而定 如我的A1M8为115200
运行
以下需要在同一终端中进行
刷新环境变量
1
| source ~/rplidar_ws/devel/setup.bash
|
给串口权限
可以使用
进行查询,如我的是ttyUSB0
则输入
1
| sudo chmod 777 /dev/ttyUSB0
|
运行launch文件
1
| roslaunch laser_scan_matcher demo_gmapping.launch
|
其中demo_gmapping.launch
可以根据自己修改的launch文件而修改