NVIDIA Omniverse和Isaac Sim:Isaac Sim的ROS接口与相机影像、位姿真值发布/保存

学习文章链接:

zhaoxuhui.top/blog/2022/1...

zhaoxuhui.top/blog/2023/1...

官方链接:

docs.isaacsim.omniverse.nvidia.com/latest/sens...

相机ros1通信

第三步:运行测试流程

3.1 启动 ROS 核心(终端1)

bash 复制代码
# 在第一个终端启动 roscore
roscore

3.2 启动 Isaac Sim(终端2)

3.3 可视化测试(终端3)

bash 复制代码
# 打开第三个终端


source /opt/ros/noetic/setup.bash

# 启动 rqt_image_view 查看图像话题
rqt_image_view

# 在 rqt_image_view 界面中选择相应的图像话题,通常是:
# /camera/rgb/image_raw 或类似的话题名称

3.4 查看节点图(终端4,可选)

bash 复制代码
# 打开第四个终端
source /opt/ros/noetic/setup.bash

# 启动 rqt_graph 查看节点关系
rqt_graph

lidar ros1通信,LiDAR传感器数据输出

  • horizontalFov: 水平视角,默认是360度,也就是一周
  • horizontalResolution: 水平分辨率,度为单位。比如0.4表示水平每0.4度有一个观测线
  • maxRange: LiDAR传感器最远量程,单位是米
  • mixRange: LiDAR传感器最近量程,单位是米
  • rotationRate: 激光线的旋转速率,每秒多少圈。如果为0则表示一次性获得所有激光线
  • verticalFov: 垂直视角,LiDAR传感器在竖直方向上的视角范围,单位为度
  • verticalResolution: 竖直分辨率。两条激光线之间的竖直角度,单位为度

根据您提供的文档和图片,我来分析Isaac Sim中PhysX LiDAR传感器和相机的Action Graph节点配置。

相机影像数据发布的Action Graph节点

从图片2可以看到,相机数据发布需要以下节点:

核心节点函数名:

  1. On Playback Tick - 触发节点
  2. Isaac Create Viewport - 创建视窗
  3. Constant Int - 常量整数节点(设置Viewport ID)
  4. Set Active Camera - 设置活动相机
  5. Get Prim Path - 获取Prim路径
  6. ROS1 Camera Helper - ROS1相机助手
  7. Constant String - 常量字符串节点(设置Topic名称)

PhysX LiDAR传感器数据发布的Action Graph节点

从图片3可以看到,LiDAR数据发布需要以下节点:

核心节点函数名:

  1. On Playback Tick - 触发节点
  2. Isaac Read Lidar Point Cloud Node - 读取LiDAR点云数据节点
  3. ROS1 Publish Point Cloud - ROS1发布点云数据
  4. Isaac Read Simulation Time - 读取仿真时间

重要注意事项

版本兼容性问题:

  • 您提到Isaac Sim 4.5版本,但文档基于2022.2.0版本
  • 根据文档明确提到:"由于Isaac Sim版本更新快,API变化较大,因此不同版本可能存在不兼容情况"
  • 节点名称在不同版本间可能有变化

Script Editor实现要点:

  1. LiDAR传感器创建: 通过Create > Isaac > Sensors > Lidar > Rotating

  2. 相机传感器创建: 添加Camera对象并命名(如Camera_test)

  3. Action Graph连接顺序: 严格按照图片中的连接顺序

  4. 属性设置:

    • LiDAR的Lidar Prim属性需指向添加的LiDAR对象
    • 相机的Camera Path需写全路径(如/World/Camera_test)
    • Topic名称通过Constant String设置

关键提醒: 由于Isaac Sim 4.5版本可能与文档版本差异较大,建议在实际使用时:

  1. 先在GUI界面验证节点名称是否一致
  2. 查看Isaac Sim 4.5的官方文档确认API变更
  3. 节点属性名称可能需要根据新版本调整

这些节点名称是基于您提供的图片和文档内容,但在Isaac Sim 4.5中可能需要根据实际情况进行调整

我来为你提供在Isaac Sim 4.5中为扫地机器人添加LiDAR和相机传感器的完整步骤。

步骤1:使用Script Editor创建PhysX LiDAR传感器

打开Isaac Sim,进入Window > Script Editor,输入以下代码:

python 复制代码
import omni.kit.commands
from pxr import Gf, UsdGeom
from omni.isaac.core.utils.stage import get_current_stage

# 获取当前stage
stage = get_current_stage()

# 创建PhysX LiDAR传感器
omni.kit.commands.execute(
    'CreatePrim',
    prim_path='/World/robot_lidar',
    prim_type='Lidar'
)

# 获取LiDAR prim
lidar_prim = stage.GetPrimAtPath('/World/robot_lidar')

