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

Isaac Sim 12 帧率

参考内容:

NVIDIA Omniverse和Isaac Sim笔记6:双目和IMU传感器数据的获取与保存

NVIDIA Omniverse和Isaac Sim笔记8:相机数据采集发布帧率问题研究与设置

NVIDIA Omniverse和Isaac Sim笔记9:Standalone工作流介绍与IMU帧率设置

 Can I set IMU frequency in Isaac Sim - Isaac Sim - NVIDIA Developer Forums

IMU Sensor hz setting problem using ros2 in Isaac Simulator - Isaac Sim - NVIDIA Developer ForumsIsaac Sim Workflows — Omniverse IsaacSim latest documentation

 ROS Bridge in Standalone Workflow — Omniverse IsaacSim latest documentation

Isaac Sim 帧率设置中踩了特别多特别多的坑。特此记录。

我的需求:Isaac Sim 以特定帧率(imu:100、odom:100、rgb:15)发送topic

  • 已有小车(添加了物理,可操控行驶)
  • 建立了基础场景
  • 可以键盘控制小车前进方向
  • 已经在小车路径中添加了imu sensor
  • odom路径为小车模型路径,并未单独设置传感器

一.相机传感器帧率设置

1.1 相机传感器topic发送方式

1. 在 Action Graph 中,用ROS发送,连接方式如下:

  • On Playback Tick
  • Isaac Create Render Product
  • ROS1 Camera Helper

在 Render product 中设置好相机的路径、图像的大小

在 Camera helper 中设置topic name、frame id等参数

连接完成后点击播放,就可以正常发布 camera ros 信息了

(也可以通过代码构建,和管道连接思路相同)

 

1.2 相机传感器帧率控制

        目前 Isaac Sim 可以进行数据采集的方式有两种:

  1.  使用Synthetic Data Recorder进行数据采集。帧率太低(只有个位数的帧率)。
  2.  Action Graph 和 Isaac Sim的ROS接口,可以实现对于传感器数据较高帧率的采集。

        问题:使用第二种,Action Graph 的 ROS 接口,完全不能设置帧率,全靠硬件能力,你多一个传感器,诶帧率就低一点。你少两个传感器,诶帧率直接一百二了。我们不需要这么高的帧率,我们只要15帧,那如何修改就成了问题。

        官方文档链接点进去 404 ,服了。

        根据大佬的笔记进行操作,发现完全不能设置,可能是后续isaacsim又更新了吧。大佬笔记:

NVIDIA Omniverse和Isaac Sim笔记8:相机数据采集发布帧率问题研究与设置 

         更新了,思路又不是不能用...

        一共有三种调整相机帧率的方式:

  1.  SGDPipeline graph 中添加 gate 节点,通过控制发送间隔来实现帧率调整
  2.  基于Standalone模式写代码实现
  3.  基于Branch写代码实现

1.2.1 通过 Gate 节点

        在我环境当前配置下,Isaac Sim发布的默认影像帧率是120帧。帧率不固定,而是根据硬件配置而决定,可以理解为在当前硬件下,仿真环境能跑到的最高帧率(说不定你就重新启动了一下软件,帧率掉20)。整个过程的核心是ROS Camera Helper。而这个过程更进一步是通过SGDPipeline实现的。

        手动设置帧率,其实就是手动修改 SDGPipeline Graph 。在笔记中的graph有很多都不能使用了,其中gate的输入是array,但是array之前的模块现在已经没有了,就单独一个array没法输入数据...这个gate相当于一点用都没有了。如果在1.1中的 camera graph 中添加 gate ,设置没有效果,帧率不会变化。

        这条路现在走不通了。

大佬笔记:NVIDIA Omniverse和Isaac Sim笔记8:相机数据采集发布帧率问题研究与设置

1.2.2 基于Standalone

        在Omniverse的安装目录下的/Libs/isaac_sim-2023.1.1/standalone_examples/api/omni.isaac.ros_bridge/目录下 ,camera_periodic.py文件

        没有尝试成功,这个代码的逻辑也是依赖gate来实现的,不知道现在是gate有bug,还是单纯就是我不行没成功....

