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,然后添加工具验证功能。