如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂
如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务
SO-100ARM 是由 TheRobotStudio 发起的完全开源的机器手臂项目。它包括了从动手臂和主动机器手臂,还提供了详细的3D打印文件和操作指南。Lerobot 致力于提供样例、数据集和工具,以实现基于PyTorch的调教和强化学习。该 框架目标是降低机器人的入门门槛,使人们可以进行数据分享和预训练模型。
从零搭建Lerobot机械臂:结果展示
规格参数
本教程硬件由矽递科技Seeed Studio提供
材料清单(BOM)
3D打印部件和桌面夹具未包含在产品中。然而,我们提供了详细的3D打印STL文件。
3D打印指南
各种3D打印机均可用于打印从动和主动手臂所需的部件。按照以下步骤确保良好的打印质量:
-
选择打印机: 提供的STL文件可直接在多种FDM打印机上打印。以下为测试和建议设置,其他设置也可能有效:
- 材料: PLA
- 喷嘴直径和精度: 0.4mm喷嘴直径,层高0.2mm;或0.6mm喷嘴直径,层高0.4mm。
- 填充密度: 13%
-
获取3D打印文件: 从动和主动手臂的所有部件均包含在单个文件中,并以Z轴向上正确定向,最小化支撑需求。
对于打印床尺寸为220mm x 220mm(如Ender)的打印机,打印:
- Print_Follower_SO_ARM100_08_Ender.STL
- Print_Leader_SO_ARM100_08_Ender.STL
对于打印床尺寸为205mm x 250mm(如Prusa/Up)的打印机,打印:
- Print_Follower_SO_ARM100_08_UP_Prusa.STL
- Print_Leader_SO_ARM100_08_UP_Prusa.STL
为方便下载,我们已将所有文件打包至Makerworld平台,包括桌面夹具的文件。
安装Lerobot
在你的reComputer Nvidia Jetson上:
-
安装Miniconda:
mkdir -p ~/miniconda3cd ~/miniconda3wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.shchmod +x Miniconda3-latest-Linux-aarch64.sh./Miniconda3-latest-Linux-aarch64.sh
-
重新启动Shell或执行
source ~/.bashrc
-
创建并激活一个新的conda环境:
conda create -y -n lerobot python=3.10 && conda activate lerobot
-
克隆Lerobot仓库:
git clone https://github.com/huggingface/lerobot.git ~/lerobot
-
安装Lerobot及依赖:
cd ~/lerobot && pip install -e \".[feetech]\"
Linux用户需额外安装录制数据集的依赖项:
conda install -y -c conda-forge ffmpegpip uninstall -y opencv-pythonconda install -y -c conda-forge \"opencv>=4.10.0\"
校准舵机并组装机械臂
官方提供了Youtube组装视频 ,我们也粗略的记录了我们的舵机校准和机械臂安装过程。
从零搭建具身智能机械臂1:组装和调试
要查找每个机械臂的正确端口,请运行实用脚本两次:
python lerobot/scripts/find_motors_bus_port.py
识别领导臂端口时的示例输出(例如,在 Mac 上为 /dev/tty.usbmodem575E0031751
,或在 Linux 上可能为 /dev/ttyACM0
):
识别跟随臂端口时的示例输出(例如,在 Mac 上为 /dev/tty.usbmodem575E0032081
,或在 Linux 上可能为 /dev/ttyACM1
):
故障排除:在 Linux 上,你可能需要通过运行以下命令来赋予 USB 端口访问权限:
sudo chmod 666 /dev/ttyACM0sudo chmod 666 /dev/ttyACM1
插入你的第一个电机并运行此脚本将其 ID 设置为 1。它还会将当前位置设置为 2048,因此预期你的电机会旋转:
python lerobot/scripts/configure_motor.py \\ --port /dev/ttyACM0 \\ --brand feetech \\ --model sts3215 \\ --baudrate 1000000 \\ --ID 1
注意:这些电机目前有一定的限制。它们只能接受 0 到 4096 之间的值,对应于一整圈。它们不能旋转超过这个范围。2048 是这个范围的中间值,所以我们可以向逆时针方向移动 -2048 步(180 度)达到最大范围,或向顺时针方向移动 +2048 步(180 度)达到最大范围。配置步骤还将归位偏移设置为 0,因此如果你组装机械臂时有误,可以始终更新归位偏移以补偿最多 ±2048 步(±180 度)的偏移。
然后拔下你的电机,插入第二个电机并将其 ID 设置为 2。
python lerobot/scripts/configure_motor.py \\ --port /dev/ttyACM0 \\ --brand feetech \\ --model sts3215 \\ --baudrate 1000000 \\ --ID 2
对所有电机重复此过程,直到 ID 为 6。领导臂的 6 个电机也同样操作。现在你可以开始组装你的机械臂了。
校准
接下来,你需要校准你的 SO-100 机器人,以确保领导臂和跟随臂在相同物理位置时具有相同的位置值。此校准至关重要,因为它允许在一个 SO-100 机器人上训练的神经网络在另一个机器人上运行。
从零搭建Lerobot机械臂2:机械臂校准
机械臂的校准应严格按照 Lerobot 官方教程中的
“Calibrate”
步骤进行。
首先,您需要确保 \\lerobot\\lerobot\\configs\\robot\\so100.yaml
文件中机器人手臂的串口号与您的设备一致,如下图所示。您可以根据 ls /dev/ttyACM*
查看所有串口名称。
确保两个机械臂都已连接,然后运行以下脚本启动手动校准:
python lerobot/scripts/control_robot.py calibrate \\ --robot-path lerobot/configs/robot/so100.yaml \\ --robot-overrides \'~cameras\' --arms main_follower
遥操作
从零搭建Lerobot机械臂3:双机械臂示教
然后,您已准备好遥操作您的机器人!运行以下简单脚本(它不会连接并显示摄像头):
python lerobot/scripts/control_robot.py teleoperate \\ --robot-path lerobot/configs/robot/so100.yaml \\ --robot-overrides \'~cameras\' \\ --display-cameras 0
显示摄像头的遥操作
从零搭建Lerobot机械臂4:添加USB摄像头
在插入您的两个 USB 摄像头后,运行以下脚本以检查摄像头的端口号。
python lerobot/common/robot_devices/cameras/opencv.py \\ --images-dir outputs/images_from_opencv_cameras
终端将打印出以下信息。
Mac or Windows detected. Finding available camera indices through scanning all indices from 0 to 60[...]Camera found at index 2Camera found at index 4[...]Connecting camerasOpenCVCamera(2, fps=30.0, width=640, height=480, color_mode=rgb)OpenCVCamera(4, fps=30.0, width=640, height=480, color_mode=rgb)Saving images to outputs/images_from_opencv_camerasFrame: 0000Latency (ms): 39.52[...]Frame: 0046Latency (ms): 40.07Images have been saved to outputs/images_from_opencv_cameras
您可以在 outputs/images_from_opencv_cameras
目录中找到每个摄像头拍摄的图片,并确认不同位置摄像头对应的端口索引信息。然后,完成 \\lerobot\\lerobot\\configs\\robot\\so100.yaml
文件中摄像头参数的对齐。
然后,您将能够在遥操作时在计算机上显示摄像头,方法是运行以下代码。这对于在记录第一个数据集之前准备您的设置非常有用。
python lerobot/scripts/control_robot.py teleoperate \\ --robot-path lerobot/configs/robot/so100.yaml
数据集制作采集
从零搭建Lerobot机械臂5:采集自定义数据集
一旦您熟悉了遥操作,您就可以使用 SO-100 记录您的第一个数据集。
如果您想使用 Hugging Face Hub 的功能来上传您的数据集,并且您之前尚未这样做,请确保您已使用具有写入权限的令牌登录,该令牌可以从 Hugging Face 设置 中生成:
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
将您的 Hugging Face 仓库名称存储在一个变量中,以运行以下命令:
HF_USER=$(huggingface-cli whoami | head -n 1)echo $HF_USER
记录 2 个回合并将您的数据集上传到 Hub:
python lerobot/scripts/control_robot.py record \\ --robot-path lerobot/configs/robot/so100.yaml \\ --fps 30 \\ --repo-id ${HF_USER}/so100_test \\ --tags so100 tutorial \\ --warmup-time-s 5 \\ --episode-time-s 40 \\ --reset-time-s 10 \\ --num-episodes 2 \\ --push-to-hub 1 \\ --single-task seeedstudio
参数说明- warmup-time-s: 指初始化时间。- episode-time-s: 表示每次收集数据的时间。- reset-time-s: 是每次数据收集之间的准备时间。- num-episodes: 表示预期收集多少组数据。- push-to-hub: 决定是否将数据上传到 HuggingFace Hub。
记录数据集
一旦您熟悉了遥操作,您就可以使用 SO-100 记录您的第一个数据集。
如果您想使用 Hugging Face Hub 的功能来上传您的数据集,并且您之前尚未这样做,请确保您已使用具有写入权限的令牌登录,该令牌可以从 Hugging Face 设置 中生成:
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
将您的 Hugging Face 仓库名称存储在一个变量中,以运行以下命令:
HF_USER=$(huggingface-cli whoami | head -n 1)echo $HF_USER
记录 2 个回合并将您的数据集上传到 Hub:
python lerobot/scripts/control_robot.py record \\ --robot-path lerobot/configs/robot/so100.yaml \\ --fps 30 \\ --repo-id ${HF_USER}/so100_test \\ --tags so100 tutorial \\ --warmup-time-s 5 \\ --episode-time-s 40 \\ --reset-time-s 10 \\ --num-episodes 2 \\ --push-to-hub 1 \\ --single-task seeedstudio
参数说明- warmup-time-s: 指初始化时间。- episode-time-s: 表示每次收集数据的时间。- reset-time-s: 是每次数据收集之间的准备时间。- num-episodes: 表示预期收集多少组数据。- push-to-hub: 决定是否将数据上传到 HuggingFace Hub。
可视化数据集
如果您使用 --push-to-hub 1
将数据集上传到 Hub,您可以通过复制粘贴您的仓库 ID 来 在线可视化您的数据集:
echo ${HF_USER}/so100_test
如果您没有使用 --push-to-hub 0
上传,您也可以使用以下命令在本地进行可视化:
python lerobot/scripts/visualize_dataset_html.py \\ --repo-id ${HF_USER}/so100_test
重播一个回合
现在尝试在您的机器人上重播第一个回合:
python lerobot/scripts/control_robot.py replay \\ --robot-path lerobot/configs/robot/so100.yaml \\ --fps 30 \\ --repo-id ${HF_USER}/so100_test \\ --episode 0
训练
从零搭建Lerobot机械臂6:训练及部署
要训练一个控制您机器人策略,使用 python lerobot/scripts/train.py
脚本。需要一些参数。以下是一个示例命令:
python lerobot/scripts/train.py \\ dataset_repo_id=${HF_USER}/so100_test \\ policy=act_so100_real \\ env=so100_real \\ hydra.run.dir=outputs/train/act_so100_test \\ hydra.job.name=act_so100_test \\ device=cuda \\ wandb.enable=false
让我们解释一下:
- 我们使用
dataset_repo_id=${HF_USER}/so100_test
提供了数据集作为参数。 - 我们使用
policy=act_so100_real
提供了策略。这将从lerobot/configs/policy/act_so100_real.yaml
加载配置。重要的是,这个策略使用两个摄像头作为输入laptop
,phone
。 - 我们使用
env=so100_real
提供了环境作为参数。这将从lerobot/configs/env/so100_real.yaml
加载配置。 - 我们提供了
device=cuda
,因为我们在 Nvidia GPU 上训练,但如果您使用的是带有 Apple Silicon 的 Mac,可以使用device=mps
,否则使用device=cpu
。 - 我们提供了
wandb.enable=false
来禁用 Weights and Biases 用于可视化训练图表。这是可选的,但如果您使用它,请确保通过运行wandb login
登录。
训练应该需要几个小时。您将在 outputs/train/act_so100_test/checkpoints
中找到检查点。
评估
您可以使用 lerobot/scripts/control_robot.py
中的 record
功能,但需要将策略检查点作为输入。例如,运行以下命令记录 10 个评估回合:
python lerobot/scripts/control_robot.py record \\ --robot-path lerobot/configs/robot/so100.yaml \\ --fps 30 \\ --repo-id ${HF_USER}/eval_act_so100_test \\ --tags so100 tutorial eval \\ --warmup-time-s 5 \\ --episode-time-s 40 \\ --reset-time-s 10 \\ --num-episodes 10 \\ -p outputs/train/act_so100_test/checkpoints/last/pretrained_model
如您所见,这几乎与之前用于记录训练数据集的命令相同。只有两处变化:
- 增加了
-p
参数,指示您的策略检查点的路径(例如-p outputs/train/eval_so100_test/checkpoints/last/pretrained_model
)。如果您将模型检查点上传到 Hub,也可以使用模型仓库(例如-p ${HF_USER}/act_so100_test
)。 - 数据集的名称以
eval
开头,以反映您正在运行推理(例如--repo-id ${HF_USER}/eval_act_so100_test
)。
参考文档
矽递科技Wiki文档:How to use the SO100Arm robotic arm in Lerobot
TheRobotStudio Project: SO-ARM100
Huggingface Project: Lerobot
Dnsty: Jetson Containers
Jetson AI Lab
Diffusion Policy
ACT or ALOHA
TDMPC
VQ-BeT