Orsus 传感器¶
Orsus 是一个集成双目相机、RTX 激光雷达(LiDAR)和里程计(Odometry)的传感器模块,用于 ROS2 导航栈集成。
Orsus 可挂载到 Carter、Go2、B2、M20、Scout、Coco 和 Lite3。可使用仓库中的 tools/ros2/vis_sensors.py 同时查看双目图像和点云俯视图。左右图像只受同一宿主上的 Camera 控制;点云和里程计只受 Navigation I/O 控制,两个开关彼此独立。环境 JSON 中分别使用内部键 camera 和 navigation_io。
包含 Orsus 的场景当前只支持单环境,启动时必须传入 --num_envs 1。
功能概述¶
Orsus 传感器提供以下功能:
左/右相机图像: 发布
/<robot>/Orsus_L_cam和/<robot>/Orsus_R_cam(sensor_msgs/Image)点云输出: 发布
/<robot>/cloud话题(sensor_msgs/PointCloud2)里程计信息: 发布
/<robot>/odometry话题(nav_msgs/Odometry)ROS2 集成: 自动配置 ROS2 环境,并按机器人实例名设置话题命名空间
架构¶
Orsus 的双目相机沿用资产内的发布 Graph;LiDAR 与里程计资源在运行时按机器人实例创建:
Carter / 其他兼容机器人
└─ Orsus
├─ 内置左右相机 Graph
│ └─ /<robot>/Orsus_L_cam、/<robot>/Orsus_R_cam
├─ 运行时 RTX LiDAR + Replicator writer
│ └─ /<robot>/cloud
└─ 运行时实例隔离的 Odometry Graph
└─ /<robot>/odometry
↓ ROS2 话题
ROS2 Navigation2 导航栈
在环境中使用¶
1. 在场景配置中添加 Orsus¶
在环境配置文件的场景类中添加 Orsus:
from EAI_assets.sensor.high_sensor import OrsusCfg
@configclass
class YourSceneCfg(InteractiveSceneCfg):
# ... 其他资产 ...
orsus = OrsusCfg(
# 将 Orsus 附加到机器人的底盘链接
prim_path="{ENV_REGEX_NS}/Carter/Carter/Orsus_chassis_link/Orsus",
# 外参标定数据(相对于底盘链接)
init_state=AssetBaseCfg.InitialStateCfg(
pos=(0.026, 0, 0.418), # (x, y, z) 米
),
enable_camera_publish=True,
enable_ros_publish=True,
)
注意:
prim_path必须指向机器人底盘链接的子路径位置需要根据实际机器人模型进行标定
2. 运行时资源装配¶
Orsus 加载时会生成一个运行时 USD 缓存副本,移除旧的非实例隔离 LiDAR/里程计 Graph。环境 reset 后再创建 RTX LiDAR 点云 writer,并把新的里程计 Graph 连接到宿主底盘:
def spawn_and_fix_orsus(prim_path, cfg, translation, orientation):
runtime_cfg = cfg.copy()
runtime_cfg.usd_path = _orsus_runtime_asset_path(cfg.usd_path)
sim_utils.spawn_from_usd(prim_path, runtime_cfg, translation, orientation)
# 登记每个实例的 RTX LiDAR 与 odometry 创建请求
def setup_pending_orsus_ros_graphs():
# reset 后创建 RTX LiDAR writer 和实例隔离的 odometry Graph
...
运行时缓存默认写入 ~/.cache/eai-simulator/runtime-assets,可通过 EAI_RUNTIME_ASSET_CACHE 覆盖。关闭 session 时会清理 writer、render product、LiDAR prim 和里程计 Graph。
ROS2 环境配置¶
Orsus 会自动配置 ROS2 环境:
def configure_ros_env():
# 1. 设置 ROS2 版本
os.environ["ROS_DISTRO"] = "humble"
os.environ["RMW_IMPLEMENTATION"] = "rmw_fastrtps_cpp"
# 2. 查找 Isaac ROS Bridge 路径
isaac_ros_path = find_isaac_ros_bridge_path()
# 3. 设置环境变量
os.environ["ISAAC_ROS_PATH"] = isaac_ros_path
os.environ["LD_LIBRARY_PATH"] = ...
os.environ["AMENT_PREFIX_PATH"] = ...
前置要求:
已安装 Isaac Sim ROS2 Bridge
ROS2 Humble 环境
发布的话题¶
Orsus 会根据机器人实例名设置 ROS namespace。例如 carter_1 机器人会发布 /carter_1/Orsus_L_cam、/carter_1/Orsus_R_cam、/carter_1/odometry 和 /carter_1/cloud。
/<robot>/Orsus_L_cam 与 /<robot>/Orsus_R_cam (sensor_msgs/Image)¶
左右相机分别提供 Orsus 的双目图像。话题 namespace 与 Env DIY 生成的机器人实例名一致,例如第一台 Carter 通常使用:
/carter_1/Orsus_L_cam
/carter_1/Orsus_R_cam
如果环境包含多台同类型机器人,请先通过 ros2 topic list 确认实际实例名。
/<robot>/cloud (sensor_msgs/PointCloud2)¶
频率: 与仿真步频同步(通常 60 Hz)
内容:
3D 点云数据,原始 frame 语义由 Orsus USD 图给出
Nav2 使用前应通过
algorithm/nav2/tf_bridge.py和pointcloud_to_laserscan处理
/<robot>/scan (sensor_msgs/LaserScan)¶
/<robot>/scan 不是 Orsus 直接发布的话题,而是 algorithm/nav2/ 将 /<robot>/cloud 处理后生成的 Nav2 输入话题。
使用示例¶
示例 1: Carter ROS2 传感器环境¶
参考 JSON 配置 source/EAI_hmrs/EAI_hmrs/envs/nav2.json。
运行环境:
python simulator.py \
--env=nav2 \
--num_envs=1
示例 2: 检查 ROS2 话题¶
在另一个终端中:
# 列出所有话题
ros2 topic list
# 筛选 Orsus 相机与点云话题
ros2 topic list | grep -E 'Orsus_[LR]_cam|/cloud$'
# 查看里程计信息(以 carter_1 为例)
ros2 topic echo /carter_1/odometry
# 查看原始点云
ros2 topic echo /carter_1/cloud
# 查看 Nav2 使用的 LaserScan(启动 algorithm/nav2 后)
ros2 topic echo /carter_1/scan
示例 3: 可视化 Orsus 相机与点云¶
先在一个终端启动带 Orsus、Camera Tool 和 Navigation I/O 的图形化仿真环境。仓库内置的 nav2 环境使用 Factory + Carter + Orsus:
conda activate env_isaaclab
python simulator.py --env=nav2 --num_envs=1 --device=cuda:0
等待 Isaac Sim 完成加载后,在另一个终端运行可视化脚本。nav2 中的机器人实例名为 carter_1,因此 namespace 使用 /carter_1:
source /opt/ros/humble/setup.bash
python3 tools/ros2/vis_sensors.py \
--sensor orsus \
--namespace /carter_1
脚本会订阅以下三个话题,并打开 Left Camera、Right Camera 和 Lidar BEV 三个 OpenCV 窗口:
/carter_1/Orsus_L_cam
/carter_1/Orsus_R_cam
/carter_1/cloud
查看当前 ROS graph 中的全部相机(包括 Iris、Pegasus、CF2X 单目相机和所有 Orsus 左右相机)时,不需要指定参数。脚本会持续发现后启动的相机 topic:
source /opt/ros/humble/setup.bash
python3 tools/ros2/vis_sensors.py
其他机器人只需替换 namespace。例如查看第一台 Go2 的 Orsus:
source /opt/ros/humble/setup.bash
python3 tools/ros2/vis_sensors.py --sensor orsus --namespace /go2_1
如果使用旧的、没有按机器人实例划分 namespace 的 Orsus 场景,显式 Orsus 模式默认 namespace 是 /isaac:
source /opt/ros/humble/setup.bash
python3 tools/ros2/vis_sensors.py --sensor orsus
运行前需要系统 Python 环境提供 rclpy、sensor_msgs、cv_bridge、OpenCV 和 NumPy。若窗口没有图像,先检查对应话题是否存在并持续发布:
ros2 topic list | grep Orsus
ros2 topic hz /carter_1/Orsus_L_cam
ros2 topic hz /carter_1/Orsus_R_cam
使用 vis_sensors.py 查看 Orsus 双目图像与点云俯视图¶
工作流程¶
完整 ROS2 导航工作流¶
1. 启动仿真环境
python simulator.py --env=nav2
2. Orsus 自动发布话题
/carter_1/odometry → tf_bridge → odom->base_link
/carter_1/cloud → tf_bridge + pointcloud_to_laserscan → /carter_1/scan
3. Navigation2 规划路径
/plan → 路径规划
/carter_1/cmd_vel → 速度命令
4. 速度命令转换为机器人动作
env.step({"carter_1": cmd_vel_tensor})
→ controller.compute_action_from_command(...)
→ controller.apply_action(...)
5. 机器人移动,Orsus 更新传感器数据
循环回到步骤 2
故障排除¶
问题 1: ROS2 话题未发布¶
检查:
确认 Isaac ROS Bridge 已安装
检查 ROS2 环境变量:
echo $ROS_DISTRO查看仿真日志中的
[EnvSetup]消息
解决:
# 手动设置 ROS2 环境(如果需要)
source /opt/ros/humble/setup.bash
export ROS_DISTRO=humble
问题 2: Graph 连接失败¶
检查: 查看仿真日志中的 [Orsus] 消息
解决: 确认 prim_path 正确指向机器人底盘链接
问题 3: 传感器数据异常¶
检查:
激光雷达范围设置
机器人位置是否正确
解决: 检查 USD 文件中的传感器配置
扩展¶
添加其他传感器¶
可以参考 Orsus 的实现方式添加其他传感器:
创建 USD 文件(包含 Graph)
创建 Python 配置类(继承
AssetBaseCfg)实现
spawn函数(加载 USD,配置连接)
自定义话题名称¶
修改 USD 文件中的 Graph 配置,更改话题名称。
参考¶
实现文件:
source/EAI_assets/EAI_assets/sensor/high_sensor/orsus.pyUSD 资产: provider 中的
payloads/sensors/orsus/Orsus_fix_type.usd环境配置示例:
source/EAI_hmrs/EAI_hmrs/envs/nav2.json动态挂载实现:
source/EAI_hmrs/EAI_hmrs/env_builder.pyROS2 Navigation2: https://navigation.ros.org/