# open_drybox — MindRobot IL 遥操作任务

基于 Isaac Lab `ManagerBasedRLEnv` 的模仿学习（IL）数据采集任务，支持 MindRobot 单臂/双臂 IK 绝对/相对控制，配合 XR 手柄或键盘进行遥操作。

---

## 注册的任务 ID

| 任务 ID | 控制模式 | 说明 |
|---|---|---|
| `Isaac-MindRobot-LeftArm-IK-Rel-v0` | 左臂 IK 相对 | EEF 增量控制 |
| `Isaac-MindRobot-LeftArm-IK-Abs-v0` | 左臂 IK 绝对 | EEF 绝对位姿控制 |
| `Isaac-MindRobot-DualArm-IK-Abs-v0` | 双臂 IK 绝对 | 双臂 + 底盘，20D 动作空间 |

---

## 目录结构

```
open_drybox/
├── __init__.py                        # Gym 任务注册
├── mindrobot_cfg.py                   # 机器人关节/执行器/初始位姿配置（MINDBOT_CFG）
│                                      # 及所有关节名称常量（MINDBOT_*）
├── mindrobot_left_arm_ik_env_cfg.py   # 单臂任务环境配置
├── mindrobot_dual_arm_ik_env_cfg.py   # 双臂任务环境配置（继承 ManagerBasedRLEnvCfg）
├── mdp/
│   ├── __init__.py                    # 聚合 isaaclab.envs.mdp + stack.mdp + 本地 obs
│   └── observations.py               # gripper_pos(joint_names) — 支持双爪独立观测
└── agents/
    └── robomimic/
        ├── bc_rnn_low_dim.json        # RoboMimic BC-RNN 低维观测配置
        ├── bc_rnn_image_200.json      # BC-RNN 图像观测配置
        └── bc_rnn_image_cosmos.json   # BC-RNN Cosmos 图像配置
```

---

## 双臂动作空间（20D）

```
[ left_arm(7) | wheel(4) | left_gripper(1) | right_arm(7) | right_gripper(1) ]
  EEF 绝对位姿   轮速rad/s  +1=开/-1=关       EEF 绝对位姿   +1=开/-1=关
  [x,y,z,qw,qx,qy,qz]                        [x,y,z,qw,qx,qy,qz]
```

轮子顺序（与 `MINDBOT_WHEEL_JOINTS` 一致）：`[right_b, left_b, left_f, right_f]`

---

## 关键常量（mindrobot_cfg.py）

```python
MINDBOT_LEFT_ARM_JOINTS   = "l_joint[1-6]"
MINDBOT_RIGHT_ARM_JOINTS  = "r_joint[1-6]"
MINDBOT_LEFT_GRIPPER_JOINTS  = ["left_hand_joint_left",  "left_hand_joint_right"]
MINDBOT_RIGHT_GRIPPER_JOINTS = ["right_hand_joint_left", "right_hand_joint_right"]
MINDBOT_WHEEL_JOINTS = ["right_b_revolute_Joint", "left_b_revolute_Joint",
                         "left_f_revolute_Joint",  "right_f_revolute_Joint"]
MINDBOT_LEFT_EEF_BODY  = "left_hand_body"
MINDBOT_RIGHT_EEF_BODY = "right_hand_body"
```

---

## 遥操作启动命令

```bash
# XR 双臂
~/IsaacLab/isaaclab.sh -p scripts/environments/teleoperation/teleop_xr_agent.py \
    --task Isaac-MindRobot-DualArm-IK-Abs-v0

# XR 单臂
~/IsaacLab/isaaclab.sh -p scripts/environments/teleoperation/teleop_xr_agent.py \
    --task Isaac-MindRobot-LeftArm-IK-Abs-v0

# 键盘 + 差速底盘
~/IsaacLab/isaaclab.sh -p scripts/environments/teleoperation/tele_se3_with_wheel_agent.py \
    --task Isaac-MindRobot-LeftArm-IK-Rel-v0
```

---

## 数据采集 / 回放

```bash
# 录制 demo（输出 HDF5）
~/IsaacLab/isaaclab.sh -p scripts/tools/record_demos.py \
    --task Isaac-MindRobot-DualArm-IK-Abs-v0 --num_demos 10

# 回放 demo 验证
~/IsaacLab/isaaclab.sh -p scripts/tools/replay_demos.py \
    --task Isaac-MindRobot-DualArm-IK-Abs-v0 --dataset path/to/demo.hdf5
```

---

## 注意事项

- 所有 Isaac Lab 脚本必须通过 `~/IsaacLab/isaaclab.sh -p` 启动
- USD 资源路径通过环境变量设置：`export MINDBOT_ASSETS_DIR=/your/path`
- `mdp/observations.py` 的 `gripper_pos` 覆盖了 `stack.mdp` 的同名函数，
  支持通过 `joint_names` 参数区分左右夹爪，**不需要修改 IsaacLab 源码**
- 双臂环境的 `FrameTransformer` 根节点是各臂的 `base_link`，目标是 EEF prim
