快速开始
1. 启动运行环境
本项目使用 Docker 容器化部署,从项目根目录启动:
chmod +x run.sh
sudo ./run.sh
可自定义环境变量
| 环境变量 | 说明 | 默认值 |
|---|---|---|
IMAGE_NAME | Docker 镜像名称 | ghrc_2026:v0 |
CONTAINER_NAME | 容器名称 | isaac_sim_lerobot |
HOST_WORKSPACE | 主机项目目录路径 | run.sh 所在目录 |
CONTAINER_WORKSPACE | 容器内工作目录路径 | /workspace/GlobalHumanoidRobotChallenge_2026_Baseline |
SHM_SIZE | 共享内存大小 | 8g |
ISAAC_CACHE_ROOT | Isaac Sim 缓存目录 | ${HOME}/.cache/isaac_sim_container |
HF_CACHE | HuggingFace 缓存目录 | ${HOME}/.cache/huggingface |
HEADLESS | 是否启用无头模式 | 0(否) |
使用示例
# 基本启动
./run.sh
# 无头模式(远程服务器)
./run.sh --headless
# 自定义镜像名
IMAGE_NAME=my_custom_image:v1 ./run.sh
# 自定义挂载路径
HOST_WORKSPACE=/my/project/path ./run.sh
⚠️ 首次运行前请确保已完成 Docker、NVIDIA Container Toolkit 安装。
2. 功能模块
2.1 遥操作 (Teleoperate)
使用键盘控制 Walker S2 机器人进行遥操作:
# 在开始Teleoperate之前必须修改teleop.evdev_device_path为自己设备对应event
# task1
/isaac-sim/python.sh src/lerobot/scripts/lerobot_teleoperate.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Part_Sorting \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--display_data=false
# task2
/isaac-sim/python.sh src/lerobot/scripts/lerobot_teleoperate.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Conveyor_Sorting \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--display_data=false
# task3
/isaac-sim/python.sh src/lerobot/scripts/lerobot_teleoperate.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Foam_Inlaying \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--display_data=false
# task4
/isaac-sim/python.sh src/lerobot/scripts/lerobot_teleoperate.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Packing_Box \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--display_data=false
| 参数 | 说明 | 默认值 |
|---|---|---|
--robot.type | 机器人类型 | walker_s2_sim |
--robot.headless | 是否无头模式 | false |
--task | 任务名称(Part_Sorting, Conveyor_Sorting, Foam_Inlaying, Packing_Box) | 必填 |
--teleop.type | 遥操作设备类型 | walker_s2_keyboard |
--teleop.evdev_device_path | 键盘 evdev 设备路径 | 自动遍历(推荐指定) |
--display_data | 是否显示相机画面 | false |
2.1.1 键盘映射
末端执行器位移(按住持续移动)
| 按键 | 动作 |
|---|---|
1 | 末端 +Y 方向移动 |
3 | 末端 -Y 方向移动 |
4 | 末端 -X 方向移动 |
6 | 末端 +X 方向移动 |
7 | 末端 +Z 方向移动(上) |
9 | 末端 -Z 方向移动(下) |
末端执行器旋转(按住持续旋转)
| 按键 | 动作 |
|---|---|
y | 绕 Y 轴正向旋转 |
u | 绕 Y 轴负向旋转 |
v | 绕 X 轴正向旋转 |
b | 绕 X 轴负向旋转 |
n | 绕 Z 轴正向旋转 |
m | 绕 Z 轴负向旋转 |
夹爪控制
| 按键 | 动作 |
|---|---|
k | 夹爪张开 |
l | 夹爪关闭 |
系统控制
| 按键 | 动作 |
|---|---|
o | 切换控制臂(左 ↔ 右) |
0 | 切换单臂 / 双臂同步控制模式 |
h | 切换到 home 位置 |
+ / = | 提升移动速度等级 |
- | 降低移动速度等级 |
q | 退出遥操作 |
2.1.2 速度分级
| 索引 | 速度 (m/step) | 说明 |
|---|---|---|
| 0 | 0.010 | 低速(默认) |
| 1 | 0.035 | 中速 |
2.2 数据采集 (Record)
通过键盘遥操作录制人类示教数据:
# task1
/isaac-sim/python.sh src/lerobot/scripts/lerobot_record.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Part_Sorting \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--dataset.repo_id=your_org/Part_Sorting \
--dataset.root=datasets/Part_Sorting/record/v0 \
--dataset.num_episodes=10 \
--dataset.single_task="Part Sorting" \
--dataset.video=true \
--dataset.fps=30 \
--dataset.episode_time_s=1000000 \
--dataset.push_to_hub=false \
--play_sounds=false
# task2
/isaac-sim/python.sh src/lerobot/scripts/lerobot_record.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Conveyor_Sorting \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--dataset.repo_id=your_org/Conveyor_Sorting \
--dataset.root=datasets/Conveyor_Sorting/record/v0 \
--dataset.num_episodes=10 \
--dataset.single_task="Conveyor Sorting" \
--dataset.video=true \
--dataset.fps=30 \
--dataset.episode_time_s=1000000 \
--dataset.push_to_hub=false \
--play_sounds=false
# task3
/isaac-sim/python.sh src/lerobot/scripts/lerobot_record.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Foam_Inlaying \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--dataset.repo_id=your_org/Foam_Inlaying \
--dataset.root=datasets/Foam_Inlaying/record/v0 \
--dataset.num_episodes=10 \
--dataset.single_task="Foam Inlaying" \
--dataset.video=true \
--dataset.fps=30 \
--dataset.episode_time_s=1000000 \
--dataset.push_to_hub=false \
--play_sounds=false
# task4
/isaac-sim/python.sh src/lerobot/scripts/lerobot_record.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Packing_Box \
--teleop.type=walker_s2_keyboard \
--teleop.evdev_device_path=/dev/input/event2 \
--dataset.repo_id=your_org/Packing_Box \
--dataset.root=datasets/Packing_Box/record/v0 \
--dataset.num_episodes=10 \
--dataset.single_task="Packing Box" \
--dataset.video=true \
--dataset.fps=30 \
--dataset.episode_time_s=1000000 \
--dataset.push_to_hub=false \
--play_sounds=false
⚠️ 命令运行后,需要一段时间加载IsaacSim 5.1.0,如果弹出命令框显示IssacSim未响应,请耐心等待直到加载成功。加载成功后会提示按下Enter键录制开始。可以直接用键盘遥操作控制双臂运动,手动一条条录制
⚠️ 按下左方向键丢弃当前 episode 数据,双臂返回初始位置,重新录制同一条。按下右方向键提前结束当前 episode,保存数据并进入重置环境阶段,进入下一条录制。录制完成后按esc完全停止录制,保存所有已录制的 episodes
⚠️ 收集的数据保存在设dataset.root目录下
| 参数 | 说明 | 默认值 / 备注 |
|---|---|---|
--robot.type | 机器人类型 | walker_s2_sim |
--robot.headless | 是否无头模式 | false |
--task | 任务名称 | 必填 |
--teleop.type | 遥操作设备类型 | walker_s2_keyboard |
--teleop.evdev_device_path | 键盘 evdev 设备路径 | 自动遍历(推荐指定) |
--dataset.repo_id | 数据集 ID(Hugging Face 格式) | 必填 |
--dataset.root | 本地保存路径(替代 repo_id) | None |
--dataset.num_episodes | 录制 episode 数量 | 50 |
--dataset.single_task | 任务描述 | 必填 |
--dataset.video | 是否录制视频 | true |
--dataset.fps | 帧率 | 30 |
--dataset.episode_time_s | 每集录制时长(秒) | 60 |
--dataset.push_to_hub | 是否上传到 Hugging Face | false |
--play_sounds | 是否播放提示音 | false |
⚠️
play_sounds参数必须false,镜像中没有安装语音播放依赖
数据集结构
datasets/packing_box/
├── data
│ └── chunk-000
│ └── file-000.parquet
├── meta
│ ├── episodes
│ │ └── chunk-000
│ │ └── file-000.parquet
│ ├── info.json
│ ├── stats.json
│ └── tasks.parquet
└── videos
├── observation.images.head_left
│ └── chunk-000
│ └── file-000.mp4
├── observation.images.head_right
│ └── chunk-000
│ └── file-000.mp4
├── observation.images.wrist_left
│ └── chunk-000
│ └── file-000.mp4
└── observation.images.wrist_right
└── chunk-000
└── file-000.mp4
2.3 数据回放 (Replay)
回放已录制的数据集进行验证:
# task1
/isaac-sim/python.sh src/lerobot/scripts/lerobot_replay.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Part_Sorting \
--dataset.repo_id=your_org/your_dataset \
--dataset.root=datasets/Part_Sorting/record/v0 \
--dataset.episode=0 \
--play_sounds=false
# task2
/isaac-sim/python.sh src/lerobot/scripts/lerobot_replay.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Conveyor_Sorting \
--dataset.repo_id=your_org/your_dataset \
--dataset.root=datasets/Conveyor_Sorting/record/v0 \
--dataset.episode=0 \
--play_sounds=false
# task3
/isaac-sim/python.sh src/lerobot/scripts/lerobot_replay.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Foam_Inlaying \
--dataset.repo_id=your_org/your_dataset \
--dataset.root=datasets/Foam_Inlaying/record/v0 \
--dataset.episode=0 \
--play_sounds=false
# task4
/isaac-sim/python.sh src/lerobot/scripts/lerobot_replay.py \
--robot.type=walker_s2_sim \
--robot.headless=false \
--task=Packing_Box \
--dataset.repo_id=your_org/your_dataset \
--dataset.root=datasets/Packing_Box/record/v0 \
--dataset.episode=0 \
--play_sounds=false
| 参数 | 说明 | 默认值 / 备注 |
|---|---|---|
--robot.type | 机器人类型 | walker_s2_sim |
--task | 任务名称(必须与录制时一致) | 必填 |
--dataset.repo_id | 数据集来源 | 必填 |
--dataset.root | 本地数据集路径(替代 repo_id) | None |
--dataset.episode | 要回放的 episode 索引(从 0 开始) | 必填 |
--play_sounds | 是否播放提示音 | false |
⚠️
play_sounds参数必须false,镜像中没有安装语音播放依赖
环境状态恢复机制
回放时,系统会自动恢复数据集中的环境物体位姿到仿真场景中:
- 数据来源:
observation.state列包含机器人状态(前 20 维)和环境物体位姿(后续维度) - 恢复时机: 在
robot.connect()之后、开始回放之前 - 恢复流程:
- 从首帧提取环境物体位姿(跳过前 20 维机器人状态)
- 调用
robot.set_environment_state()恢复物体位姿 - 推进物理仿真 50 步让物体稳定
环境状态维度计算:
| 任务 | 维度计算公式 | 说明 |
|---|---|---|
| Part_Sorting | num_parts × 2 × 7 | 2 类零件 |
| Conveyor_Sorting | num_parts × 2 × 7 | 2 类零件 |
| Packing_Box | num_boxes × num_parts × 7 | 多个箱子 |
| Foam_Inlaying | 0 | 无追踪物体 |
每个物体 7 维:[x, y, z, qx, qy, qz, qw]