1. 前言
學習目標
在本示例中,你將學習如何:
使用 TF 發布器將相機作為 TF 樹的一部分發布
在 TF 上發布機械臂/可動結構(articulation)的樹狀結構
發布里程計(Odometry)消息
開始之前
前置條件
已完成 “ROS 相機” 和 “URDF 導入:Turtlebot” 教程
已啟用 ROS Bridge,且
roscore
正在運行
2. TF 樹發布器
假設你已經完成了 ROS 相機教程,并且場景中已有兩臺相機。接下來,我們要把它們添加到 TF 樹里,這樣就能實時跟蹤它們在全局坐標系中的位置了。
打開或新建一個 Action Graph
轉到 Window → Visual Scripting → Action Graph,打開一個新的或已有的可視化腳本編輯窗口。
添加 ROS1 Publish Transform Tree 節點
在圖中拖入一個 ROS1 Publish Transform Tree 節點。
將它的輸入連接到 On Playback Tick(每幀觸發)和 Isaac Read Simulation Time(仿真時間)節點,如下示例布局。
配置目標 Prim
選中 ROS1 Publish Transform Tree 節點,在 Property 面板的
targetPrims
字段中填寫:
查看 TF 樹 : rostopic echo /tf
3.?關節式機器人坐標變換
要獲取關節式機器人中每個連桿(linkage)的坐標變換,只需將機器人的根 Articulation Root 加入 targetPrims
字段。Articulation Root 之后的所有連桿都會被自動發布。
在
targetPrims
字段中添加:
/World/turtlebot3_burger
在 ROS 終端運行:?rostopic echo /tf
驗證機器人所有連桿(無論是固定的還是可動的)的變換是否都發布到了 /tf
話題。
重要提示
如果你發現對關節式機器人生成的 TF 樹選錯了根連桿(root link),可以手動指定 Articulation Root。
這種情況常見于使用 URDF Importer 導入機器人時,勾選了 “Merge Fixed Link” 選項,或是移動機器人模型。
在 Stage Tree 中選中機器人的根 Prim,在它的 Raw USD Properties 面板里找到 Articulation Root 部分,點擊右上角的
X
將其刪除。在 Stage Tree 中選中你想設為根的連桿,在它的 Raw USD Properties 面板里點擊
+ ADD
,選擇 Physics > Articulation Root,將其添加。
我是通過python腳本修改的,因為我沒有添加root的選項,又找不到:
只能通過代碼修改:
from pxr import Usd, UsdPhysics, UsdGeom# 打開當前 Stage
stage = Usd.Stage.Open("path/to/your/scene.usd")# 定位到你的機器人根 Xform(比如:/World/robot_root)
robot_root = stage.GetPrimAtPath("/World/robot_root")
if not robot_root:raise RuntimeError("找不到 /World/robot_root")# 確保它是一個 Xform
UsdGeom.XformCommonAPI(robot_root).GetResetXformStack()# 給它附上 ArticulationRoot API
UsdPhysics.ArticulationRootAPI.Apply(robot_root)# 保存
stage.GetRootLayer().Save()
4.?發布相對坐標變換
????????默認情況下,所有變換都是相對于世界坐標系(/World
)。例如,你可以看到 TurtleBot 的 /base_link
變換是相對于 /World
發布的。
如果想讓變換相對于其他坐標系(比如某個相機),請在 parentPrim
字段中指定該父坐標系。
本示例中,我們希望 TurtleBot 的所有 Prim 都以 /base_link
作為父坐標系:
- 在
parentPrim
字段中填入:
/World/turtlebot3_burger/base_link
- 在修改屬性后,務必先 Stop 再 Play 仿真,以驗證
/base_link
是否已成為所有機器人連桿和相機幀的父坐標系。
5. Odometry發布器
把之前的tf圖刪掉,重新在Odometry中構建,否則會有兩個Transform Tree,導致沖突!!!
要設置Odometry發布器,請按照下圖所示構建一個 Action Graph:
在 Create → Visual Scripting → Action Graph 中新建或打開一個 Action Graph。
向圖中添加以下節點,并用 On Playback Tick 觸發它們,每幀執行一次:
Isaac Read Simulation Time:讀取仿真時間。
Isaac Compute Odometry:計算機器人當前位置。
ROS1 Publish Odometry:將里程計消息發布到
/odom
話題。ROS1 Publish Transform Tree(或 Raw TF 發布器):將從
/odom
到/base_link
的單一坐標變換發布到 TF。
在 Isaac Compute Odometry 節點的屬性面板(Property)中,將 Chassis Prim 輸入字段設置為你的 TurtleBot 實例(例如
/World/turtlebot3_burger
),這樣該節點就能根據機器人底盤計算 Odometry 。啟動仿真并運行以下命令,查看構建好的 TF 樹:
rosrun rqt_tf_tree rqt_tf_tree
6. 測試TurtleBot
rosrun rviz rviz,然后添加工具驗證功能。