在本示例中,我们将学习如何:
-
向场景中添加额外的相机并将其安装在机器人上
-
添加相机发布器(Camera Publishers)
-
通过 rostopics 发送真实的合成感知数据(ground truth synthetic perception data)
前提条件
-
已完成 ROS 的安装:包括安装 ROS,启用 ROS 扩展,构建提供的 Isaac Sim ROS 工作区,并设置必要的环境变量。
-
了解 ROS 主题(rostopic)的基本知识,以及发布器(Publisher)和订阅器(Subscriber)是如何工作的。
-
已完成 OmniGraph 和 添加相机与传感器(Add Camera and Sensors)的教程。
-
已完成 URDF 导入(TurtleBot)和通过 ROS 消息控制 TurtleBot 的教程,确保场景中已加载好一个 TurtleBot。
-
roscore
正在运行。
1. 相机发布器(Camera Publisher)
设置相机(Setting up Cameras)
在视图中默认显示的相机是"透视相机"(Perspective Camera)。你可以通过视图窗口左上角的"Camera"按钮来确认这一点。点击"Camera"按钮后,你会看到其他一些预设的相机视角,例如:顶部视角(Top)、正面视角(Front)和右侧视角(Right Side)。
为了本教程的目的,我们将添加两个固定(stationary)相机,命名为 Camera_1
和 Camera_2
,它们将从不同的角度观察房间。添加相机到舞台的具体方法可以参考"添加相机与传感器(Add Camera and Sensors)"教程。
你可能希望打开多个视图窗口(Viewports)以同时查看多个相机视角。打开额外视图窗口的方法如下:
依次点击 Window -> Viewport -> Viewport 2
打开新的视图窗口,并在该视图窗口的左上角点击 "Camera" 按钮,选择你想要显示的相机视角。
bash
./isaac-sim.sh --/rendergraph/mgpu/backend=copyQueue --/app/gatherRenderResults=1 --/app/uiGather=0

一个相机在墙上,一个相机和小车绑定,运行上节的ros命令就可以控制小车移动
为 RGB 图像发布器构建图
-
打开可视化脚本编辑器(Visual Scripting) :
点击菜单栏中的
Window > Visual Scripting > Action Graph
。 -
新建或编辑 Action Graph :
在 Action Graph 窗口中,点击中间的"新建 Action Graph(New Action Graph)"图标,
如果你想将相机发布器添加到已有的图中,也可以点击"编辑 Action Graph(Edit Action Graph)"。
-
构建 Action Graph :
根据下图所示,创建包含各个节点及其连接关系的图,
并按照下方表格设置每个节点的参数。


这里要选到相机本体,不能选到相机的xform

图的说明(Graph Explained)
Isaac Create Render Product
此节点用于创建一个渲染产品(Render Product)对象,从指定的摄像机节点(camera prim)获取渲染数据,并输出渲染产品的路径。你可以通过勾选或取消 enabled
字段来启用或禁用该渲染。
ROS1 Camera Helper
该节点用于指定发布的数据类型(如 RGB 图像),并定义将其发布到哪个 ROS 话题(rostopic),以及设置该消息所用的坐标系帧(frameId)。
Camera Helper 节点说明(Camera Helper Node)
Camera Helper 节点实际上封装了一个 复杂的后处理网络,使用户无需手动构建底层图。
当你点击 "播放(Play)" 并且图中包含 Camera Helper 节点时,会自动生成一个新的图。你可以在 Action Graph 窗口左上角的图标列表中看到它,路径为:

/Render/PostProcess/SDGPipeline

