View Categories

TurtleBot3(ROS1)-Noetic-Chap4-SLAM-建圖定位

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 方法。 #

1. 在 Remote PC 安裝相關套件。(跟 Gampping 相關的套件,在章節 3.1. PC Setup 時,就已經安裝好)

2. 執行 Gmapping SLAM node

[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
				
			

1. 在 Remote PC 安裝相關套件。

[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. 開始探索及繪製地圖

slam running for mapping

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 #

此參數定義地圖更新的時間(以秒為單位)。如果此值設置越小,地圖更新頻率會更頻繁,此時電腦就需要更大的計算量。設置這個參數取決於你的環境。

tuning 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. 儲存地圖 #

地圖會根據機器人移動時的 odometry 測距數據,tf,及感測器掃描的資訊來建圖。當 TB3 移動時,地圖數據會呈現在 RViz 視窗。在建好所需區域的完整地圖後,將地圖資料儲存在硬碟以備後續使用。

1. 啟用在 map_server package 中的 map_saver node 來產生地圖檔。

地圖檔會儲存在 map_saver node 所在的資料夾。除非另外命名,map 是預設的地圖檔名,會產生 map.pgm 及 map.yaml 兩個檔。

[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 導航中使用。

map

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

large map