11. isaacsim4.2教程-Transform 树与Odometry

发布于:2025-07-27 ⋅ 阅读:(14) ⋅ 点赞:(0)

1. 前言

学习目标

在本示例中,你将学习如何:

  • 使用 TF 发布器将相机作为 TF 树的一部分发布

  • 在 TF 上发布机械臂/可动结构(articulation)的树状结构

  • 发布里程计(Odometry)消息


开始之前

前置条件

  • 已完成 “ROS 相机” 和 “URDF 导入:Turtlebot” 教程

  • 已启用 ROS Bridge,且 roscore 正在运行


2. TF 树发布器

假设你已经完成了 ROS 相机教程,并且场景中已有两台相机。接下来,我们要把它们添加到 TF 树里,这样就能实时跟踪它们在全局坐标系中的位置了。

  1. 打开或新建一个 Action Graph

    • 转到 Window → Visual Scripting → Action Graph,打开一个新的或已有的可视化脚本编辑窗口。

  2. 添加 ROS1 Publish Transform Tree 节点

    • 在图中拖入一个 ROS1 Publish Transform Tree 节点。

    • 将它的输入连接到 On Playback Tick(每帧触发)和 Isaac Read Simulation Time(仿真时间)节点,如下示例布局。

  3. 配置目标 Prim

    • 选中 ROS1 Publish Transform Tree 节点,在 Property 面板的 targetPrims 字段中填写:

  4. 查看 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” 选项,或是移动机器人模型。

  1. Stage Tree 中选中机器人的根 Prim,在它的 Raw USD Properties 面板里找到 Articulation Root 部分,点击右上角的 X 将其删除。

  2. 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
  • 在修改属性后,务必先 StopPlay 仿真,以验证 /base_link 是否已成为所有机器人连杆和相机帧的父坐标系。

5. Odometry发布器

把之前的tf图删掉,重新在Odometry中构建,否则会有两个Transform Tree导致冲突!!

要设置Odometry发布器,请按照下图所示构建一个 Action Graph:

  1. Create → Visual Scripting → Action Graph 中新建或打开一个 Action Graph。

  2. 向图中添加以下节点,并用 On Playback Tick 触发它们,每帧执行一次:

    • Isaac Read Simulation Time:读取仿真时间。

    • Isaac Compute Odometry:计算机器人当前位置。

    • ROS1 Publish Odometry:将里程计消息发布到 /odom 话题。

    • ROS1 Publish Transform Tree(或 Raw TF 发布器):将从 /odom/base_link 的单一坐标变换发布到 TF。

  3. Isaac Compute Odometry 节点的属性面板(Property)中,将 Chassis Prim 输入字段设置为你的 TurtleBot 实例(例如 /World/turtlebot3_burger),这样该节点就能根据机器人底盘计算 Odometry

  4. 启动仿真并运行以下命令,查看构建好的 TF 树:rosrun rqt_tf_tree rqt_tf_tree

6. 测试TurtleBot

rosrun rviz rviz,然后添加工具验证功能。


网站公告

今日签到

点亮在社区的每一天
去签到