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.pswp.cn/bicheng/90151.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序171~180

1.封装购物车接口API import http from /utils/httpexport const reqAddCrt ({ goodsId, count, ...data }) > {return http.get(/cart/addToCart/${goodsId}/${count}, data) }export const reqCartList () > {return http.get(/cart/getCartList) }export const reqU…

修改 docker 容器的挂载配置(保持数据不丢的情况)

一、核心原理Docker 容器的运行时配置(包括挂载)是启动时确定的,一旦启动无法直接修改。因此,需通过以下步骤实现:保存原容器中的数据(避免丢失);基于原镜像创建新容器,同…

MVCC(多版本并发控制)介绍及实现原理

一、什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库中用于解决并发访问问题的一种机制。它通过为数据维护多个版本,让读写操作在不同版本上独立进行,从而避免了传统锁机制中…

密码学基础概念详解:从古典加密到现代密码体系

一、引言:为什么我们需要密码学? 在数字化时代,信息已成为核心生产要素,而信息安全则是保障社会运转的基石。当我们在电商平台输入银行卡密码时,当我们通过即时通讯工具发送私密消息时,当企业在云端存储核心…

小鹏汽车视觉算法面试30问全景精解

小鹏汽车视觉算法面试30问全景精解 ——智能驾驶 车路协同 视觉创新:小鹏汽车视觉算法面试核心考点全览 前言 小鹏汽车作为中国智能电动汽车的创新引领者,致力于通过AI与自动驾驶技术推动智能出行的变革。小鹏视觉算法团队深耕自动驾驶感知、车路协同、智能座舱、3D重建…

程序是如何生成的-以c语言为例

一,序言 从代码到能跑的程序,整个过程就像 “把外文翻译成母语,再组装成能直接用的东西”,一步步来更清楚: 源代码(程序员写的代码,如C语言文件)↓ 预处理(处理#开头的命…

风险识别清单:构建动态化的风险管理体系

在项目管理实践中,风险识别是确保项目成功的关键环节。PMBOK提出的风险提示清单(Prompt List)为项目团队提供了一个系统化的思考框架,帮助突破个人经验局限,实现更全面的风险覆盖。这一工具的价值不仅在于其提供的标准…

从“点状用例”到“质量生态”:现代软件测试的演进、困局与破局

测试的三次范式跃迁业务高速迭代下的四大困局质量工程化:流程、平台、度量三位一体左移与右移:把缺陷扼杀在摇篮,也把监控铺到坟墓自动化金字塔的再平衡:UI、API、单元、契约、e2e数据驱动测试:从“拍脑袋”到“科学实…

【C++】继承和多态扩展学习

目录 1. 菱形虚拟继承原理剖析 1.1.虚基表 2. 单继承和多继承的虚函数表深入探索 2.1 单继承虚函数表深入探索 2.2 多继承虚函数表深入探索 ​编辑 2.3 菱形继承、菱形虚拟继承 3. 继承和多态考察的一些常见问题 1. 菱形虚拟继承原理剖析 继承的文章中我们讲到C的多继承…

Visual Studio Code 远端云服务器开发使用指南

目录 一、下载安装 1、官方下载 2、下载加速方案 二、基于Ubuntu系统的开发环境搭建方案 1、开发环境配置 2、云服务器架构 3、工作流程关系 4、总结 三、推荐插件 1、免配置插件 1. Remote-SSH - 远程登录Linux服务器 2. C/C - 必备的C/C开发插件 3. C/C Extensi…

技术演进中的开发沉思-41 MFC系列:定制 AppWizard

MFC开发,最为重要的无非就是用“MFC AppWizard” 对话框做开发了,第一次使用感觉像拆收音机的孩子 —— 左边是项目类型选择,右边是一堆打勾的选项,点完 “完成”,屏幕上就冒出了能直接编译运行的窗口程序。那时还不知…

Libevent(3)之使用教程(2)创建事件

Libevent(3)之使用教程(2)创建事件 Author: Once Day Date: 2025年6月29日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 本文档翻译于:Fast portable non-bl…

Kotlin 作用域函数 let 的实现原理

Kotlin 中的 let 是一个 标准库扩展函数,它广泛用于作用域函数(Scope Functions)中,尤其适用于对可空对象(nullable)做非空判断并执行代码块的场景。 示例代码 val name: String? "123" name?…

从FDTD仿真到光学神经网络:机器学习在光子器件设计中的前沿应用工坊

FDTD仿真与光学神经网络的基础概念 FDTD(时域有限差分)是一种数值方法,用于求解麦克斯韦方程组,广泛应用于光子器件设计。光学神经网络通过光波导、衍射元件等物理结构实现矩阵运算,具有低能耗、高并行的优势。 机器学…

在Ubutu22系统上面离线安装Go语言环境【教程】

0.引言 Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型编程语言,由Robert Griesemer、Rob Pike和Ken Thompson于2007年开始设计,2009年正式发布。 1.到官网下载压缩包 2.从win10系统离线上传压缩包给ubuntu22…

CMake实践:CMake3.30版本之前和之后链接boost的方式差异

目录 1.背景 2.boost引入CMake时机 3.CMake 3.30 之前(含 3.29)链接 Boost 的方式 4.CMake 3.30 及之后链接 Boost 的方式 5.CMake3.30后引入Boost的步骤 6.迁移建议(3.30 之前 → 3.30 之后) 7.CMake 3.30 移除FindBoost的…

告别挂马风险!PBootCMS完美替代方案BadouCMS

开发企业网站时一直比较喜欢用pbootcms,标签套用很简单,使用也方便。 但是pbootcms一直有被挂马的问题,官方好像也不怎么更新了!换过好几个cms,比如eyoucms、dedecms、帝国等等,感觉都不怎么能用得习惯,还…

开发者如何集成AI绘画?智创聚合API简化Midjourney接入

在 AI 绘画领域,Midjourney 的大名如雷贯耳,其强大的图像生成能力,能将我们脑海中的奇思妙想,迅速转化为精美的视觉画面,深受设计师、艺术家以及广大创意爱好者的青睐。然而,使用 Midjourney 的过程中&…

pycharm回车、删除、方向键和快捷键等不能使用原因

解决方法 :菜单栏中的Tools取消勾选Vim Emulator 原因 :新版的pycharm安装中,默认安装了vim扩展,一旦安装了pycharm在编写代码时会默认使用Vim编辑器

修复ffmpeg.dll丢失错误|6种解决ffmpeg.dll方法详细教程

看到电脑提示“ffmpeg.dll丢失”,很多人会懵。ffmpeg.dll 是个处理视频、音频的关键文件。它要是没了或坏了,软件就打不开或直接闪退。常见原因是软件安装不全、文件被删、或者中病毒。下面说说它是干嘛的,再给解决办法。一.ffmpeg.dll 到底是…