C4. SLAM 建圖定位 #
SLAM(Simultaneous Localization and Mapping) 即時定位與地圖構建, 是一種繪製地圖的技術,可在任一空間中估算當前的位置. 以下的影片展示 TurtleBot3, 如何使用 SLAM 技術,來精確的繪製地圖.
影片說明: (內容可能隨時更新,恕不另行通知)
- 機器人: TurtleBot3 Burger
- 感測器: LiDAR 光達(Laser Distance Sensor)
- ROS 套件: Gmapping / Cartographer
- 地點: ROBOTIS 實驗室及總部 15 樓走廊
- 時間長: 55 分
- 距離: 共計 351 公尺
影片說明: (內容可能隨時更新,恕不另行通知)
- 機器人: TurtleBot3 Burger and Waffle
- 感測器: LiDAR 光達(Laser Distance Sensor, LDS-01)
- ROS 套件: Gmapping
- 地點: ROBOTIS 總部教室
- 時間長: 約 4 分
- 距離: 共計 15 公尺
C4.1. 執行 SLAM node #
1. 從 Remote PC 執行 roscore
[Remote PC]
$ roscore
2. 在 TB3 SBC 執行(Bringup)基本套件來開始 TB3 應用。如已執行 Bringup,可跳過此步驟
- 在 Remote PC 開新的 terminal (Ctrl + Alt + T),連上 SBC 的 IP address。預設密碼是 turtlebot。
- 指定 TURTLEBOT3_MODEL 的參數,需設定為 burger, waffle, 或 waffle_pi。
[Remote PC]
$ ssh pi@{IP_ADDRESS_OF_RASPBERRY_PI}
$ export TURTLEBOT3_MODEL=${TB3_MODEL}
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
3. 在 Remote PC 開新的 terminal, 啟動 SLAM 節點。GMapping 是預設的 SLAM 方法。另外指定 TURTLEBOT3_MODEL 的參數,需設定為 burger, waffle, 或 waffle_pi。
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
補充資料:如何預先定義好 TURTLEBOT3_MODEL 參數。 #
如果 TURTLEBOT3_MODEL 參數,已經預先定義在你系統的 .bashrc 檔內,則 export TURTLEBOT3_MODEL=${TB3_MODEL} 指令可以省略。當新的 terminal 開啟時,.bashrc 檔會自動載入。
- 在 .bashrc 檔內,定義 TurtleBot3 Burger 為預設 model 範例
[Remote PC]
$ echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc
$ source ~/.bashrc
- 在 .bashrc 檔內,定義 TurtlBot3 waffle_pi 為預設 model 範例
[Remote PC]
$ echo 'export TURTLEBOT3_MODEL=waffle_pi' >> ~/.bashrc
$ source ~/.bashrc
補充資料:了解其他的 SLAM 方法。 #
[Remote PC]
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
1. 在 Remote PC 下載及 build 相關套件。
Cartographer 套件由 Google 開發,但目前並沒有支援 ROS1 Noetic 的 binary 安裝檔。如要在 Noetic 使用本套件,你應該下載原始碼後 build 此套件。詳情可參考官方 wiki 頁面。
[Remote PC]
$ sudo apt update
$ sudo apt install -y python3-wstool python3-rosdep ninja-build stow
$ cd ~/catkin_ws/src
$ wstool init src
$ wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall
$ wstool update -t src
$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro=noetic -y
$ src/cartographer/scripts/install_abseil.sh
$ sudo apt remove ros-noetic-abseil-cpp
$ catkin_make_isolated --install --use-ninja
2. 啟動 Cartographer SLAM node
[Remote PC]
$ source ~/catkin_ws/install_isolated/setup.bash
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=cartographer
[Remote PC]
$ sudo apt install ros-noetic-slam-karto
2. 啟動 Karto SLAM node
[Remote PC]
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=karto
C4.2. 執行遙控 Teleoperation Node #
一旦 SLAM node 成功執行,TB3 就可使用遙控 teleoperation,開始對未知區域繪製地圖。此時重要的是,應避免機器人做出劇烈的移動,比如直線速度變化太快,或旋轉太快。使用機器人繪製地圖時,機器人最好能掃描,地圖環境內的每個角落。它需要一些經驗來建立一個乾淨的地圖,所以我們需要多次練習 SLAM,以學習建圖技巧。
1. 在 Remote PC 開新 terminal 執行 teleoperation node。TURTLEBOT3_MODEL 參數需對應好 – burger,waffle,waffle_pi
[Remote PC]
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
Control Your TurtleBot3!
---------------------------
Moving around:
w
a s d
x
w/x : increase/decrease linear velocity
a/d : increase/decrease angular velocity
space key, s : force stop
CTRL-C to quit
2. 開始探索及繪製地圖

C4.3. Tuning 微調指南 #
對於不同的環境,Gmapping 有許多參數可以用來改變其效能。你可以在 ROS Wiki 網頁了解全部的參數,或參考 ROS Robot Programming 書(簡中pdf)的 Chapter 11 章。
本節微調指南會提供一些提示,供你配置一些重要參數。如果你想根據你的環境,來優化 SLAM 效能,這些提示可能會幫助你並節省你的時間。
以下的各參數,定義於 turtlebot3_slam/config/gmapping_params.yaml 檔內
C4.3.1. maxUrange #
此參數設定光達最大可用範圍
C4.3.2. map_update_interval #
此參數定義地圖更新的時間(以秒為單位)。如果此值設置越小,地圖更新頻率會更頻繁,此時電腦就需要更大的計算量。設置這個參數取決於你的環境。

C4.3.3. minimumScore #
此參數設定感測器掃描數據匹配結果,是成功或失敗的最小分數值。這可以減少機器人在大區域範圍內的預期位置的誤差。如果設置適當,可以看到以下類似資訊。
Average Scan Matching Score=278.965
neff= 100
Registering Scans:Done
update frame 6
update ld=2.95935e-05 ad=0.000302522
Laser Pose= -0.0320253 -5.36882e-06 -3.14142
如果設置太高,則會看到下列警示
Scan Matching Failed, using odometry. Likelihood=0
lp:-0.0306155 5.75314e-06 -3.14151
op:-0.0306156 5.90277e-06 -3.14151
C4.3.4. linearUpdate #
當機器人移動大於此值後,掃描一次
C4.3.5. angularUpdate #
當機器人轉動大於此值後,掃描一次。最好設數值小於 linearUpdate 較佳。
C4.4. 儲存地圖 #
[Remote PC]
$ rosrun map_server map_saver -f ~/map
-f 選項,是用來指定資料夾位置,以及要儲存的檔名。以上的指令,是指 map.pgm 及 map.yaml 檔,會被儲存在 home 資料夾 ~/ 內(e.g., /home/${username}).
C4.5. 地圖 #
地圖是 ROS 社群中常用的二維 Occupancy Grid Map(OGM) 地圖。儲存的地圖大略如下圖所示,白色是機器人可以移動的空白區域,黑色是機器人不能移動的佔用區域,灰色則是未知區域。地圖可在 Chap.5 Navigation 導航中使用。

下圖顯示了使用 TurtleBot3 創建大型地圖的結果。花了大約一個小時才製作出一幅移動距離約為 350 公尺的地圖。
