以下將介紹如何在 ROS 環境下使用 slam_toolbox
進行簡易的 SLAM (同步定位與地圖構建)。
本介紹將涵蓋安裝、基本使用以及一些常見的配置。
注意:
#本教學假設您已經安裝了 ROS (Robot Operating System)
#有一個可以發布雷射掃描 (LaserScan) 數據和里程計 (Odometry) 數據的機器人模型或模擬環境。
1. 安裝 slam_toolbox
打開您的終端機,並根據您使用的 ROS 發行版執行相應的指令:
ROS Melodic:
sudo apt update
sudo apt install ros-melodic-slam-toolbox
ROS Noetic:
sudo apt update
sudo apt install ros-noetic-slam-toolbox
ROS 2 (例如 Foxy, Galactic, Humble, Iron):
sudo apt update
sudo apt install ros-<您的ROS2發行版>-slam-toolbox
將 <您的ROS2發行版>
替換為您實際使用的 ROS 2 發行版名稱 (例如 foxy
, galactic
, humble
, iron
)。
2. 準備您的機器人模型和感測器資料
slam_toolbox
需要以下資訊才能正常運作:
- 雷射掃描資料 (
sensor_msgs/LaserScan
): 這是 SLAM 的主要感測器輸入,提供環境的距離資訊。您需要確保您的機器人發布到一個 ROS topic 上,例如/scan
。 - 里程計資料 (
nav_msgs/Odometry
): 里程計提供機器人運動的估計,雖然slam_toolbox
也可以在沒有里程計的情況下運行 (僅依賴雷射),但通常結合里程計可以提供更準確和一致的結果。您的機器人應該發布里程計資訊到一個 ROS topic 上,例如/odom
。 - TF (Transformations):
slam_toolbox
需要知道雷射掃描器相對於機器人基座 (base_link
) 的位置,以及里程計框架 (odom
) 相對於機器人基座的轉換。這些轉換通常由您的機器人模型 (例如 URDF) 和robot_state_publisher
節點發布。
請確保您已經啟動了您的機器人模型和必要的感測器驅動程式,並且可以透過 rostopic echo
命令看到 /scan
和 /odom
(如果有的話) topic 上發布的數據。同時,使用 rosrun tf tf_echo <odom_frame> <base_frame>
和 rosrun tf tf_echo <base_frame> <laser_frame>
檢查 TF 轉換是否正確發布。將 <odom_frame>
替換為您的里程計框架名稱 (通常是 odom
),<base_frame>
替換為您的機器人基座框架名稱 (通常是 base_link
),<laser_frame>
替換為您的雷射掃描器框架名稱 (通常在 URDF 中定義)。
3. 啟動 slam_toolbox
slam_toolbox
提供不同的啟動檔案來運行 SLAM,您可以根據您的需求選擇。最常用的啟動檔案是 online_async.launch.py
(ROS 2) 或 online_sync.launch
(ROS 1)。
ROS 2: 打開一個新的終端機,並執行以下命令:
ros2 launch slam_toolbox online_async_launch.py
您可能需要根據您的機器人模型和感測器 topic 名稱調整一些參數。您可以透過在啟動命令中添加參數來覆蓋預設值。例如,如果您的雷射掃描 topic 是 /my_laser_scan
,您可以這樣啟動:
ros2 launch slam_toolbox online_async_launch.py scan_topic:=/my_laser_scan
同樣地,您可以設定里程計 topic (odom_topic
) 和 TF 框架名稱 (base_frame
, odom_frame
, map_frame
等)。您可以創建一個自己的啟動檔案來管理這些參數。
ROS 1: 打開一個新的終端機,並執行以下命令:
roslaunch slam_toolbox online_sync.launch
類似地,您可以透過 roslaunch
的參數來調整 topic 名稱和框架名稱:
roslaunch slam_toolbox online_sync.launch scan_topic:=/my_laser_scan
online_async
和 online_sync
的主要區別在於它們處理感測器資料的方式。async
模式在接收到資料時盡快處理,而 sync
模式則等待所有相關感測器資料到達後再一起處理。通常 async
模式更常用,特別是在資料速率較高的情況下。
4. 可視化地圖
要查看 slam_toolbox
建立的地圖,您需要啟動 Rviz。
ROS 2:
ros2 run rviz2 rviz2
ROS 1:
rosrun rviz rviz
在 Rviz 中,按照以下步驟添加地圖可視化:
- 點擊 Rviz 視窗底部的 "Add" 按鈕。
- 在彈出的視窗中,找到 "By topic" 選項卡。
- 尋找名為
/map
的 topic,並選擇 "Map" 類型進行添加。
如果一切正常,您應該能在 Rviz 視窗中看到 slam_toolbox
根據您的感測器資料建立的二維地圖。隨著您的機器人在環境中移動,地圖將會不斷更新。
5. 儲存地圖
一旦您完成了環境的建圖,您可以使用 map_saver
工具將地圖儲存為圖像檔案 (.pgm
) 和地圖元資料檔案 (.yaml
)。
ROS 2: 打開一個新的終端機,並執行以下命令:
ros2 run nav2_map_server map_saver -f <地圖檔案名稱>
將 <地圖檔案名稱>
替換為您想要儲存的地圖檔案名稱 (不包含副檔名)。地圖檔案和元資料檔案將會儲存在您執行此命令的目錄下。
ROS 1: 打開一個新的終端機,並執行以下命令:
rosrun map_server map_saver -f <地圖檔案名稱>
同樣地,將 <地圖檔案名稱>
替換為您想要儲存的地圖檔案名稱。
6. 配置 slam_toolbox
參數 (進階)
slam_toolbox
提供了許多可以調整的參數,以適應不同的環境和感測器特性。這些參數通常在 YAML 檔案中定義,並透過啟動檔案載入。您可以找到 slam_toolbox
的預設參數檔案在 /opt/ros/<您的ROS發行版>/share/slam_toolbox/config/
目錄下。
常見的配置參數包括:
odom_frame
、base_frame
、map_frame
: 定義 TF 框架的名稱。scan_topic
、odom_topic
: 定義雷射掃描和里程計資料的 topic 名稱。- 雷射掃描過濾參數: 例如
max_range
、min_range
。 - 掃描匹配參數: 控制如何將新的雷射掃描與現有地圖對齊。
- 迴路閉合 (Loop Closure) 參數: 控制如何檢測和處理機器人回到已訪問區域的情況。
- 地圖解析度 (
resolution
)、地圖大小 (width
,height
)。
要使用自訂的參數檔案,您可以創建一個新的 YAML 檔案,並在啟動 slam_toolbox
時指定它:
ROS 2:
ros2 launch slam_toolbox online_async_launch.py params_file:=/path/to/your/custom_params.yaml
ROS 1:
roslaunch slam_toolbox online_sync.launch _params_file:=/path/to/your/custom_params.yaml
請仔細閱讀 slam_toolbox
的文件和預設參數檔案中的註釋,以了解每個參數的作用。調整這些參數可能需要一些實驗,以獲得最佳的 SLAM 性能。
總結
這是一個使用 slam_toolbox
在 ROS 環境下進行簡易 SLAM 的基本介紹。通過安裝 slam_toolbox
,準備好您的感測器資料和 TF 轉換,啟動 slam_toolbox
節點,並使用 Rviz 可視化地圖,您可以開始建立您的機器人環境地圖。最後,您可以使用 map_saver
工具儲存建立的地圖,並可以根據需要調整 slam_toolbox
的參數以獲得更好的性能。
建議您查閱 slam_toolbox
的官方 GitHub 頁面 (
沒有留言:
張貼留言