1.2.3 基于Branch

        代码文件可以在Omniverse的安装目录下的/Libs/isaac_sim-2022.1.1/standalone_examples/api/omni.isaac.ros_bridge/目录下找到,叫做camera_manual.py文件

        通过代码,断开了Isaac Simulation Gate和后续节点之间的连接,并且在其中插入了Branch节点。然后,通过代码动态设置Branch节点的Condition来开启/关闭后续流程,把Branch节点的True输出和后续流程相连。

        在while循环中引入了frame累计变量。对于RGB影像而言,如果这个frame变量能够被5整除,那么就将当前Branch节点的Condition属性设为True,这样就会执行后续流程。否则,什么都不做,因为在while循环中,Branch节点的Condition属性每次都会被初始化为False。通过这种方式,就可以轻易地实现每间隔N帧发布一次数据的目标。

        (实际上也是这种方式走通了)

        缺点是在Action Graph中很难实现对于条件的判断,因此状态的动态控制并不容易操作,必须以standalone方式写代码才能实现。比如在上面的控制中,需要新建frame累加变量,但在Action Graph中,并不能够新建此类变量(也许可以但我不会,欢迎讨论)。优点是通过对特定的条件进行判断来控制是否发布数据,显然比设置间隔更加灵活。比如可以设置条件为仿真小车在特定区域才会发布数据,在这个区域之外不会发布这种条件等。只能依赖写代码才能实现。

二. IMU 帧率控制 

2.1 IMU topic 发送方式

和相机一样,在 Action Graph 中用Ros发布

  • Isaac Read IMU Node
  • ROS1 Publish Imu
  • Isaac xPrim Axis Visualizer Node
  • To String
  • Print Text

输出文本不必要,看个人需求

也可以用代码生成,原理相同

2.2 IMU帧率控制 

        IMU和相机设置帧率方式不同

        因为相机所有的设置其实都和Camera Helper有关,或者说是依赖GPU渲染的,所以通过修改SDGPipeline就可以实现。而IMU是物理传感器,并不通过SDGPipeline进行数据发布,自然也就不能通过修改它来实现帧率的设置。IMU需要通过修改场景的物理刷新率(与仿真环境的渲染帧率不同)进行设置。

大佬笔记:NVIDIA Omniverse和Isaac Sim笔记9:Standalone工作流介绍与IMU帧率设置

设置IMU帧率主要代码:(主要看大佬笔记就好,非常详细,我的就随便贴一下...)

 

三. 同时设置IMU、相机的帧率

遇到的问题:

  1. 同时设置IMU帧率,调整相机帧率,只能用代码的方式。
  2. 只能使用基于Branch的方式发布相机话题来修改相机帧率。
  3. USD文件中原有的相机话题发布 Action Graph 一定要删掉,就算发布的话题不同,也要删掉,不然无法运行。
  4. isaacsim官网中使用构造Action Graph的方式修改帧率,这种做法实际不支持,帧率没有改变,是错误的。
  5. 尝试在usd文件中写好IMU数据发布的Action Graph,然后在脚本中修改IMU帧率。这种做法经过实验,发现帧率修改没有作用。
  6. 通过Standalone编写代码的方式,imu和odom的帧率都成功设置为了100,但相机的帧率降不下去,后来发现只有Branch方式能用。
  7. 官网和论坛中用通过修改SDGPipeline的Isaac Simulation Gate的Step属性的方式,来实现相机帧率的修改,实际上也是不正确的,没有作用。isaac sim版本更新后这里存在bug。
  8. 没有给小车添加初速度,但是小车一直有一个向前的力,一直在运动,原因未知,在官网和论坛中查找原因,说可能是仿真环境的浮点误差导致的...不像。肉眼都能观察到它在动了。

http://www.mrgr.cn/news/5755.html

相关文章:

  • OpenCV Lesson 2: 如何使用OpenCV扫描图像、查找表和时间测量
  • 【图像处理】在图像处理算法开发中,有哪些常见的主观评价指标和客观评价指标?
  • 数据结构----树
  • K8S - Java微服务配置之ConfigMap
  • go 系列实现websocket
  • 买了服务器后如何正确挂载数据盘|什么是系统盘,什么是数据盘
  • 控制台小游戏—扫雷
  • 海外活动策划:5个必备的活动策划推广工具
  • Java学习笔记(02)接口的使用
  • 改编版猜数字小游戏,猜错了就黑屏(整蛊版本)
  • C语言从头学49—文件操作(四)
  • R 语言学习教程,从入门到精通,R Excel 文件使用(18)
  • 深信服研发面试经验分享
  • @PathVariable:Spring MVC中的路径变量解析
  • 台球助教在线预约小程序源码开发:打造便捷高效的台球学习新体验
  • docker常见指令——镜像指令and容器指令
  • 如何让python爬虫的数据可视化?
  • java设计模式--创建型设计模式
  • 【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
  • k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例