Lerobot SO101 robot arm

🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning

安装环境

以下是 Jetson Nano Orin 的安装:

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/huggingface/lerobot.git
cd lerobot

# in Jetson
sudo install ffmpeg

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install pymunk

pip install ".[feetech]"

以下是windows 安装:

1
2
3
4
conda create -y -n lerobot python=3.10
conda activate lerobot
conda install ffmpeg=7.1.1 -c conda-forge
cd lerobot && pip install -e ".[feetech]"

注意,Windows torch cuda 版本安装参考,需要先安装 windows 版本的 cuda 12.8

1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

插拔检查端口

确认主臂(人实际操控的手臂)和从臂(自主运动带夹爪的臂)的端口:

1
2
3
4
5
6
# 拔掉一个 USB 口,程序会返回哪个端口断开了,此时就属于哪个机械臂
python lerobot/scripts/find_motors_bus_port.py

# 加权限
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1

注意,windows的端口是 COMx

更新 config

找到 SO101RobotConfig,替换为上述端口。

电机配置

(跳过),出厂已设置

校准

运行:

1
python lerobot/scripts/control_robot.py --robot.type=so101 --robot.cameras='{}' --control.type=calibrate --control.arms='["main_follower"]'

实际会同时校准从臂和主臂。一共四个位置,八次调试:

  • 中间姿态
  • 零姿态
  • 旋转姿态
  • 休息姿态

最终创建校准文件在 .cache 中。

遇到如下bug:

环境出现了问题,重新运行编译一次环境:

1
pip install ".[feetech]"

测试主臂操控从臂

无相机连接:

1
python lerobot/scripts/control_robot.py --robot.type=so101 --robot.cameras='{}' --control.type=teleoperate

设置相机

目前有三个相机,数据集采集先使用前两个:

  • WebCamera,在顶部
  • WebCamera,在侧边
  • 眼在手上,可以跟随夹爪运动

运行:

1
python lerobot/common/robot_devices/cameras/opencv.py --images-dir outputs/images_from_opencv_cameras

会返回有效的 /dev/video* 节点,并保存一些图片到入 outputs/images_from_opencv_cameras 文件夹。

1
2
3
4
[...]
Camera found at index 0
Camera found at index 2
[...]

通过相机控制

Jetson 下内存不足,打不开 rerun.io 窗口。

Windows 下:

1
python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=teleoperate --control.display_data=true

录取数据集

获取 Hugging Face token: https://huggingface.co/settings/tokens

1
2
3
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER

在网络不好的情况下,使用 HF mirror,参考:https://hf-mirror.com/

1
2
pip install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com

获取到 HF_USER 之后,就可以开始录制数据集了,每个动作录取 10 次,共 50 次。

1
2
# windows conda command terminal
python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=record --control.fps=30 --control.single_task="Grasp a charger and put it in the cup." --control.repo_id=${HF_USER}/so101_test --control.tags='[\"so101\",\"tutorial\"]' --control.warmup_time_s=5 --control.episode_time_s=30 --control.reset_time_s=12 --control.num_episodes=50 --control.display_data=true --control.push_to_hub=true

注:Jetson 中,将SO101 configs中的相机 camera_index 改为 0 and 2。如果运行时出现和上述校准时一样的configs无法覆写的问题,重新安装编译环境。

每次录制时,需要删除 cache 中的缓存,windows 在 C:/Users//.cache/huggingface/lerobot/{repo-id} 下。

Windows 下,会弹出 rerun.io 窗口,同时会有语音提示,按键操作如下:

  • 右箭头:结束这次录制或重置操作
  • 左箭头:撤销此次录制
  • ESC:结束所有录制并上传

录制画面:

本地数据集查看

注意管理员身份运行 conda powershell terminal:

1
2
3
4
5
6
7
8
python lerobot/scripts/visualize_dataset_html.py --repo-id ${HF_USER}/so101_test

WARNING:root:'torchcodec' is not available in your platform, falling back to 'pyav' as a default decoder
Resolving data files: 100%|████████████████████████████████████████████████████████████████████| 50/50 [00:00<?, ?it/s]
* Serving Flask app 'visualize_dataset_html'
* Debug mode: off
INFO 2025-05-21 22:26:42 _internal.py:97 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:9090

在线查看数据集

线上地址:https://huggingface.co/spaces/lerobot/visualize_dataset

输入 repo_id: ${HF_USER}/so101_test 查询。

重播 replay

重复录制的视频中的一集。会将动作重复一遍。

1
python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=replay --control.fps=30 --control.repo_id=${HF_USER}/so101_test --control.episode=0

训练

1
python lerobot/scripts/train.py --dataset.repo_id=${HF_USER}/so101_test --policy.type=act --output_dir=outputs/train/act_so101_test --job_name=act_so101_test --policy.device=cuda

训练完成后,模型在:lerobot/outputs/train/act_so101_test/checkpoints/last

推理

1
python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=record --control.fps=30 --control.single_task="Grasp a charger into the glass." --control.repo_id=${HF_USER}/eval_act_so101_test --control.tags='[\"tutorial\"]' --control.warmup_time_s=5 --control.episode_time_s=30 --control.reset_time_s=12 --control.num_episodes=50 --control.display_data=true --control.push_to_hub=true   --control.policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
  • 视频保存在:${HF_USER}/eval_act_so101_test
  • 推理路径:--control.policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model

第三方视角:

眼上视角:

失败视角: