- LeRobot project from https://github.com/huggingface/lerobot/
On Docker host (Jetson native), first launch rerun.io (check the original instruction on lerobot repo)
pip install rerun-sdk
rerun
Then, start the docker container to run the visualization script.
jetson-containers run --shm-size=4g -w /opt/lerobot $(autotag lerobot) \
python3 lerobot/scripts/visualize_dataset.py \
--repo-id lerobot/pusht \
--episode-index 0
See the original instruction on lerobot repo.
jetson-containers run --shm-size=4g -w /opt/lerobot $(autotag lerobot) \
python3 lerobot/scripts/eval.py \
-p lerobot/diffusion_pusht \
eval.n_episodes=10 \
eval.batch_size=10
See the original instruction on lerobot repo.
jetson-containers run --shm-size=4g -w /opt/lerobot $(autotag lerobot) \
python3 lerobot/scripts/train.py \
policy=act \
env=aloha \
env.task=AlohaInsertion-v0 \
dataset_repo_id=lerobot/aloha_sim_insertion_human
On Jetson host side, we set an udev rule so that arms always get assigned the same device name as following.
/dev/ttyACM_kochleader
: Leader arm/dev/ttyACM_kochfollower
: Follower arm
First only connect the leader arm to Jetson and record the serial ID by running the following:
ll /dev/serial/by-id/
The output should look like this.
lrwxrwxrwx 1 root root 13 Sep 24 13:07 usb-ROBOTIS_OpenRB-150_BA98C8C350304A46462E3120FF121B06-if00 -> ../../ttyACM1
Then edit the first line of ./99-usb-serial.rules
like the following.
SUBSYSTEM=="tty", ATTRS{idVendor}=="2f5d", ATTRS{idProduct}=="2202", ATTRS{serial}=="BA98C8C350304A46462E3120FF121B06", SYMLINK+="ttyACM_kochleader"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2f5d", ATTRS{idProduct}=="2202", ATTRS{serial}=="00000000000000000000000000000000", SYMLINK+="ttyACM_kochfollower"
Now disconnect the leader arm, and then only connect the follower arm to Jetson.
Repeat the same steps to record the serial to edit the second line of 99-usb-serial.rules
file.
$ ll /dev/serial/by-id/
lrwxrwxrwx 1 root root 13 Sep 24 13:07 usb-ROBOTIS_OpenRB-150_483F88DC50304A46462E3120FF0C081A-if00 -> ../../ttyACM0
$ vi ./data/lerobot/99-usb-serial.rules
You should have ./99-usb-serial.rules
now looking like this:
SUBSYSTEM=="tty", ATTRS{idVendor}=="2f5d", ATTRS{idProduct}=="2202", ATTRS{serial}=="BA98C8C350304A46462E3120FF121B06", SYMLINK+="ttyACM_kochleader"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2f5d", ATTRS{idProduct}=="2202", ATTRS{serial}=="483F88DC50304A46462E3120FF0C081A", SYMLINK+="ttyACM_kochfollower"
Finally copy this under /etc/udev/rules.d/
(of host), and restart Jetson.
sudo cp ./99-usb-serial.rules /etc/udev/rules.d/
sudo reboot
After reboot, check if we now have achieved the desired fixed simlinks names for the arms.
ls -l /dev/ttyACM*
You should get something like this:
crw-rw---- 1 root dialout 166, 0 Sep 24 17:20 /dev/ttyACM0
crw-rw---- 1 root dialout 166, 1 Sep 24 16:13 /dev/ttyACM1
lrwxrwxrwx 1 root root 7 Sep 24 17:20 /dev/ttyACM_kochfollower -> ttyACM0
lrwxrwxrwx 1 root root 7 Sep 24 16:13 /dev/ttyACM_kochleader -> ttyACM1
cd jetson-containers
./packages/robots/lerobot/clone_lerobot_dir_under_data.sh
./packages/robots/lerobot/copy_overlay_files_in_data_lerobot.sh
./run.sh \
--csi2webcam --csi-capture-res='1640x1232@30' --csi-output-res='640x480@30' \
-v ${PWD}/data/lerobot/:/opt/lerobot/ \
$(./autotag lerobot)
You will now use your local PC to access the Jupyter Lab server running on Jetson on the same network.
Once the contianer starts, you should see lines like this printed.
JupyterLab URL: http://10.110.51.21:8888 (password "nvidia")
JupyterLab logs: /data/logs/jupyter.log
Copy and paste the address on your web browser and access the Jupyter Lab server.
Navigate to ./notebooks/
and open the first notebook.
Now follow the Jupyter notebook contents.