Skip to main content

Quick Start


1. Start the Runtime Environment

This project is deployed with Docker containers. Start it from the project root:

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

Custom environment variables are supported:

Environment VariableDescriptionDefault
IMAGE_NAMEDocker image nameghrc_2026:v0
CONTAINER_NAMEContainer nameisaac_sim_lerobot
HOST_WORKSPACEProject directory path on the hostDirectory where run.sh is located
CONTAINER_WORKSPACEWorking directory path inside the container/workspace/GlobalHumanoidRobotChallenge_2026_Baseline
SHM_SIZEShared memory size8g
ISAAC_CACHE_ROOTIsaac Sim cache directory${HOME}/.cache/isaac_sim_container
HF_CACHEHugging Face cache directory${HOME}/.cache/huggingface
HEADLESSWhether to enable headless mode0 (No)

Examples:

# Basic start
./run.sh

# Headless mode (remote server)
./run.sh --headless

# Custom image name
IMAGE_NAME=my_custom_image:v1 ./run.sh

# Custom mount path
HOST_WORKSPACE=/my/project/path ./run.sh

⚠️ Before the first run, make sure you have installed Docker and NVIDIA Container Toolkit.

2. Modules


2.1 Teleoperate

Use the keyboard to teleoperate the Walker S2 robot:

# Before starting Teleoperate, you must set teleop.evdev_device_path to the correct event device for your keyboard.

# 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

ArgumentDescriptionDefault
--robot.typeRobot typewalker_s2_sim
--robot.headlessWhether to run in headless modefalse
--taskTask name (Part_Sorting, Conveyor_Sorting, Foam_Inlaying, Packing_Box)Foam_Inlaying
--teleop.typeTeleoperation device typewalker_s2_keyboard
--teleop.evdev_device_pathKeyboard evdev device pathAuto-scan (recommended to set explicitly)
--display_dataWhether to display camera framesfalse

2.1.1 Key Mapping

End-effector translation (hold to move continuously)

KeyAction
1Move end-effector in +Y
3Move end-effector in -Y
4Move end-effector in -X
6Move end-effector in +X
7Move end-effector in +Z (up)
9Move end-effector in -Z (down)

End-effector rotation (hold to rotate continuously)

KeyAction
yRotate around +Y
uRotate around -Y
vRotate around +X
bRotate around -X
nRotate around +Z
mRotate around -Z

Gripper control

KeyAction
kOpen gripper
lClose gripper

System control

KeyAction
oSwitch control arm (left ↔ right)
0Switch single-arm / dual-arm synchronous control mode
hMove to home position
+ / =Increase speed level
-Decrease speed level
qQuit teleoperation

2.1.2 Speed Levels

IndexSpeed (m/step)Notes
00.010Low speed (default)
10.035Medium speed

2.2 Record

Record human demonstration data through keyboard teleoperation:

# 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

⚠️ After running the command, Isaac Sim 5.1.0 will take some time to load. If a dialog shows Isaac Sim is not responding, please wait until it finishes loading. Once loaded, you will be prompted to press Enter to start recording. You can then teleoperate the dual arms with the keyboard and record episodes one by one manually.

⚠️ Press the left arrow key to discard the current episode. The arms will return to the initial pose and you can re-record the same one. Press the right arrow key to end the current episode early, save the data, and enter the environment reset stage to proceed to the next recording. After finishing, press Esc to stop recording completely and save all recorded episodes.

⚠️ The collected data is saved under the dataset.root directory.

ArgumentDescriptionDefault / Notes
--robot.typeRobot typewalker_s2_sim
--robot.headlessWhether to run in headless modefalse
--taskTask nameRequired
--teleop.typeTeleoperation device typewalker_s2_keyboard
--teleop.evdev_device_pathKeyboard evdev device pathAuto-scan (recommended to set explicitly)
--dataset.repo_idDataset ID (Hugging Face format)Required
--dataset.rootLocal save path (alternative to repo_id)None
--dataset.num_episodesNumber of episodes to record50
--dataset.single_taskTask descriptionRequired
--dataset.videoWhether to record videotrue
--dataset.fpsFPS30
--dataset.episode_time_sRecording time per episode (seconds)60
--dataset.push_to_hubWhether to upload to Hugging Facefalse
--play_soundsWhether to play prompt soundsfalse

⚠️ play_sounds must be set to false because the image does not include audio playback dependencies.

Dataset Structure

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

Replay a recorded dataset for verification:

# 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
ArgumentDescriptionDefault / Notes
--robot.typeRobot typewalker_s2_sim
--taskTask name (must match the recording)Required
--dataset.repo_idDataset sourceRequired
--dataset.rootLocal dataset path (alternative to repo_id)None
--dataset.episodeEpisode index to replay (starting from 0)Required
--play_soundsWhether to play prompt soundsfalse

⚠️ play_sounds must be set to false because the image does not include audio playback dependencies.

Environment State Restore Mechanism

During replay, the system automatically restores the poses of environment objects into the simulation scene:

  1. Data source: the observation.state column contains the robot state (first 20 dimensions) and the environment object poses (subsequent dimensions).
  2. When: after robot.connect() and before starting replay.
  3. Procedure:
    • Extract environment object poses from the first frame (skip the first 20 dimensions of robot state).
    • Call robot.set_environment_state() to restore object poses.
    • Step the physics simulation for 50 steps to let objects settle.

Environment state dimension calculation:

TaskDimension formulaNotes
Part_Sortingnum_parts × 2 × 7Two types of parts
Conveyor_Sortingnum_parts × 2 × 7Two types of parts
Packing_Boxnum_boxes × num_parts × 7Multiple boxes
Foam_Inlaying0No tracked objects

Each object is 7D: [x, y, z, qx, qy, qz, qw]