前言

這篇文章我開始和大家一起探討機器人SLAM建圖與自主導航 ,在前面的內容中,我們介紹了差速輪式機器人的概念及應用,談到了使用Gazebo平台搭建仿真環境的教程,主要是利用gmapping slam算法,生成一張二維的仿真環境地圖 。我們也會在這篇文章中繼續介紹並使用這片二維的仿真環境地圖,用於我們的演示。

教程

SLAM算法的引入

(1)SLAM:Simultaneous Localization and Mapping,中文是即時定位與地圖構建,所謂的SLAM算法準確説是能實現SLAM功能的算法,而不是某一個具體算法。

(2)現在各種機器人研發和商用化非常火 ,所有的自主機器人都繞不開一個問題,即在陌生環境中,需要知道周邊是啥樣(建圖),需要知道我在哪(定位),於是有了SLAM 課題的研究。SLAM在室內機器人,自動駕駛汽車建圖,VR/AR穿戴等領域都有廣泛的應用。

機器人SLAM建圖與自主導航:從基礎到實踐_激光雷達

(3)SLAM算法根據依賴的傳感器不同,可以分為激光SLAM和視覺SLAM,前者是激光雷達,後者是能提供深度信息的攝像頭,如雙目攝像頭,紅外攝像頭等。除此之外,SLAM算法通常還依賴里程計提供距離信息,否則地圖很難無縫的拼接起來,很容易跑飛。一個經典的SLAM 流程框架如下,其中迴環檢測時為了判斷機器人有沒有來過之前的位置。

整體視覺SLAM的流程圖

機器人SLAM建圖與自主導航:從基礎到實踐_數據_02

gmapping算法的基本原理

(1)現在ROS裏有一系列SLAM算法包,如:gmapping ,hector(不需要里程計,比較特別),谷歌開源的cartographer(效率高),rtabmap(前面是二維的,這是三維建圖)等。

(2)gmapping是基於激光雷達的,需要里程計信息,創建二維格柵地圖。其中IMU信息可以沒有 。

機器人SLAM建圖與自主導航:從基礎到實踐_二維_03

(3)ros中激光雷達數據消息是 sensor_msgs/LaserScan ,內容如下:

機器人SLAM建圖與自主導航:從基礎到實踐_激光雷達_04

(4)ros中里程計數據消息是 nav_msgs/Odometry 。

機器人SLAM建圖與自主導航:從基礎到實踐_數據_05

(5)gmapping 發佈的地圖meta數據:

機器人SLAM建圖與自主導航:從基礎到實踐_二維_06

(6)gmapping 發佈的地圖柵格數據

機器人SLAM建圖與自主導航:從基礎到實踐_二維_07

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

機器人SLAM建圖與自主導航:從基礎到實踐_二維_08

最終保存下來的地圖

機器人SLAM建圖與自主導航:從基礎到實踐_數據_09