当前位置:   article > 正文

ROS高效进阶第六章 -- 机器人SLAM建图与自主导航之gmapping算法_ros gmapping

ros gmapping

1 背景和资料

本文是机器人SLAM建图与自主导航的第二篇文章,上篇文章ROS高效进阶第六章 – Ros Action通信机制我们单纯学习了ros的action机制。
本文我们将基于之前ROS高效进阶第三章 – 以差速轮式机器人为例,使用Gazebo构建机器人仿真平台的仿真环境,使用gmapping slam算法,生成一张二维的仿真环境地图,这张地图将被用于下一篇的机器人自主导航中。这里提醒,本文的测试环境是ubuntu20.04 + ros noetic。
本文参考资料如下:
(1)《ROS机器人开发实践》胡春旭 第9章
(2)ROS高效进阶第三章 – 以差速轮式机器人为例,使用Gazebo构建机器人仿真平台
(3)ROS探索总结之如何发布里程计消息
(4)openslam gmapping
(5)【高翔】视觉SLAM十四讲
(6)《视觉SLAM十四讲:从理论到实践》 高翔 / 张涛 / 等 电子工业出版社
(7)ROS高效进阶第一章 – ROS高级组件之 TF坐标变换 其一

2 正文

2.1 SLAM算法的引入

(1)SLAM:Simultaneous Localization and Mapping,中文是即时定位与地图构建,所谓的SLAM算法准确说是能实现SLAM功能的算法,而不是某一个具体算法。
(2)现在各种机器人研发和商用化非常火(可以参考 ROS高效入门第一章 – ROS历史与现状),所有的自主机器人都绕不开一个问题,即在陌生环境中,需要知道周边是啥样(建图),需要知道我在哪(定位),于是有了SLAM 课题的研究。SLAM在室内机器人,自动驾驶汽车建图,VR/AR穿戴等领域都有广泛的应用。
在这里插入图片描述
(3)SLAM算法根据依赖的传感器不同,可以分为激光SLAM和视觉SLAM,前者是激光雷达,后者是能提供深度信息的摄像头,如双目摄像头,红外摄像头等。除此之外,SLAM算法通常还依赖里程计提供距离信息,否则地图很难无缝的拼接起来,很容易跑飞。一个经典的SLAM 流程框架如下,其中回环检测时为了判断机器人有没有来过之前的位置。
在这里插入图片描述
(4)如果想深入学习SLAM算法,这里推荐几个资料:
开源SLAM(这里有所有的SLAM算法资料):openslam
《视觉SLAM十四讲:从理论到实践》 高翔 / 张涛 / 等 电子工业出版社
高翔的B站视频:【高翔】视觉SLAM十四讲

2.2 gmapping算法的基本原理

(1)现在ROS里有一系列SLAM算法包,如:gmapping(最早的,资料:openslam gmapping),hector(不需要里程计,比较特别),谷歌开源的cartographer(效率高),rtabmap(前面是二维的,这是三维建图)等。
(2)gmapping是基于激光雷达的,需要里程计信息,创建二维格栅地图。其中IMU信息可以没有
在这里插入图片描述
(3)ros中激光雷达数据消息是 sensor_msgs/LaserScan ,内容如下:
在这里插入图片描述
(4)ros中里程计数据消息是 nav_msgs/Odometry,具体域的理解可以参考:ROS高效进阶第一章 – ROS高级组件之 TF坐标变换 其一 ,内容如下。
在这里插入图片描述
(5)gmapping 发布的地图meta数据:
在这里插入图片描述
(6)gmapping 发布的地图栅格数据
在这里插入图片描述

2.3 mbot_navigation 样例

(1)ubuntu20.04 + ros noetic下,安装gmapping和保存地图文件的map_server

sudo apt-get install ros-noetic-gmapping
sudo apt-get install ros-noetic-map-server
// 补充:这是安装hector
sudo apt-get install ros-noetic-hector-slam
  • 1
  • 2
  • 3
  • 4

(2)创建 mbot_navigation 和相关文件

cd ~/catkin_ws/src
catkin_create_pkg mbot_navigation geometry_msgs move_base_msgs actionlib roscpp rospy

cd mbot_navigation 
mkdir launch maps rviz
touch launch/gmapping.launch
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(3)调用gmapping算法,只需要写launch文件就行了,不用编码。
gmapping.launch

<launch>
	// mbot_gazebo 会通过发/scan topic,传出lidar数据
    <arg name="scan_topic" default="scan" />
    // gammping一大堆参数,这里都是从他的demo里扣出来的,不用改。
    // 如果想用的好,可以尝试修改,甚至改一些代码,这就是算法(调参)工程师!
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
    	// mbot_gazebo 会通过发/odom topic,传出里程计数据
        <param name="odom_frame" value="odom"/>
        <param name="map_update_interval" value="5.0"/>
        <!-- Set maxUrange < actual maximum range of the Laser -->
        <param name="maxRange" value="5.0"/>
        <param name="maxUrange" value="4.5"/>
        <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.436"/>
        <param name="temporalUpdate" value="-1.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"/>
        <remap from="scan" to="$(arg scan_topic)"/>
    </node>
	// 保存的rviz配置文件
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find mbot_navigation)/rviz/map.rviz"/>
</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

(4)连同mbot_gazebo,一起编译运行

cd ~/catkin_ws
catkin_make -DCATKIN_WHITELIST_PACKAGES="mbot_navigation;mbot_gazebo"
source devel/setup.bash
// 打开仿真环境
roslaunch mbot_gazebo mbot_gazebo.launch
//再开一个窗口,打开gmapping
roslaunch mbot_navigation gmapping.launch
// 控制机器人行动,进行建图
roslaunch mbot_gazebo mbot_teletop.launch
// 建图完成后,新开窗口,执行map_server,保存生成的地图
cd ~/catkin_ws/src/mbot_navigation/maps
rosrun map_server map_saver -f gmapping_save
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述
最终保存下来的地图
在这里插入图片描述

3 总结

本文中的例子放在了本人的github上: mbot_navigationmbot_gazebo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/714481
推荐阅读
相关标签
  

闽ICP备14008679号