当前位置: 首页 > java >正文

9. isaacsim4.2教程-ROS加相机/CLOCK

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

  • 向场景中添加额外的相机并将其安装在机器人上

  • 添加相机发布器(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_1Camera_2,它们将从不同的角度观察房间。添加相机到舞台的具体方法可以参考“添加相机与传感器(Add Camera and Sensors)”教程。

        你可能希望打开多个视图窗口(Viewports)以同时查看多个相机视角。打开额外视图窗口的方法如下:

        依次点击 Window -> Viewport -> Viewport 2 打开新的视图窗口,并在该视图窗口的左上角点击 “Camera” 按钮,选择你想要显示的相机视角。

./isaac-sim.sh --/rendergraph/mgpu/backend=copyQueue --/app/gatherRenderResults=1 --/app/uiGather=0

一个相机在墙上,一个相机和小车绑定,运行上节的ros命令就可以控制小车移动

为 RGB 图像发布器构建图

  1. 打开可视化脚本编辑器(Visual Scripting)
    点击菜单栏中的 Window > Visual Scripting > Action Graph

  2. 新建或编辑 Action Graph
    在 Action Graph 窗口中,点击中间的“新建 Action Graph(New Action Graph)”图标,
    如果你想将相机发布器添加到已有的图中,也可以点击“编辑 Action Graph(Edit Action Graph)”。

  3. 构建 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 下拉菜单中选定后:

  1. 启动仿真、生成底层 /Render/PostProcessing/SDGPipeline

  2. 该节点就锁定为所选类型,无法再修改重用

  3. 如果要改类型,只能新建另一个 Camera Helper,或重新加载 Stage(重建管道)

在 Isaac Sim 自带的示例场景中,有一个同时为多台相机发布多个话题的完整案例,路径为:

Isaac/Samples/ROS/Scenario/turtlebot_tutorial.usd

你可以打开它,看看是如何组织多个 Camera Helper、分别输出 RGB、Depth、Segmentation、BoundingBox 等话题的。

2.验证 ROS 连接

  1. 使用以下命令来查看正在传输的原始消息:
    rostopic echo /rgb你会在终端中看到该话题上不断刷新的原始数据。

  2. 查看发布的图像:在新的终端中(已 source 好 ROS 环境),确保 roscore 正在运行,模拟器也在“Play”状态。运行下面的命令:
    rosrun image_view image_view image:=/rgb 
    这样就能打开一个窗口,实时显示发布到 /rgb 话题的图像——它应当和你在视口里看到的画面一模一样。
    如果你在视口中移动摄像机,图片也会同步“摇摆”,就像为你的仿真环境开了场“直播”!

我们也可以在 RViz 中查看图像:

  1. 打开一个新的终端,并 source 好你的 ROS 环境;

  2. 输入命令:rviz

  3. 在左侧 Displays 面板中,点击 “Add” → 选择 “Image”

  4. 在新加入的 Image Display 项里,将其 Topic 字段设置为与你在 Camera Helper 节点中配置的 topicName 一致——在本例中即:/rgb

这样你就能在 RViz 中实时看到从仿真相机发布出来的图像流啦!

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

我第一次rviz也没有出现rgb的图像,然后一查发现

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时钟发布者

操作步骤

  1. 创建Action图:

    • 转到 Create -> Visual Scripting -> Action Graph 来创建一个Action图。

  2. 将以下OmniGraph节点添加到Action图中:

    • On Playback Tick节点:每个仿真帧执行其他图节点。

    • Isaac Read Simulation Time节点:用于获取当前仿真时间。注意:默认情况下,仿真时间是单调递增的,这意味着无论仿真是否暂停并重新播放,时间都会继续增加。这主要是为了防止仿真重置时时间倒退的问题。如果希望仿真重置时从0开始,可以将resetOnStop设置为True。

    • ROS1 Publish Clock节点:用于将仿真时间发布到/clock话题。

  3. ROS Clock发布器:

    • 以上配置后,ROS1发布时钟信息,其他ROS节点可以通过订阅/clock话题来获取仿真时间并同步。

    • 输入以下命令来启动RViz:

      rosrun rviz rviz
      

      注意RViz窗口底部显示的 ROS TimeROS Elapsed Time,这些值目前显示的是Wall 时间,应与 Wall TimeWall Elapsed 字段相匹配。

    • 在一个新的ROS终端中,使用以下命令将 use_sim_time 参数设置为 true,以确保RViz使用仿真时间。
      rosparam set /use_sim_time true
      

      确保在设置之前Isaac Sim的仿真是停止的。
    •  关闭RViz并重新启动,这时你会注意到 ROS TimeROS Elapsed Time 都会显示为0。
    • 点击 Play 启动Isaac Sim仿真。在RViz中,ROS Time 会与从Isaac Sim通过 /clock 话题发布的仿真时间相匹配。

发布系统时间

尽管发布仿真时间是最常见的工作流程,但某些工作流可能需要消息包含系统时间。要通过时钟话题发布系统时间,请按照以下步骤操作:

  1. 创建Action图:

    • 转到 Create -> Visual Scripting -> Action Graph 来创建一个Action图。

  2. 将以下OmniGraph节点添加到Action图中:

    • On Playback Tick节点:每个仿真帧执行其他图节点。

    • Isaac Read System Time节点:用于获取当前系统时间。

    • ROS1 Publish Clock节点:将系统时间发布到/clock话题。

  3. ROS时钟发布器(带系统时间):

    • 配置上述节点后,系统时间将通过 /clock 话题发布。

  4. 在Isaac Sim中点击Play:

    • 启动Isaac Sim仿真后,可以在ROS终端中使用以下命令查看从Isaac Sim发布的系统时间:

      rostopic echo /clock

相机助手和RTX激光雷达节点

  • 在之前的教程中你已经见过 ROS Camera Helper 节点,而在后续教程中你将见到 ROS RTX Lidar Helper 节点。

  • 这两个节点都会自动生成一个传感器发布管道。为了确保它们的发布器使用系统时间,请确保将它们的 useSystemTime 输入设置为 True

运行ROS时钟订阅者

  1. 创建Action图:

    1. 打开一个新的场景,转到 Create -> Visual Scripting -> Action Graph 来创建一个新的Action图。

  2. 将以下OmniGraph节点添加到Action图中:

    1. On Playback Tick节点:每个仿真帧执行其他图节点。

    2. ROS1 Subscribe Clock节点:订阅外部时间戳数据。

  3. 启动仿真:

    1. 点击 Play 启动仿真后,选择Action图中的 ROS1 Subscribe Clock节点,在属性窗口中查看它的 timeStamp 输出。此时,时间戳应为0。

  4. 手动发布时钟消息:

    1. 在一个新的ROS终端中运行以下命令手动发布时钟消息一次:

      rostopic pub  -1 /clock rosgraph_msgs/Clock "clock: { secs: 1, nsecs: 200000000 }"
      

      执行后,ROS1 Subscribe Clock OmniGraph节点中的 timeStamp 值应更改为 1.2

    2. 你可以更改发布命令中的 secsnsecs 值,观察这些值如何反映在 ROS1 Subscribe Clock OmniGraph节点的 timeStamp 字段中。例如:

      rostopic pub -1 /clock rosgraph_msgs/Clock "clock: { secs: 3, nsecs: 500000000 }"
      

http://www.xdnf.cn/news/15658.html

相关文章:

  • vs openssl编译提示无法打开文件“libssl.lib”或“libcrypto.lib”
  • 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测
  • 搜广推校招面经九十五
  • stm32驱动双步进电机
  • Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
  • UniApp -- 小程序自定义导航栏组件
  • 论文征集 | 国产工业软件硕博学位论文激励计划启动
  • 主流编程语言全景图:从Python到Rust的深度解析
  • 网络基础12--可靠性概述及要求
  • sky-take-out项目Mybatis的使用
  • 高性能数据库-Redis详解
  • 网关-微服务网关入门
  • STM32-第七节-TIM定时器-3(输入捕获)
  • 深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
  • 如何在服务器上获取Linux目录大小
  • Mysql数据库——增删改查CRUD
  • *SFT深度实践指南:从数据构建到模型部署的全流程解析
  • 1-大语言模型—理论基础:详解Transformer架构的实现(1)
  • LeetCode|Day18|20. 有效的括号|Python刷题笔记
  • 【数据可视化-67】基于pyecharts的航空安全深度剖析:坠毁航班数据集可视化分析
  • 小记_想写啥写啥_实现行间的Latex公式_VScode始终折叠大纲
  • 【Linux】基本指令(入门篇)(上)
  • 从0开始学习R语言--Day50--ROC曲线
  • 【深度学习】神经网络 批量标准化-part6
  • 苹果ios系统IPA包企业签名手机下载应用可以有几种方式可以下载到手机?
  • Go运算符
  • vue2 面试题及详细答案150道(91 - 100)
  • 系统IO对于目录的操作
  • 在断网情况下,网线直接连接 Windows 笔记本和 Ubuntu 服务器进行数据传输
  • AI产品经理面试宝典第36天:AI+旅游以及行业痛点相关面试题的指导