# 设置LiDAR参数
lidar_prim.GetAttribute('horizontalFov').Set(360.0)  # 水平视场角360度
lidar_prim.GetAttribute('horizontalResolution').Set(0.4)  # 水平分辨率0.4度
lidar_prim.GetAttribute('maxRange').Set(30.0)  # 最大量程30米
lidar_prim.GetAttribute('minRange').Set(0.4)  # 最小量程0.4米
lidar_prim.GetAttribute('rotationRate').Set(0.0)  # 旋转速率设为0(一次性获取所有线)
lidar_prim.GetAttribute('verticalFov').Set(30.0)  # 垂直视场角30度
lidar_prim.GetAttribute('verticalResolution').Set(1.0)  # 垂直分辨率1度
lidar_prim.GetAttribute('drawLines').Set(True)  # 显示激光线
lidar_prim.GetAttribute('drawPoints').Set(True)  # 显示激光点

# 设置LiDAR位置(根据需要调整,这里是示例位置)
omni.kit.commands.execute(
    'ChangeProperty',
    prop_path='/World/robot_lidar.xformOp:translate',
    value=Gf.Vec3d(0, 0, 0.5),  # x, y, z坐标
    prev=None
)

print("PhysX LiDAR created successfully at /World/robot_lidar")

大部分参数一看就懂。比较重要的有:

  • horizontalFov: 水平视角,默认是360度,也就是一周
  • horizontalResolution: 水平分辨率,度为单位。比如0.4表示水平每0.4度有一个观测线
  • maxRange: LiDAR传感器最远量程,单位是米
  • mixRange: LiDAR传感器最近量程,单位是米
  • rotationRate: 激光线的旋转速率,每秒多少圈。如果为0则表示一次性获得所有激光线
  • verticalFov: 垂直视角,LiDAR传感器在竖直方向上的视角范围,单位为度
  • verticalResolution: 竖直分辨率。两条激光线之间的竖直角度,单位为度

步骤2:使用Script Editor创建相机传感器

继续在Script Editor中输入以下代码:

python 复制代码
import omni.kit.commands
from pxr import Gf

# 创建相机
omni.kit.commands.execute(
    'CreatePrim',
    prim_path='/World/robot_camera',
    prim_type='Camera'
)

# 获取相机prim
camera_prim = stage.GetPrimAtPath('/World/robot_camera')

# 设置相机参数
camera_prim.GetAttribute('focalLength').Set(24.0)  # 焦距
camera_prim.GetAttribute('focusDistance').Set(400.0)  # 对焦距离
camera_prim.GetAttribute('horizontalAperture').Set(20.955)  # 水平光圈
camera_prim.GetAttribute('verticalAperture').Set(15.2908)  # 垂直光圈
camera_prim.GetAttribute('clippingRange').Set(Gf.Vec2f(1.0, 1000000.0))  # 裁剪范围

# 设置相机位置和旋转(根据机械臂位置调整)
omni.kit.commands.execute(
    'ChangeProperty',
    prop_path='/World/robot_camera.xformOp:translate',
    value=Gf.Vec3d(1.0, 0, 1.2),  # x, y, z坐标
    prev=None
)

omni.kit.commands.execute(
    'ChangeProperty',
    prop_path='/World/robot_camera.xformOp:rotateXYZ',
    value=Gf.Vec3d(-15, 0, 0),  # 俯仰角-15度
    prev=None
)

print("Camera created successfully at /World/robot_camera")

步骤3:手动创建PhysX LiDAR的Action Graph

  1. 打开Window > Visual Scripting > Action Graph
  2. 创建新的Action Graph,命名为"LiDAR_Publisher"
  3. 按以下顺序添加节点并连接:

LiDAR Action Graph节点连接:

节点1:On Playback Tick

  • 作用:仿真运行时触发整个Graph

节点2:Isaac Read Lidar Point Cloud Node

  • 在Properties面板中设置:

    • inputs:lidarPrim = /World/robot_lidar

节点3:ROS1 Publish Point Cloud

  • 在Properties面板中设置:

    • inputs:topicName = robot_lidar_pointcloud
    • inputs:frameId = robot_lidar_frame

节点4:Isaac Read Simulation Time

  • 提供准确的时间戳

连接方式:

java 复制代码
On Playback Tick → Isaac Read Lidar Point Cloud Node (execIn)
Isaac Read Lidar Point Cloud Node → ROS1 Publish Point Cloud (execIn)
Isaac Read Lidar Point Cloud Node (pointCloudData) → ROS1 Publish Point Cloud (pointCloudData)
Isaac Read Simulation Time (simulationTime) → ROS1 Publish Point Cloud (timeStamp)

步骤4:手动创建相机的Action Graph

  1. 创建新的Action Graph,命名为"Camera_Publisher"
  2. 按以下顺序添加节点并连接:

相机Action Graph节点连接:

节点1:On Playback Tick

  • 作用:仿真运行时触发整个Graph

