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

相关推荐
czhc11400756637 小时前
Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
linux·运维·r语言
滴滴滴嘟嘟嘟.8 小时前
嵌入式Linux驱动开发:蜂鸣器驱动
linux·运维·驱动开发
梅见十柒8 小时前
UNIX网络编程笔记:共享内存区和远程过程调用
linux·服务器·网络·笔记·tcp/ip·udp·unix
溯光笔记9 小时前
服务器内网穿透NPS搭建过程 - 服务端linux服务器 客户端windows系统 - 溯光笔记
linux·服务器·windows
2501_930124709 小时前
Linux之Shell编程(三)流程控制
linux·前端·chrome
Sadsvit11 小时前
Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
linux·运维·centos·自动化·ansible
花载酒11 小时前
10个我离不开的 VSCode 插件
前端·visual studio code
偶像你挑的噻11 小时前
linux应用开发-嵌入编程基础
linux
偶像你挑的噻11 小时前
linux应用开发-环境构建
linux
好名字更能让你们记住我13 小时前
Linux网络基础1(一)之计算机网络背景
linux·服务器·网络·windows·计算机网络·算法·centos