这个图是由 Camera Helper 节点自动创建的,它的作用是:
-
从你用
Isaac Create Render Product
节点创建的 Render Product 中,拉取原始渲染帧(也就是相机拍到的像素数据) -
把渲染帧做一系列加工:格式转换(比如从 GPU buffer 转成 CPU 可读的图像)、必要的打包或压缩、以及你在 Helper 节点里指定的深度图、语义分割、RGB 等模式对应的处理。
-
最后把处理好的数据打包成 ROS 消息(sensor_msgs/Image、sensor_msgs/CameraInfo 等),并发送到你在
ROS1 Camera Helper
节点里配置的/rgb
话题。
⚠️ 注意 :这个图只在当前会话(session)中有效,不会被保存为你的资产(asset)的一部分,也不会出现在 Stage 树中。
深度与其他感知真值数据
除了 RGB 图像外,任何相机还可获取以下合成传感器和感知信息:
-
相机信息(Camera Info)
包含相机内参(焦距、光学中心、畸变系数等),便于后续做几何校正或点云投影。
-
深度(Depth)
以每像素深度图形式输出,从相机到场景中各像素点的距离(单位通常是米)。
-
点云(Point Cloud)
将深度信息和相机内参结合,生成三维点集,可以更直观地做空间感知和障碍物检测。
在进行以下"边界框"和"语义标注"发布前,请先参考Isaac Sim Replicator教程,学习如何给场景添加语义标签(semantic annotation):
-
2D 紧边界框(BoundingBox 2D Tight)
-
2D 松边界框(BoundingBox 2D Loose)
-
3D 边界框(BoundingBox 3D)
-
语义标签(Semantic labels)
-
实例标签(Instance labels)
每个 Camera Helper 节点 一次只能检索一种数据类型 。你在节点属性面板的 type
下拉菜单中选定后:
-
启动仿真、生成底层
/Render/PostProcessing/SDGPipeline
-
该节点就锁定为所选类型,无法再修改重用
-
如果要改类型,只能新建另一个 Camera Helper,或重新加载 Stage(重建管道)
在 Isaac Sim 自带的示例场景中,有一个同时为多台相机发布多个话题的完整案例,路径为:
bash
Isaac/Samples/ROS/Scenario/turtlebot_tutorial.usd
你可以打开它,看看是如何组织多个 Camera Helper、分别输出 RGB、Depth、Segmentation、BoundingBox 等话题的。

2.验证 ROS 连接
-
使用以下命令来查看正在传输的原始消息:
rostopic echo /rgb
你会在终端中看到该话题上不断刷新的原始数据。
-
查看发布的图像:在新的终端中(已
source
好 ROS 环境),确保roscore
正在运行,模拟器也在"Play"状态。运行下面的命令:bashrosrun image_view image_view image:=/rgb
这样就能打开一个窗口,实时显示发布到
/rgb
话题的图像------它应当和你在视口里看到的画面一模一样。
如果你在视口中移动摄像机,图片也会同步"摇摆",就像为你的仿真环境开了场"直播"!
我们也可以在 RViz 中查看图像:
-
打开一个新的终端,并 source 好你的 ROS 环境;
-
输入命令:rviz
-
在左侧 Displays 面板中,点击 "Add" → 选择 "Image"
-
在新加入的 Image Display 项里,将其 Topic 字段设置为与你在 Camera Helper 节点中配置的 topicName 一致------在本例中即:/rgb
这样你就能在 RViz 中实时看到从仿真相机发布出来的图像流啦!

如果遇到了问题,可以删除render,重建图,然后play,每次都会创建新的replicator,有些报错可以这样解决,甚至重启一个isaacsim。

