Quick Reference#

Quick commands for common tasks. For detailed explanations, see Calibrating the SO-101 and Operating the SO-101.

Simulation (teleop and eval) — Docker#

Launch the Isaac Sim container for sim teleop and sim policy evaluation:

xhost + 
docker run --name teleop -it --privileged --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \
   -e "PRIVACY_CONSENT=Y" \
   -e DISPLAY \
   -v /dev:/dev \
   -v /run/udev:/run/udev:ro \
   -v $HOME/.Xauthority:/root/.Xauthority \
   -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \
   -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \
   -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \
   -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \
   -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \
   -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \
   -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \
   -v ~/docker/isaac-sim/documents:/root/Documents:rw \
   -v ~/.cache/huggingface/lerobot/calibration:/root/.cache/huggingface/lerobot/calibration \
   -v ~/sim2real/Sim-to-Real-SO-101-Workshop/docker/env:/root/env \
   -v ~/sim2real/Sim-to-Real-SO-101-Workshop:/workspace/Sim-to-Real-SO-101-Workshop \
   teleop-docker:latest

Run this container for the client/server GR00T inference workflow.

xhost +
docker run -it --rm --name real-robot --network host --privileged --gpus all \
    -e DISPLAY \
    -v /dev:/dev \
    -v /run/udev:/run/udev:ro \
    -v $HOME/.Xauthority:/root/.Xauthority \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v ~/.cache/huggingface/lerobot/calibration:/root/.cache/huggingface/lerobot/calibration \
    -v ~/sim2real/models:/workspace/models \
    -v ~/sim2real/Sim-to-Real-SO-101-Workshop/docker/env:/root/env \
    -v ~/sim2real/Sim-to-Real-SO-101-Workshop/docker/real/scripts:/Isaac-GR00T/gr00t/eval/real_robot/SO100 \
    real-robot \
    /bin/bash

Find Robot Ports#

Inside the teleop-docker container:

lerobot-find-port

When prompted, disconnect USB cable and press Enter. The tool reports the port (e.g., /dev/ttyACM0).

You can either write these down to use for future commands, or assign them to environment variables in your terminal.

# Save to environment variables
setenv ROBOT_PORT=/dev/ttyACM0
setenv TELEOP_PORT=/dev/ttyACM1

# Set robot IDs (based on your station label)
setenv ROBOT_ID=orange_robot
setenv TELEOP_ID=orange_teleop

Find Cameras#

Inside the teleop-docker container:

lerobot-find-cameras opencv

Review captured images in ./output/captured_images to identify gripper vs. external camera indices.

Similar to the robot ports, you can save these to environment variables in your terminal or enter them manually into commands.

# Save to environment variables
setenv CAMERA_GRIPPER=0
setenv CAMERA_EXTERNAL=2

Calibrate Leader Arm (Teleop)#

Inside teleop-docker container:

lerobot-calibrate \
    --teleop.type=so101_leader \
    --teleop.port=$TELEOP_PORT \
    --teleop.id=$TELEOP_ID

Follow prompts to move joints to middle-of-range, then through full range of motion.

Calibrate Follower Arm (Robot)#

Inside teleop-docker container:

lerobot-calibrate \
    --robot.type=so101_follower \
    --robot.port=$ROBOT_PORT \
    --robot.id=$ROBOT_ID

Teleoperation of Real Robot#

Inside teleop-docker container:

lerobot-teleoperate \
    --robot.type=so101_follower \
    --robot.port=$ROBOT_PORT \
    --robot.id=$ROBOT_ID \
    --teleop.type=so101_leader \
    --teleop.port=$TELEOP_PORT \
    --teleop.id=$TELEOP_ID

Common Issues#

See Troubleshooting Guide for detailed solutions.

Symptom

Likely Cause

All motors missing

Power not connected

One motor missing

Loose motor cable, or just needs restart

Torque_Enable error

Power cycle robot

Camera index changed

Re-run lerobot-find-cameras

Port not found

Check USB, run lerobot-find-port