# XR-RM75 双臂遥操作 基于 **Ubuntu 22.04、ROS2 Humble、PICO 4 Ultra 和睿尔曼 RM75** 的双臂 XR 遥操作 工作空间,支持单臂/双臂 Mock 与真机、MuJoCo 显示和右臂番茄采摘 ACT 数据采集。 > [!WARNING] > 真机命令会连接并控制机械臂。首次运行必须从 Mock 和单臂低速验证开始,确保急停 > 可用且工作区无人。当前项目没有双臂碰撞检测或避障。 ## 当前能力 - PICO/XR 双手柄 UDP 输入,相对位姿目标与 Placo QP 七关节控制。 - 单臂/双臂 Mock 与真机、夹爪开合,以及只读 MuJoCo 双臂显示。 - 工作空间/圆柱限位、速度限制、指令超时和安全慢停。 - 三路 RealSense 链路测试与右臂 ACT/ALOHA 风格 HDF5 采集。 尚未完成:左腕 D405 的 ACT 接入、相机 ROS launch/TF/标定、目标检测、双臂碰撞避障、任务级状态机,以及 PICO 与 ROS 的完整时间同步和状态回传。 ## 系统架构 ```text PICO / XRoboToolkit -> UDP JSON -> xr_rm_input/udp_controller_receiver -> /xr/left_controller、/xr/right_controller -> xr_rm_teleop/single_arm_velocity_teleop -> 相对 TCP 目标 + Placo QP -> Mock 或 RM75 rm_movej_canfd -> joint_states / 调试话题 ├── xr_rm_mujoco/dual_arm_simulator └── ActControlSample + D455/D405 -> act_episode_recorder -> episode_<编号>.hdf5 ``` 工作空间包含五个 ROS2 包:`xr_rm_input` 负责手柄输入,`xr_rm_interfaces` 定义消息, `xr_rm_teleop` 实现控制与 ACT 录制,`xr_rm_bringup` 提供启动和配置, `xr_rm_mujoco` 负责只读运动学显示。 `single_arm_velocity_teleop` 每个实例只控制一台机械臂;双臂模式分别启动 `left_arm_teleop` 和 `right_arm_teleop`。 ## 环境与构建 在工作空间根目录执行: ```bash cd /home/robot/WS_xr source /opt/ros/humble/setup.bash rosdep update rosdep install --from-paths src -y --ignore-src colcon build --symlink-install source install/setup.bash ``` 遥操作、MuJoCo 和 ACT 节点固定使用 `/home/robot/miniconda3/envs/xr/bin/python`, 其中固定 Placo 0.9.4、Pinocchio 3.7.0、NumPy 2.2.6 和 MuJoCo 3.10.0;不要从 用户或系统 Python 覆盖这些版本。 真机模式另需睿尔曼 Python API2。ACT 采集需要 `h5py` 和 `pyrealsense2`, 三相机测试还需要 OpenCV。Mock 模式不依赖厂商 SDK。 ## 快速开始 以下命令均在 `/home/robot/WS_xr` 执行,并先 source ROS2 与 `install/setup.bash`。 ### Mock ```bash ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=true ``` 另开终端发送模拟手柄数据: ```bash ros2 run xr_rm_input sample_udp_sender \ --hand both --host 127.0.0.1 --port 15000 \ --pattern axis_sweep --seconds 30 ``` 单臂调试时将 `arm` 改为 `left` 或 `right`。推荐先分别完成左右单臂 Mock,再进入双臂或真机验证。 ### MuJoCo ```bash ros2 launch xr_rm_bringup arm_debug.launch.py \ arm:=both use_mock:=true use_mujoco:=true ``` MuJoCo 只订阅关节状态,不参与控制。真机显示可将 `use_mock` 改为 `false`, 但该命令会同时连接两台 RM75。 ### PICO 输入 只保留一个 UDP 输入源,然后启动 XRoboToolkit bridge: ```bash ros2 run xr_rm_input xrobotoolkit_to_udp_bridge \ --host 127.0.0.1 --port 15000 --hz 90 ``` 确认左右 topic 持续接收数据: ```bash ros2 topic hz /xr/left_controller ros2 topic hz /xr/right_controller ``` 图形启动面板可运行 `python3 src/xr_rm_bringup/tools/launcher_ui.py`,提供 Simulation、MuJoCo、Real Hardware 和 Diagnostics 模式。 ### 真机 确认对应 YAML 中 `move_to_initial_pose_on_connect: false`,再从单臂开始: ```bash ros2 launch xr_rm_bringup arm_debug.launch.py arm:=left use_mock:=false ros2 launch xr_rm_bringup arm_debug.launch.py arm:=right use_mock:=false ``` 单臂方向、限位、急停、超时停止和夹爪均验证后,才能启动双臂: ```bash ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=false ``` 按住 `grip` 控制对应机械臂;松开后停止。点击 `trigger` 切换对应夹爪开/关。 ## RealSense 与 ACT 采集 ### 三相机测试 连接两台 D405 和一台 D455 后执行: ```bash /home/robot/miniconda3/envs/xr/bin/python \ src/xr_rm_bringup/tools/realsense_multi_camera_test.py ``` 默认将序列号 `260322272273` 识别为左腕 D405,另一台 D405 为右腕,D455 为 全局相机。按 `S` 保存三路快照,按 `Q` 或 `Esc` 退出并打印链路汇总。 快照目录为 `src/xr_rm_bringup/test/camera_test_output/`。 ### ACT episode ACT 目前仅支持右臂真机。以下命令会连接并控制右侧 RM75: ```bash ros2 launch xr_rm_bringup arm_debug.launch.py \ arm:=right use_mock:=false record_act:=true ``` 默认配置位于 `xr_rm_bringup/config/act_tomato_pick.yaml`:D455 序列号 `234222303366`,右腕 D405 序列号 `412622272532`,90 Hz 控制数据下采样为 30 Hz。输出位于 `/home/robot/ACT_Data/tomato_pick/`,状态发布到 `/act/recording_status`。 录制流程: 1. 打开夹爪并松开右手 `grip`。 2. 点击右手 B 完成预检并进入 `ARMED`。 3. 按住右手 `grip` 开始遥操作和录制。 4. 松开 `grip`,点击右手 B 保存。 `ARMED` 或录制期间长按左手 Y 一秒可丢弃当前 episode。录制期间点击右手 A 会触发初始化位姿并使当前数据无效。 预检和保存会检查控制连续性、反馈有效性、夹爪状态、磁盘空间、相机帧率/掉帧、 帧龄和双相机时间差。不合格或中断的数据保存在 `rejected/`。 ## Launch 参数 统一入口为 `xr_rm_bringup/launch/arm_debug.launch.py`: | 参数 | 默认值 | 说明 | | --- | --- | --- | | `arm` | `right` | `left`、`right` 或 `both` | | `use_mock` | `true` | `false` 会连接真机 | | `use_mujoco` | `false` | 仅支持 `arm:=both` | | `record_act` | `false` | 仅支持 `arm:=right use_mock:=false` | | `udp_host` | `0.0.0.0` | UDP 监听地址 | | `udp_port` | `15000` | UDP 监听端口 | | `udp_timer_hz` | `200.0` | UDP receiver 轮询频率 | ## 配置 | 文件 | 用途 | | --- | --- | | `dual_arm_rm75.yaml` | 双臂节点、网络、控制与安全参数 | | `left_arm_rm75.yaml` | 左臂单独调试 | | `right_arm_rm75.yaml` | 右臂单独调试 | | `peripherals_rm75.yaml` | 工具坐标、负载和末端执行器 | | `dual_arm_mujoco.yaml` | MuJoCo 刷新频率 | | `act_tomato_pick.yaml` | ACT 相机、存储与质量阈值 | 修改某一侧控制参数时,同时检查单臂和双臂 YAML 是否需要同步。必须保留工作空间/ 圆柱限位、线速度与角速度限制、关节速度/加速度限制、指令超时和安全停止逻辑。 `configure_safety_limits` 不得默认关闭; `move_to_initial_pose_on_connect` 必须保持默认 `false`。 ## 测试 在工作空间根目录执行: ```bash source /opt/ros/humble/setup.bash colcon build --symlink-install colcon test --event-handlers console_direct+ colcon test-result --verbose ``` 涉及遥操作姿态控制时,额外运行: ```bash pytest src/xr_rm_teleop/test/test_orientation_control.py ``` 真机验证不属于自动测试。默认使用 `use_mock:=true`,未经现场安全确认不要连接或 移动机械臂。