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
字段中填写:
- 选中 ROS1 Publish Transform Tree 节点,在 Property 面板的
-
查看 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的选项,又找不到:
只能通过代码修改:
python
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,然后添加工具验证功能。
