diff --git a/README.md b/README.md index f1f65d1..5fe0e81 100755 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ PICO/XR 双手柄 UDP JSON -> xr_rm_teleop/single_arm_velocity_teleop -> Placo QP 单步逆解 -> 左右 RM75 七关节角透传控制 + -> /xr_rm//joint_states + -> 可选 xr_rm_mujoco/dual_arm_simulator -> /xr_rm//current_pose、raw_target_pose、target_pose、cmd_vel、target_clamped 调试话题 ``` @@ -20,6 +22,7 @@ PICO/XR 双手柄 UDP JSON - PICO/XR 手柄 UDP 数据接收,并分发到左右手柄 ROS2 话题。 - 通过统一的 `arm_debug.launch.py` 支持左臂、右臂、双臂的 mock 调试和真机调试。 +- 使用现有双臂 URDF 的 MuJoCo 运动学显示,可由 Mock 或真机反馈同步双臂姿态。 - RM75 真机连接适配,包含关节反馈缓存、`rm_movej_canfd` 关节透传、安全速度/加速度配置、可选初始化点位移动。 - Placo 0.9.4 RM75 QP 逆解;收到首帧有效关节反馈后才启用,求解失败时保留上一组有效关节目标。 - 真机模式下,点击对应手柄 `trigger` 可切换并保持对应夹爪开/关状态。 @@ -41,12 +44,13 @@ src/ ├── docs/superpowers/ # Superpowers 设计与实施计划 ├── xr_rm_bringup/ │ ├── config/ +│ │ ├── dual_arm_mujoco.yaml # MuJoCo 显示刷新参数 │ │ ├── dual_arm_rm75.yaml # 双臂配置:left_arm_teleop 与 right_arm_teleop │ │ ├── left_arm_rm75.yaml # 左臂单独调试配置 │ │ ├── right_arm_rm75.yaml # 右臂单独调试配置 │ │ └── peripherals_rm75.yaml # 左右臂末端外设配置 │ ├── launch/ -│ │ └── arm_debug.launch.py # 统一入口:arm:=left/right/both, use_mock:=true/false +│ │ └── arm_debug.launch.py # 统一入口:单臂/双臂、Mock/真机、可选 MuJoCo │ └── tools/ │ ├── launcher_ui.py # 图形化调试启动面板 │ └── realman_dual_arm_state_monitor.py @@ -62,6 +66,9 @@ src/ ├── xr_rm_interfaces/ │ └── msg/ │ └── XrController.msg # 手柄状态与位姿 +├── xr_rm_mujoco/ +│ └── xr_rm_mujoco/ +│ └── dual_arm_simulator.py # 双臂 URDF 运动学映射与 MuJoCo viewer └── xr_rm_teleop/ ├── models/ │ ├── rm75/ # 旧 RM75 模型资源(launch 不再选用) @@ -229,6 +236,7 @@ ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=false - `arm`:`left`、`right`、`both`,默认 `right`。 - `use_mock`:`true` 不连接真机,`false` 连接 RM75。 +- `use_mujoco`:`true` 额外启动双臂 MuJoCo 显示,默认 `false`,仅支持 `arm:=both`。 - `udp_host`:UDP 监听地址,默认 `0.0.0.0`。 - `udp_port`:UDP 监听端口,默认 `15000`。 - `udp_timer_hz`:UDP receiver 轮询频率,默认 `200.0`。 @@ -236,6 +244,30 @@ ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=false 机器人 IP/端口、控制频率、CANFD、限速、工具和初始化位姿等行为参数只由对应 YAML 配置,launch 不再提供同名覆盖项。 +## MuJoCo 双臂仿真 + +无真机时,由 Mock 关节状态驱动 MuJoCo: + +```bash +ros2 launch xr_rm_bringup arm_debug.launch.py \ + arm:=both use_mock:=true use_mujoco:=true +``` + +连接真机时,由两台 RM75 的实际关节反馈同步 MuJoCo。下面命令会连接真机,执行前必须完成真机安全检查: + +```bash +ros2 launch xr_rm_bringup arm_debug.launch.py \ + arm:=both use_mock:=false use_mujoco:=true +``` + +MuJoCo 只订阅当前关节状态,不参与控制,也不向真机下发指令: + +- `/xr_rm/left_rm75/joint_states`、`/xr_rm/right_rm75/joint_states`:当前适配器反馈;Mock 与真机模式均按控制周期约 `90 Hz` 发布。真机底层原始反馈周期仍为 `5 ms`(约 `200 Hz`),由遥操作节点按 `90 Hz` 采样发布。 +- `/xr_rm/left_rm75/joint_target`、`/xr_rm/right_rm75/joint_target`:经 QP 和现有限制处理后的目标关节角,仅用于调试,MuJoCo 不订阅。 +- MuJoCo viewer 默认按 `dual_arm_mujoco.yaml` 中的 `60 Hz` 刷新。其初始姿态直接来自 `dual_arm_rm75.yaml` 的 `initial_joint_pose`,不会在 MuJoCo YAML 中重复保存。 + +Mock 模式的遥操作目标仍经过 `dual_arm_rm75.yaml` 中的工作空间、圆柱、线速度、角速度、关节速度/加速度、超时和停止限制。左手 X、右手 A 分别立即复位对应 Mock 机械臂;Grip 保持按下时,下一控制周期会重新锚定并继续遥操作。真机复位完成后仍需松开 Grip 才能恢复遥操作,且 `move_to_initial_pose_on_connect` 保持为 `false`,连接真机不会自动移动。 + ## 配置文件说明 `xr_rm_bringup/config/dual_arm_rm75.yaml` 是双臂配置主文件,包含两个 ROS 节点命名空间: @@ -245,6 +277,8 @@ ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=false `left_arm_rm75.yaml` 和 `right_arm_rm75.yaml` 用于 `arm_debug.launch.py arm:=left/right` 的单臂调试,因为单臂节点名是 `single_arm_velocity_teleop`。 +`dual_arm_mujoco.yaml` 只保存 MuJoCo viewer 刷新频率;双臂初始关节角和遥操作限制继续统一读取 `dual_arm_rm75.yaml`。 + `xr_rm_bringup/config/peripherals_rm75.yaml` 保存真实控制器使用的末端工具坐标、负载和左右臂外设选择。左臂 `scissorgripper: 2` 是外设选择值,选择 `minisci`,TCP 的 Z 向偏移为 `0.165 m`;右臂 `scissorgripper: 1`,选择 `omnipic`,TCP 的 Z 向偏移为 `0.14 m`。真机连接阶段仍会初始化外设,关节反馈、关节指令、慢停和开合命令复用该单臂节点的同一个 RealMan 连接。 Placo 使用 `xr_rm_teleop/models/dual_rm75/Dual_arm.urdf`。左右 ROS 节点分别创建独立 solver:左臂从 `scissor_base_link` 到 `scissor_scissor_tcp`,并 mask 右臂;右臂从 `omnipic_base_link` 到 `omnipic_OmniPic_tcp`,并 mask 左臂。节点目标仍在各自局部基坐标系中,现有 PICO 映射不改为公共坐标系。