2025年5月22日 星期四

TF , URDF for ROS2

深入了解 ROS 2 中兩個非常重要的概念:TF (Transforms)URDF (Unified Robot Description Format)

這兩個工具是 ROS 2 用來描述機器人結構、以及處理空間座標轉換的核心。

1. TF (Transforms)

TF (Transforms),在 ROS 2 中稱為 tf2,是一個強大的系統,用於跟蹤多個座標系之間的關係,並隨時間維護它們。它允許開發者提問任何兩個座標系之間的轉換關係,無論這些座標系是如何嵌套的。

為什麼需要 TF?

機器人系統通常由多個部分組成,每個部分都有自己的參考點或座標系。例如:

  • 機器人本體 (Base link): 通常是機器人的中心或驅動輪軸心。
  • 各個關節 (Joints): 每個關節都有一個座標系。
  • 感測器 (Sensors): 例如攝像頭、雷射雷達 (LiDAR),它們安裝在機器人上的特定位置,也有自己的座標系。
  • 世界座標系 (World frame): 一個固定的參考座標系,所有物體相對於它進行定位。
  • 目標物體 (Object frame): 機器人要操作的目標物體可能也有自己的座標系。

當機器人移動、關節轉動或感測器偵測到物體時,這些座標系之間的關係會不斷變化。TF 的作用就是管理這些動態的座標系轉換,讓您能夠:

  • 將一個點、向量或姿態從一個座標系轉換到另一個座標系。 例如,知道攝像頭座標系中的一個點,並想知道它在世界座標系中的位置。
  • 查詢兩個座標系之間的相對轉換關係。 例如,機器人手臂末端執行器相對於基座的位置和姿態。
  • 處理時間戳: TF 能夠處理過去、現在和未來的座標系轉換,這對於處理感測器數據的時間同步非常重要。

TF 的核心組件:

  1. tf2_ros 函式庫: 這是 ROS 2 中實現 TF 功能的核心函式庫。
  2. tf2_ros::TransformBroadcaster 用於發佈 (publish) 座標系轉換。例如,感測器驅動或機器人運動控制器會發佈感測器相對於機器人本體的轉換,或者機器人本體相對於世界座標系的轉換 (由里程計或 SLAM 演算法計算)。
  3. tf2_ros::Buffertf2_ros::TransformListener 用於監聽 (listen) 並緩衝座標系轉換。當一個節點需要查詢兩個座標系之間的轉換時,它會向 TransformListener 查詢,後者會從 Buffer 中獲取轉換數據。
  4. 轉換樹 (Transform Tree): 所有發佈的轉換形成一個樹狀結構,每個節點都是一個座標系,邊代表轉換關係。這使得 TF 能夠計算任何兩個節點之間的轉換路徑。

範例應用:

  • 導航: 機器人需要知道雷射雷達數據相對於自身的位置,以及自身相對於地圖的位置,才能進行導航。
  • 抓取: 機器人手臂需要知道攝像頭看到的物體相對於手臂末端執行器的位置,才能精確抓取。
  • 視覺里程計: 將相機運動轉換為機器人的運動。

2. URDF (Unified Robot Description Format)

URDF (Unified Robot Description Format) 是一種 XML 格式的文件,用於描述機器人的物理和運動學特性。它是 ROS 2 中定義機器人模型的標準方式。

為什麼需要 URDF?

URDF 的主要目的是為 ROS 2 中的各種軟體組件提供一個統一的、標準化的機器人模型。透過 URDF,您可以:

  • 描述機器人的結構: 定義機器人由哪些「連結 (links)」組成,以及這些連結之間如何透過「關節 (joints)」連接。
  • 定義連結的物理特性: 包括連結的質量、慣性矩、視覺外觀 (網格模型) 和碰撞模型。
  • 定義關節的運動學特性: 包括關節的類型 (旋轉、平移、固定等)、運動範圍、速度限制和力矩限制。
  • 整合感測器和執行器: 在機器人模型中定義感測器和執行器的位置和姿態。

URDF 的核心組件:

  1. link (連結): 代表機器人的一個剛體部分。每個連結都有其自身的座標系,通常位於連結的中心或一個方便的參考點。可以為連結定義:
    • <visual> 用於在模擬器 (如 Gazebo) 或可視化工具 (如 RViz2) 中顯示機器人外觀。通常指向一個 3D 模型文件 (例如 .dae.stl)。
    • <collision> 用於碰撞檢測。它定義了機器人某部分的碰撞幾何形狀。
    • <inertial> 定義連結的質量和慣性矩,對於物理模擬非常重要。
  2. joint (關節): 定義兩個連結之間的連接方式以及它們之間的運動關係。每個關節連接一個 parent link 和一個 child link。常見的關節類型包括:
    • revolute (旋轉關節): 允許沿著一個軸旋轉 (例如,機器人手臂的肘部)。
    • continuous (連續旋轉關節): 類似 revolute 但沒有角度限制 (例如,車輪)。
    • prismatic (平移關節): 允許沿著一個軸平移 (例如,線性滑軌)。
    • fixed (固定關節): 表示兩個連結之間沒有相對運動,它們是固定的。
    • <origin> 定義 child 連結相對於 parent 連結的初始位置和姿態。
    • <axis> 定義關節的旋轉或平移軸。
    • <limit> 定義關節的運動範圍、速度和力矩限制。

URDF 的優勢:

  • 統一性: 一個 URDF 文件就可以完整描述機器人,供 ROS 2 的不同工具使用。
  • 可視化: ROS 2 的可視化工具 RViz2 可以直接讀取 URDF 文件來顯示機器人模型。
  • 模擬: 物理模擬器 (如 Gazebo) 可以解析 URDF 文件來模擬機器人的物理行為。
  • 運動學和動力學: 運動學函式庫 (如 KDL, MoveIt!) 可以從 URDF 中提取機器人的運動學鏈條進行計算。
  • 參數化: 透過使用 Xacro (XML Macros),可以使 URDF 文件更具模組化和參數化,方便描述複雜或相似的機器人。

URDF 與 TF 的關係:

URDF 定義了機器人各個連結之間的初始靜態轉換 (Static Transforms)。當機器人的關節移動時,ROS 2 中的 robot_state_publisher 節點會讀取 URDF 文件以及來自關節狀態 (Joint State) 訊息的動態關節值,然後計算並將所有連結之間的動態轉換廣播到 TF 系統中。

簡單來說:

  • URDF 告訴 ROS 2 機器人長什麼樣子,各個部件如何連接。
  • TF 告訴 ROS 2 機器人各個部件此刻在空間中的位置和姿態。

兩者協同工作,為 ROS 2 應用提供了完整的機器人空間感知和運動學基礎。理解這兩個概念對於開發任何基於 ROS 2 的機器人應用都至關重要。

沒有留言:

張貼留言