# SLAM 介紹 ![](https://hackmd.io/_uploads/r1APK7gl6.png) ## 地圖 ROS中的地圖很好理解,就是一張普通的灰階影像,通常是pgm格式。這張影像上的黑色像素表示障礙物,灰色像素表示可行區域。如下圖所示 ![](https://hackmd.io/_uploads/rJKRFmgea.png) 在SLAM建圖的過程中,你可以在RViz裡看到一張地圖逐漸建立起來的過程,類似一塊塊拼圖被拼接成一張完整的地圖。這張地圖對於我們定位、路徑規劃都是不可或缺的資訊。事實上,地圖在ROS中是以Topic的形式維護和呈現的,這個Topic名稱就叫做`/map`,它的訊息類型是`nav_msgs/OccupancyGrid` ## Gmapping Gmapping演算法是目前基於雷射雷達和里程計方案裡面比較可靠和成熟的一個演算法,它是基於粒子濾波,採用RBPF的方法效果穩定,許多基於ROS的機器人都跑的是 gmapping_slam。這個軟體包位於`ros-perception`組織中的`slam_gmapping`倉庫中。其中的`slam_gmapping`是一個 metapackage,它依賴了 gmapping,而演算法具體實作都在gmapping軟體包中,該軟體包中的`slam_gmapping`程式就是我們在 ROS 中運行的 SLAM 節點。 - check ``` apt-cache search ros-$ROS_DISTRO-gmapping ``` - install ``` sudo apt-get install ros-$ROS_DISTRO-gmapping ``` - use ``` rosrun gmapping slam_gmapping ``` ## Gmapping SLAM 計算圖 gmapping的作用是根據雷射雷達和里程計(Odometry)的信息,對環境地圖進行構建,並且對自身狀態進行估計。因此它得輸入應包括光達和里程計的數據,而輸出應當有自身位置和地圖。下面我們從計算圖(訊息的流向)的角度來看看gmapping演算法的實際運作中的結構 ![](https://hackmd.io/_uploads/S1zoBwZgT.png) 我們所運行的`slam_gmapping`節點,這個節點負責整個gmapping SLAM的工作。 - 輸入 - `/tf`以及`/tf_static`: 座標變換,類型為第一代的`tf/tfMessage`或第二代的`tf2_msgs/TFMessage` 其中一定得提供的有兩個tf,一個是`base_frame`與`laser_frame`之間的tf,即機器人底盤和雷射雷達之間的變換;一個是`base_frame`與`odom_frame`之間的tf,即底盤和里程計原點之間的座標變換。`odom_frame`可以理解為里程計原點所在的座標系。 - `/scan`:光達數據,類型為`sensor_msgs/LaserScan` - 輸出 - `/tf`: 主要是輸出`map_frame`和`odom_frame`之間的變換 - `slam_gmapping/entropy`:`std_msgs/Float64`類型,反映了機器人姿勢估計的分散程度 - `/map`:slam_gmapping建立的地圖 - `/map_metadata`: 地圖的相關訊息