Before teleop/recording, run the setup checker:
uv run python scripts/check_setup.pyIf this passes, you can proceed with the following teleop/recording commands. If something doesn't work, walk through the Troubleshooting checklist.
./scripts/teleop.shsudo -i
cd /home/ethrc/Desktop/yams-robot-server
./scripts/record.shCommand to record episodes:
NUM_EPISODES=50 EPISODE_TIME_S=50 PUSH_TO_HUB=true bash scripts/record.sh --log
This repo depends on third_party/i2rt, which is a submodule pointing at the private fork ETHRoboticsClub/i2rt. Ping an ETHRC admin to add your GitHub account to the org / grant read access before cloning. uv sync will fail without it.
git clone <this-repo-url>
cd yams-robot-server
git submodule update --init --recursiveIf you hit upload-pack: not our ref <sha>, the pinned submodule commit apteisn't reachable on the fork (force-pushed or never pushed). Fall back to the branch tip:
git -C third_party/i2rt fetch --all
git submodule update --init --remote third_party/i2rt
git -C third_party/i2rt checkout ethrc-forkDo not git add third_party/i2rt after this — it would bump the submodule pin for everyone.
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/envuv syncUse uv run ... for all Python entry points.
Only needed if teleop or recording isn't working. Run through these on the robot machine:
- Turn on both power strips. Follower fans should start making noise.
- List followers (CAN) with
ip link show. Make sure both are connected.- If needed, reset CAN busses:
sudo sh third_party/i2rt/scripts/reset_all_can.sh.
- If needed, reset CAN busses:
- Set up leader USBs:
sudo .venv/bin/python scripts/setup_leader_ports.py. - Precisely place the leader arms in the zero position for calibration.
- Calibrate leader arms with
uv run python scripts/compute_offsets.py. - Follower zeros are stored on the DM motors, not in the leader offset YAMLs. If a follower joint jumps when teleop starts, place that follower joint in mechanical zero and reset that motor zero.
- Example right joint 3:
uv run python third_party/i2rt/i2rt/motor_config_tool/set_zero.py --channel <right_arm.can_port> --motor_id 3.
- Example right joint 3:
- Identify the correct camera ids by running
uv run lerobot-find-cameras. Make sure mapping is correct inconfigs/arms.yamlin theindex_or_pathfield. You can find their images inoutputs/captured_images/. - Make sure the output images of the wrist cameras look properly exposed. If needed, tweak the fixed baseline in
scripts/set_camera_profile.shor the runtime auto-exposure knobs inconfigs/arms.yaml. - Type
realsense-viewer, load the config fromconfigs/realsense.json, and make sure it looks good. If it looks bad, overwriteconfigs/realsense.jsonwith better settings. - DO THIS FOR WRIST CAMERAS, NOT ZED CAMERA:
./scripts/set_camera_profile.sh /dev/video<ID> - Run
uv run lerobot-find-camerasagain, check outputs to make sure they look normal. - Make sure the cameras are focused.
- Wrist cameras can also self-adjust manual exposure at runtime with the
auto_exposure_*fields under eachopencv-cachedcamera inconfigs/arms.yaml.