学习文章链接:
官方链接:

相机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可以看到,相机数据发布需要以下节点:
核心节点函数名:
On Playback Tick
- 触发节点Isaac Create Viewport
- 创建视窗Constant Int
- 常量整数节点(设置Viewport ID)Set Active Camera
- 设置活动相机Get Prim Path
- 获取Prim路径ROS1 Camera Helper
- ROS1相机助手Constant String
- 常量字符串节点(设置Topic名称)
PhysX LiDAR传感器数据发布的Action Graph节点
从图片3可以看到,LiDAR数据发布需要以下节点:
核心节点函数名:
On Playback Tick
- 触发节点Isaac Read Lidar Point Cloud Node
- 读取LiDAR点云数据节点ROS1 Publish Point Cloud
- ROS1发布点云数据Isaac Read Simulation Time
- 读取仿真时间
重要注意事项
版本兼容性问题:
- 您提到Isaac Sim 4.5版本,但文档基于2022.2.0版本
- 根据文档明确提到:"由于Isaac Sim版本更新快,API变化较大,因此不同版本可能存在不兼容情况"
- 节点名称在不同版本间可能有变化
Script Editor实现要点:
-
LiDAR传感器创建: 通过
Create > Isaac > Sensors > Lidar > Rotating
-
相机传感器创建: 添加Camera对象并命名(如
Camera_test
) -
Action Graph连接顺序: 严格按照图片中的连接顺序
-
属性设置:
- LiDAR的
Lidar Prim
属性需指向添加的LiDAR对象 - 相机的
Camera Path
需写全路径(如/World/Camera_test
) - Topic名称通过
Constant String
设置
- LiDAR的
关键提醒: 由于Isaac Sim 4.5版本可能与文档版本差异较大,建议在实际使用时:
- 先在GUI界面验证节点名称是否一致
- 查看Isaac Sim 4.5的官方文档确认API变更
- 节点属性名称可能需要根据新版本调整
这些节点名称是基于您提供的图片和文档内容,但在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
- 打开Window > Visual Scripting > Action Graph
- 创建新的Action Graph,命名为"LiDAR_Publisher"
- 按以下顺序添加节点并连接:
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
- 创建新的Action Graph,命名为"Camera_Publisher"
- 按以下顺序添加节点并连接:
相机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
- 打开Window > Extensions
- 搜索"ROS Bridge"
- 启用omni.isaac.ros_bridge扩展
步骤6:传感器绑定到机器人
创建传感器后,你需要:
-
将LiDAR绑定到底盘:
- 在Stage面板中,将
/World/robot_lidar
拖拽到你的机器人底盘节点下 - 调整其Transform属性,设置合适的位置
- 在Stage面板中,将
-
将相机绑定到机械臂:
- 在Stage面板中,将
/World/robot_camera
拖拽到你的机械臂末端节点下 - 调整其Transform属性,设置合适的位置和角度
- 在Stage面板中,将
步骤7:测试运行
-
在终端运行:
roscore
-
在Isaac Sim中点击Play按钮
-
检查ROS话题:
bashrostopic list rostopic echo /robot_lidar_pointcloud rostopic echo /robot_camera_image
完成以上步骤后,你的扫地机器人就具备了用于SLAM的LiDAR传感器和用于物体识别的相机传感器,并能通过ROS1发布相应数据。
ROS话题已经成功发布。下面我来详细说明如何用RViz可视化激光雷达扫描数据:
步骤1:启动RViz
在新的终端中运行:
rosrun rviz rviz
步骤2:设置固定坐标系(Fixed Frame)
-
在RViz左侧面板的Global Options中
-
将Fixed Frame 设置为:
robot_lidar_frame
- 这是我们之前在Action Graph中设置的frameId
步骤3:添加PointCloud2显示插件
- 点击RViz左下角的Add按钮
- 在弹出的窗口中选择PointCloud2
- 点击OK
步骤4:配置PointCloud2显示属性
在左侧面板中找到刚添加的PointCloud2,展开其属性:
-
Topic : 设置为
/robot_lidar_pointcloud
-
Size (Pixels) : 设置为
3
(点的大小) -
Style : 选择
Points
(点显示模式) -
Color Transformer: 可以选择:
Intensity
- 按强度着色AxisColor
- 按轴向着色FlatColor
- 单一颜色
-
Decay Time : 设置为
0
(不保留历史点云)
步骤5:调整视角
- 使用鼠标左键拖拽旋转视角
- 使用鼠标右键拖拽平移视图
- 使用滚轮缩放
- 或者点击Views面板,选择合适的预设视角
步骤6:同时可视化相机图像(可选)
如果你也想查看相机图像:
- 再次点击Add按钮
- 选择Image插件
- 设置Image Topic 为:
/robot_camera_image
步骤7:保存RViz配置
为了方便下次使用,建议保存配置:
- 点击菜单File > Save Config As
- 保存为:
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

