2025年4月7日 星期一

ROS 安裝 slam_toolbox

以下將介紹如何在 ROS 環境下使用 slam_toolbox 進行簡易的 SLAM (同步定位與地圖構建)。

本介紹將涵蓋安裝、基本使用以及一些常見的配置。

注意: 

#本教學假設您已經安裝了 ROS (Robot Operating System) 

#有一個可以發布雷射掃描 (LaserScan) 數據和里程計 (Odometry) 數據的機器人模型或模擬環境。


1. 安裝 slam_toolbox

打開您的終端機,並根據您使用的 ROS 發行版執行相應的指令:

ROS Melodic:

Bash
sudo apt update
sudo apt install ros-melodic-slam-toolbox

ROS Noetic:

Bash
sudo apt update
sudo apt install ros-noetic-slam-toolbox

ROS 2 (例如 Foxy, Galactic, Humble, Iron):

Bash
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: 打開一個新的終端機,並執行以下命令:

Bash
ros2 launch slam_toolbox online_async_launch.py

您可能需要根據您的機器人模型和感測器 topic 名稱調整一些參數。您可以透過在啟動命令中添加參數來覆蓋預設值。例如,如果您的雷射掃描 topic 是 /my_laser_scan,您可以這樣啟動:

Bash
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: 打開一個新的終端機,並執行以下命令:

Bash
roslaunch slam_toolbox online_sync.launch

類似地,您可以透過 roslaunch 的參數來調整 topic 名稱和框架名稱:

Bash
roslaunch slam_toolbox online_sync.launch scan_topic:=/my_laser_scan

online_asynconline_sync 的主要區別在於它們處理感測器資料的方式。async 模式在接收到資料時盡快處理,而 sync 模式則等待所有相關感測器資料到達後再一起處理。通常 async 模式更常用,特別是在資料速率較高的情況下。

4. 可視化地圖

要查看 slam_toolbox 建立的地圖,您需要啟動 Rviz。

ROS 2:

Bash
ros2 run rviz2 rviz2

ROS 1:

Bash
rosrun rviz rviz

在 Rviz 中,按照以下步驟添加地圖可視化:

  1. 點擊 Rviz 視窗底部的 "Add" 按鈕。
  2. 在彈出的視窗中,找到 "By topic" 選項卡。
  3. 尋找名為 /map 的 topic,並選擇 "Map" 類型進行添加。

如果一切正常,您應該能在 Rviz 視窗中看到 slam_toolbox 根據您的感測器資料建立的二維地圖。隨著您的機器人在環境中移動,地圖將會不斷更新。

5. 儲存地圖

一旦您完成了環境的建圖,您可以使用 map_saver 工具將地圖儲存為圖像檔案 (.pgm) 和地圖元資料檔案 (.yaml)。

ROS 2: 打開一個新的終端機,並執行以下命令:

Bash
ros2 run nav2_map_server map_saver -f <地圖檔案名稱>

<地圖檔案名稱> 替換為您想要儲存的地圖檔案名稱 (不包含副檔名)。地圖檔案和元資料檔案將會儲存在您執行此命令的目錄下。

ROS 1: 打開一個新的終端機,並執行以下命令:

Bash
rosrun map_server map_saver -f <地圖檔案名稱>

同樣地,將 <地圖檔案名稱> 替換為您想要儲存的地圖檔案名稱。

6. 配置 slam_toolbox 參數 (進階)

slam_toolbox 提供了許多可以調整的參數,以適應不同的環境和感測器特性。這些參數通常在 YAML 檔案中定義,並透過啟動檔案載入。您可以找到 slam_toolbox 的預設參數檔案在 /opt/ros/<您的ROS發行版>/share/slam_toolbox/config/ 目錄下。

常見的配置參數包括:

  • odom_framebase_framemap_frame: 定義 TF 框架的名稱。
  • scan_topicodom_topic: 定義雷射掃描和里程計資料的 topic 名稱。
  • 雷射掃描過濾參數: 例如 max_rangemin_range
  • 掃描匹配參數: 控制如何將新的雷射掃描與現有地圖對齊。
  • 迴路閉合 (Loop Closure) 參數: 控制如何檢測和處理機器人回到已訪問區域的情況。
  • 地圖解析度 (resolution)、地圖大小 (width, height)。

要使用自訂的參數檔案,您可以創建一個新的 YAML 檔案,並在啟動 slam_toolbox 時指定它:

ROS 2:

Bash
ros2 launch slam_toolbox online_async_launch.py params_file:=/path/to/your/custom_params.yaml

ROS 1:

Bash
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 頁面 (https://github.com/SteveMacenski/slam_toolbox) 和 ROS Wiki 頁面 (http://wiki.ros.org/slam_toolbox) 以獲取更詳細的資訊和進階用法。

沒有留言:

張貼留言