View Categories

TurtleBot3(ROS2)-Humble-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. 在 TB3 SBC 執行(Bringup)基本套件來開始 TB3 應用。如已執行 Bringup,可跳過此步驟

  • 在 Remote PC 開新的 terminal (Ctrl + Alt + T),連上 SBC 的 IP address。預設密碼是 ubuntu

[Remote PC]

				
					$ ssh ubuntu@{IP_ADDRESS_OF_RASPBERRY_PI}
				
			
  • 指定 TURTLEBOT3_MODEL 的參數,需設定為 burger, waffle, 或 waffle_pi。

[TurtleBot3 SBC]

				
					$ export TURTLEBOT3_MODEL=burger
$ ros2 launch turtlebot3_bringup robot.launch.py
				
			

2. 在 Remote PC 開新的 terminal, 啟動 SLAM 節點。Cartographer 是預設的 SLAM 方法。另外指定 TURTLEBOT3_MODEL 的參數,需設定為 burger, waffle, 或 waffle_pi。

[Remote PC]

				
					$ export TURTLEBOT3_MODEL=burger
$ ros2 launch turtlebot3_cartographer cartographer.launch.py
				
			
platform cartographer

補充資料:如何預先定義好 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
				
			

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
$ ros2 run turtlebot3_teleop teleop_keyboard

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 微調指南 #

在 ROS2 中的 SLAM 方法,是使用 Cartographer ROS,它透過 Lua 檔案提供設定選項。

以下選項,定義在 turtlebot3_cartographer/config/turtlebot3_lds_2d.lua 檔案中。有關每個選項的更多詳細信息,請參閱 Cartographer ROS 官方文件

C4.3.1. MAP_BUILDER.use_trajectory_builder_2d #

此選項設定 SLAM 的種類

C4.3.2. TRAJECTORY_BUILDER_2D.min_range #

此選項設定 LDS 光達的最小可用範圍。

C4.3.3. TRAJECTORY_BUILDER_2D.max_range #

此選項設定 LDS 光達的最大可用範圍。

C4.3.4. TRAJECTORY_BUILDER_2D.missing_data_ray_length #

在 2D SLAM 中,Cartographer 用 TRAJECTORY_BUILDER_2D.missing_data_ray_length 取代超過 max_range 最大可用範圍。

C4.3.5. TRAJECTORY_BUILDER_2D.use_imu_data #

如果你使用 2D SLAM,就可以即時處理範圍資料,而無需額外的資訊來源。因此你可以選擇,是否希望 Cartographer 使用 IMU 慣性測量單元的資料。

C4.3.6. TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching #

local SLAM (局部 SLAM):可以根據感測器的可靠性,切換 RealTimeCorrelativeScanMatcher

C4.3.7. TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians #

local SLAM(局部 SLAM):為了避免在每個子圖上,插入太多掃描數據,如果運動不超過某個角度,則會丟棄掃描。

C4.3.8. POSE_GRAPH.optimize_every_n_nodes #

Global SLAM(全域 SLAM):將 POSE_GRAPH.optimize_every_n_nodes 設為 0,是一個方便的方法,可以停用全域 SLAM 並專注於局部 SLAM 的行為。

C4.3.9. POSE_GRAPH.constraint_builder.min_score #

Global SLAM(全域 SLAM):掃描匹配分數的閾值,低於此閾值則不考慮匹配。低分數表示,掃描結果和地圖看起來不相似。

C4.3.10. POSE_GRAPH.constraint_builder.global_localization_min_score #

Global SLAM(全域 SLAM):低於此閾值的全域定位,將不受信任。

C4.4. 儲存地圖 #

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

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

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

[Remote PC]

				
					$ ros2 run nav2_map_server map_saver_cli -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