跳到主要内容

快速开始


1. 启动运行环境

本项目使用 Docker 容器化部署,从项目根目录启动:

chmod +x run.sh
sudo ./run.sh

可自定义环境变量

环境变量说明默认值
IMAGE_NAMEDocker 镜像名称ghrc_2026:v0
CONTAINER_NAME容器名称isaac_sim_lerobot
HOST_WORKSPACE主机项目目录路径run.sh 所在目录
CONTAINER_WORKSPACE容器内工作目录路径/workspace/GlobalHumanoidRobotChallenge_2026_Baseline
SHM_SIZE共享内存大小8g
ISAAC_CACHE_ROOTIsaac Sim 缓存目录${HOME}/.cache/isaac_sim_container
HF_CACHEHuggingFace 缓存目录${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)说明
00.010低速(默认)
10.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 Facefalse
--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,镜像中没有安装语音播放依赖

环境状态恢复机制

回放时,系统会自动恢复数据集中的环境物体位姿到仿真场景中:

  1. 数据来源: observation.state 列包含机器人状态(前 20 维)和环境物体位姿(后续维度)
  2. 恢复时机: 在 robot.connect() 之后、开始回放之前
  3. 恢复流程:
    • 从首帧提取环境物体位姿(跳过前 20 维机器人状态)
    • 调用 robot.set_environment_state() 恢复物体位姿
    • 推进物理仿真 50 步让物体稳定

环境状态维度计算:

任务维度计算公式说明
Part_Sortingnum_parts × 2 × 72 类零件
Conveyor_Sortingnum_parts × 2 × 72 类零件
Packing_Boxnum_boxes × num_parts × 7多个箱子
Foam_Inlaying0无追踪物体

每个物体 7 维:[x, y, z, qx, qy, qz, qw]