前言
這篇文章我開始和大家一起探討機器人SLAM建圖與自主導航 ,在前面的內容中,我們介紹了差速輪式機器人的概念及應用,談到了使用Gazebo平台搭建仿真環境的教程,主要是利用gmapping slam算法,生成一張二維的仿真環境地圖 。我們也會在這篇文章中繼續介紹並使用這片二維的仿真環境地圖,用於我們的演示。
教程
SLAM算法的引入
(1)SLAM:Simultaneous Localization and Mapping,中文是即時定位與地圖構建,所謂的SLAM算法準確説是能實現SLAM功能的算法,而不是某一個具體算法。
(2)現在各種機器人研發和商用化非常火 ,所有的自主機器人都繞不開一個問題,即在陌生環境中,需要知道周邊是啥樣(建圖),需要知道我在哪(定位),於是有了SLAM 課題的研究。SLAM在室內機器人,自動駕駛汽車建圖,VR/AR穿戴等領域都有廣泛的應用。
(3)SLAM算法根據依賴的傳感器不同,可以分為激光SLAM和視覺SLAM,前者是激光雷達,後者是能提供深度信息的攝像頭,如雙目攝像頭,紅外攝像頭等。除此之外,SLAM算法通常還依賴里程計提供距離信息,否則地圖很難無縫的拼接起來,很容易跑飛。一個經典的SLAM 流程框架如下,其中迴環檢測時為了判斷機器人有沒有來過之前的位置。
整體視覺SLAM的流程圖
gmapping算法的基本原理
(1)現在ROS裏有一系列SLAM算法包,如:gmapping ,hector(不需要里程計,比較特別),谷歌開源的cartographer(效率高),rtabmap(前面是二維的,這是三維建圖)等。
(2)gmapping是基於激光雷達的,需要里程計信息,創建二維格柵地圖。其中IMU信息可以沒有 。
(3)ros中激光雷達數據消息是 sensor_msgs/LaserScan ,內容如下:
(4)ros中里程計數據消息是 nav_msgs/Odometry 。
(5)gmapping 發佈的地圖meta數據:
(6)gmapping 發佈的地圖柵格數據
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
(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
(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>
(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
最終保存下來的地圖