rplidarA1-gmapping

CGC Lv4

所参考的大佬教程如下
大佬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
# 将melodic替换为自己的ros版本
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
<!-- 
Example launch file: uses laser_scan_matcher together with
slam_gmapping
-->

<launch>

#### set up data playback from bag #############################

<param name="/use_sim_time" value="flase"/><!-- 因为Gmapping 的simulation 时间是True, 改为false 网上查到的-->

#### 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"/> <!-- A1波特率 -->

<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 ############################################
<!--前三个param必须设置修改,要不然tf_tree不完整-->
<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"/> <!-- A1波特率 -->
<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>

第一行的rplidarNoderplidar_ros需要按照自己的激光雷达启动节点而定
第三行的波特率数值需要根据雷达而定 如我的A1M8为115200

运行

以下需要在同一终端中进行

刷新环境变量

1
source ~/rplidar_ws/devel/setup.bash

给串口权限

可以使用

1
ls /dev/*

进行查询,如我的是ttyUSB0
则输入

1
sudo chmod 777 /dev/ttyUSB0

运行launch文件

1
roslaunch  laser_scan_matcher demo_gmapping.launch

其中demo_gmapping.launch可以根据自己修改的launch文件而修改

  • Title: rplidarA1-gmapping
  • Author: CGC
  • Created at: 2023-06-30 15:35:47
  • Updated at: 2023-08-24 18:54:11
  • Link: https://redefine.ohevan.com/2023/06/30/rplidarA1-gmapping/
  • License: This work is licensed under CC BY-NC-SA 4.0.