节点2:Constant Int

  • 在Properties面板中设置:

    • inputs:value = 1 (Viewport ID)

节点3:Isaac Create Viewport

  • 创建新的渲染视窗

节点4:Get Prim Path

  • 在Properties面板中设置:

    • inputs:prim = /World/robot_camera

节点5:Set Active Camera

  • 将相机绑定到Viewport

节点6:Constant String

  • 在Properties面板中设置:

    • inputs:value = robot_camera_image

节点7:ROS1 Camera Helper

  • 在Properties面板中设置:

    • inputs:type = rgb
    • inputs:frameId = robot_camera_frame

连接方式:

java 复制代码
On Playback Tick → Isaac Create Viewport (execIn)
Constant Int (value) → Isaac Create Viewport (viewportId)
Isaac Create Viewport → Set Active Camera (execIn)
Isaac Create Viewport (viewport) → Set Active Camera (viewport)
Get Prim Path (prim) → Set Active Camera (cameraPrim)
Set Active Camera → ROS1 Camera Helper (execIn)
Isaac Create Viewport (viewport) → ROS1 Camera Helper (viewport)
Constant String (value) → ROS1 Camera Helper (topicName)

步骤5:启用ROS1 Bridge

  1. 打开Window > Extensions
  2. 搜索"ROS Bridge"
  3. 启用omni.isaac.ros_bridge扩展

步骤6:传感器绑定到机器人

创建传感器后,你需要:

  1. 将LiDAR绑定到底盘:

    • 在Stage面板中,将/World/robot_lidar拖拽到你的机器人底盘节点下
    • 调整其Transform属性,设置合适的位置
  2. 将相机绑定到机械臂:

    • 在Stage面板中,将/World/robot_camera拖拽到你的机械臂末端节点下
    • 调整其Transform属性,设置合适的位置和角度

步骤7:测试运行

  1. 在终端运行:roscore

  2. 在Isaac Sim中点击Play按钮

  3. 检查ROS话题:

    bash 复制代码
    rostopic list
    rostopic echo /robot_lidar_pointcloud
    rostopic echo /robot_camera_image

完成以上步骤后,你的扫地机器人就具备了用于SLAM的LiDAR传感器和用于物体识别的相机传感器,并能通过ROS1发布相应数据。

ROS话题已经成功发布。下面我来详细说明如何用RViz可视化激光雷达扫描数据:

步骤1:启动RViz

在新的终端中运行:

复制代码
rosrun rviz rviz

步骤2:设置固定坐标系(Fixed Frame)

  1. 在RViz左侧面板的Global Options中

  2. 将Fixed Frame 设置为:robot_lidar_frame

    • 这是我们之前在Action Graph中设置的frameId

步骤3:添加PointCloud2显示插件

  1. 点击RViz左下角的Add按钮
  2. 在弹出的窗口中选择PointCloud2
  3. 点击OK

步骤4:配置PointCloud2显示属性

在左侧面板中找到刚添加的PointCloud2,展开其属性:

  1. Topic : 设置为 /robot_lidar_pointcloud

  2. Size (Pixels) : 设置为 3 (点的大小)

  3. Style : 选择 Points (点显示模式)

  4. Color Transformer: 可以选择:

    • Intensity - 按强度着色
    • AxisColor - 按轴向着色
    • FlatColor - 单一颜色
  5. Decay Time : 设置为 0 (不保留历史点云)

步骤5:调整视角

  1. 使用鼠标左键拖拽旋转视角
  2. 使用鼠标右键拖拽平移视图
  3. 使用滚轮缩放
  4. 或者点击Views面板,选择合适的预设视角

步骤6:同时可视化相机图像(可选)

如果你也想查看相机图像:

  1. 再次点击Add按钮
  2. 选择Image插件
  3. 设置Image Topic 为:/robot_camera_image

步骤7:保存RViz配置

为了方便下次使用,建议保存配置:

  1. 点击菜单File > Save Config As
  2. 保存为:robot_sensors.rviz

检查数据是否正常

在终端中运行以下命令检查点云数据:

bash 复制代码
# 查看点云话题信息
rostopic info /robot_lidar_pointcloud

# 查看点云数据内容(会输出很多数据)
rostopic echo /robot_lidar_pointcloud --noarr

# 查看发布频率
rostopic hz /robot_lidar_pointcloud

cd isaacsim ./python.sh /home/lwb/Project/CleanUp_Bench_SVSDF/main_system.py ./python.sh /home/lwb/Project/CleanUp_Bench_SVSDF/test.py

相关推荐
且从容.1 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落3 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨3 小时前
WSL2的安装与使用
linux·wsl
微小的鱼3 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng3 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮4 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky16 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默16 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk816317 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
爱莉希雅&&&19 小时前
GitLab 完整学习笔记
linux·运维·服务器