#Gmapping
开始之前先安装两个功能包,命令如下:
sudo apt-get install ros-kinetic-map-server
sudo apt-get install ros-kinetic-slam-gmapping
注意输完敲回车的时候要输入密码,安装过程中会提示安装此功能包会消耗多少内存,问你是否同意,输入Y就行了(应该小写的也行)。
1.创建⼀个xqrobot_gmapping功能包![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5350843526bd8be576fbc7cac389e278.png)
2.配置rviz
1)启动主节点
2)启动rviz
3)修改Fixed Frame:将其修改为map
4)添加地图Map并修改相应参数
5)添加RobotModel和LaserScan
将LaserScan的Topic设置为/scan,并将szie改为0.03。
6)在xqrobot_gmapping功能包中新建config目录用于存放.rviz文件
7)保存配置好的rviz模型
将配置好的rviz模型保存在xqrobot_gmapping下的config⽬录中
3.回到工作空间下编译
4.创建gmapping的启动文件
将以下代码粘贴到gmapping.launch文件中:
<launch>
<arg name="scan_topic" default="scan" /> //laser的topic名称,与⾃⼰的激光的topic相对应
<arg name="set_base_frame" default="base_footprint"/>
<arg name="set_odom_frame" default="odom"/>
<arg name="set_map_frame" default="map"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true"> //启动gampping的节点
<param name="base_frame" value="$(arg set_base_frame)"/> //设置base_frame坐标为 base_footprint
<param name="odom_frame" value="$(arg set_odom_frame)"/>/ //设置odom_frame坐标为odom
<param name="map_frame" value="$(arg set_map_frame)"/> //设置map_frame坐标为map
<param name="map_update_interval" value="2.0"/>//地图更新的⼀个间隔,两次scanmatch的间隔,地 图更新也受scanmach的影响,如果scanmatch没有成功的话,是不会更新地图的。
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxUrange" value="12.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>//optimize机器⼈移动的初始值(距离)
<param name="astep" value="0.05"/>//optimize机器⼈移动的初始值(⻆度)
<param name="iterations" value="5"/>//icp的迭代次数
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>//为0,表⽰所有的激光都处理,尽可能为零,如果计算压⼒过⼤,可 以改成1
<param name="minimumScore" value="50"/>
<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="1.0"/>//机器⼈移动linearUpdate距离,进⾏scanmatch
<param name="angularUpdate" value="0.2"/>//机器⼈选装angularUpdate⻆度,进⾏scanmatch
<param name="temporalUpdate" value="0.5"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="40"/>//粒⼦个数
<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.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"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>
</launch>
保存并退出后,在终端中继续输⼊以下指令创建xqrobot_gmapping.launch
将以下代码粘贴到xqrobot_gmapping.launch文件中:
<launch>
<!-- 加载机器⼈模型描述参数 xqrobot-->
<include file="$(find xqrobot_description)/launch/display_xqrobot_gazebo.launch"/><!-- 打开gazebo仿真环境-->
<include file="$(find xqrobot_gmapping)/launch/gmapping.launch"/><!--启动slam_gmapping节点-->
<node pkg="rviz" type="rviz" name="rviz" required="true" args="-d $(find xqrobot_gmapping)/config/gmapping.rviz"/>
</launch>
5.加载地图
1)在学习通章节目录下找到“Gmapping地图”,点进去之后下载“world.tar.gz”压缩包,解压缩后将其复制到xqrobot_description文件夹下,如下图所示:
或者通过网盘链接下载此压缩包 → world.tar(提取码:6rpa)
2)修改display_xqrobot_gazebo.launch文件
将第12行改为以下三行,其余不变。
供复制:
<arg name="world_name" value="$(find xqrobot_description)/world/room.world"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_name)" />
6.开始建图
打开一个新的终端,运行键盘控制节点,控制机器人移动
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ roslaunch xqrobot_teleop xqrobot_teleop.launch
这里说明一下,按q/z可以增加/减少线速度和角速度,w/x可以增加/减少线速度,e/c可以增加/减少角速度。按“i”前进,按“,”后退,按“u”逆时针旋转(左转),按“o”顺时针旋转(右转)。
7.保存地图
8、效果展示
①gazebo物理仿真环境中截图
② rviz可视化界面截图
③ 使用QT可视化工具,查看topic之间的关系
lzw08@ubuntu:~$ rqt_graph
④ 保存建好的地图
rosrun map_server map_saver -f map
以上的命令只是保存地图的作用,并不会打开。它自动将生成的地图文件(.pgm和.yaml文件)保存在Home目录下,需要手动双击打开才有上图效果~
说明
gazebo模型在我电脑上运行不太稳定,多运行几次就行了。关闭再运行,重复几次,还有那句:export SVGA_VGPU10=0,多运行几次,好像就可以稳定了。附:实践报告六(仅供参考,请勿他用!)