我第一次rviz也没有出现rgb的图像,然后一查发现
bash
rosrun image_view image_view image:=/rgb
这个图像也不会出现了,rostopic echo /rgb也没内容了,不知道什么原因,重启之后重新play就都解决了
3. ROS时钟
在本例中,我们将:
-
简要讨论ROS时钟的发布者和订阅者
-
发布仿真时间作为Clock消息到ROS
-
订阅ROS Clock消息
仿真时间与时钟
为了使外部ROS节点与仿真时间同步,通常会使用一个时钟话题。许多ROS节点(例如RViz)使用参数use_sim_time
,当设置为True
时,它将指示节点开始订阅/clock
话题,并与发布的仿真时间同步。这个参数可以通过ROS启动文件或命令行界面进行设置。稍后我们将看到如何在终端中设置该参数,并观察它对某些ROS节点的影响。
运行ROS时钟发布者
操作步骤
-
创建Action图:
- 转到 Create -> Visual Scripting -> Action Graph 来创建一个Action图。
-
将以下OmniGraph节点添加到Action图中:
-
On Playback Tick节点:每个仿真帧执行其他图节点。
-
Isaac Read Simulation Time节点 :用于获取当前仿真时间。注意:默认情况下,仿真时间是单调递增的,这意味着无论仿真是否暂停并重新播放,时间都会继续增加。这主要是为了防止仿真重置时时间倒退的问题。如果希望仿真重置时从0开始,可以将
resetOnStop
设置为True。 -
ROS1 Publish Clock节点 :用于将仿真时间发布到
/clock
话题。
-
-
ROS Clock发布器:
-
以上配置后,ROS1发布时钟信息,其他ROS节点可以通过订阅
/clock
话题来获取仿真时间并同步。 -
输入以下命令来启动RViz:
rosrun rviz rviz
注意RViz窗口底部显示的 ROS Time 和 ROS Elapsed Time ,这些值目前显示的是Wall 时间,应与 Wall Time 和 Wall Elapsed 字段相匹配。
-
在一个新的ROS终端中,使用以下命令将 use_sim_time 参数设置为
true
,以确保RViz使用仿真时间。rosparam set /use_sim_time true
确保在设置之前Isaac Sim的仿真是停止的。
-
关闭RViz并重新启动,这时你会注意到 ROS Time 和 ROS Elapsed Time 都会显示为0。
-
点击 Play 启动Isaac Sim仿真。在RViz中,ROS Time 会与从Isaac Sim通过
/clock
话题发布的仿真时间相匹配。
-
发布系统时间
尽管发布仿真时间是最常见的工作流程,但某些工作流可能需要消息包含系统时间。要通过时钟话题发布系统时间,请按照以下步骤操作:
-
创建Action图:
- 转到 Create -> Visual Scripting -> Action Graph 来创建一个Action图。
-
将以下OmniGraph节点添加到Action图中:
-
On Playback Tick节点:每个仿真帧执行其他图节点。
-
Isaac Read System Time节点:用于获取当前系统时间。
-
ROS1 Publish Clock节点 :将系统时间发布到
/clock
话题。
-
-
ROS时钟发布器(带系统时间):
- 配置上述节点后,系统时间将通过
/clock
话题发布。
- 配置上述节点后,系统时间将通过
-
在Isaac Sim中点击Play:
-
启动Isaac Sim仿真后,可以在ROS终端中使用以下命令查看从Isaac Sim发布的系统时间:
rostopic echo /clock
-
相机助手和RTX激光雷达节点
-
在之前的教程中你已经见过 ROS Camera Helper 节点,而在后续教程中你将见到 ROS RTX Lidar Helper 节点。
-
这两个节点都会自动生成一个传感器发布管道。为了确保它们的发布器使用系统时间,请确保将它们的
useSystemTime
输入设置为True
。
运行ROS时钟订阅者
-
创建Action图:
- 打开一个新的场景,转到 Create -> Visual Scripting -> Action Graph 来创建一个新的Action图。
-
将以下OmniGraph节点添加到Action图中:
-
On Playback Tick节点:每个仿真帧执行其他图节点。
-
ROS1 Subscribe Clock节点 :订阅外部时间戳数据。
-
-
启动仿真:
- 点击 Play 启动仿真后,选择Action图中的 ROS1 Subscribe Clock节点 ,在属性窗口中查看它的
timeStamp
输出。此时,时间戳应为0。
- 点击 Play 启动仿真后,选择Action图中的 ROS1 Subscribe Clock节点 ,在属性窗口中查看它的
-
手动发布时钟消息:
-
在一个新的ROS终端中运行以下命令手动发布时钟消息一次:
rostopic pub -1 /clock rosgraph_msgs/Clock "clock: { secs: 1, nsecs: 200000000 }"
执行后,ROS1 Subscribe Clock OmniGraph节点中的
timeStamp
值应更改为1.2
。 -
你可以更改发布命令中的
secs
和nsecs
值,观察这些值如何反映在 ROS1 Subscribe Clock OmniGraph节点的timeStamp
字段中。例如:rostopic pub -1 /clock rosgraph_msgs/Clock "clock: { secs: 3, nsecs: 500000000 }"
-