> 技术文档 > 如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂

如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂


如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务

SO-100ARM 是由 TheRobotStudio 发起的完全开源的机器手臂项目。它包括了从动手臂和主动机器手臂,还提供了详细的3D打印文件和操作指南。Lerobot 致力于提供样例、数据集和工具,以实现基于PyTorch的调教和强化学习。该 框架目标是降低机器人的入门门槛,使人们可以进行数据分享和预训练模型。

从零搭建Lerobot机械臂:结果展示

规格参数

本教程硬件由矽递科技Seeed Studio提供

规格 标准版 专业版 自由度 6 6 最大扭矩 19.5kg.cm @7.4V 30kg.cm @12V 伺服电机 STS3215总线伺服 STS3215总线伺服 电源 5.5mm*2.1mm DC 5V4A 5.5mm*2.1mm DC 12V1A 角度传感器 12位磁性编码器 12位磁性编码器 推荐工作温度范围 0℃~40℃ 0℃~40℃ 通信方式 UART UART 控制方式 电脑 电脑

材料清单(BOM)

部件 数量 是否包含 STS3215伺服电机 12 ✅ 电机控制板 2 ✅ USB-C线缆(2条) 1 ✅ 电源适配器 2 ✅ 桌面夹具 1 ❌ 手臂的3D打印部件 1 ❌

3D打印部件和桌面夹具未包含在产品中。然而,我们提供了详细的3D打印STL文件。

3D打印指南

各种3D打印机均可用于打印从动和主动手臂所需的部件。按照以下步骤确保良好的打印质量:

  1. 选择打印机: 提供的STL文件可直接在多种FDM打印机上打印。以下为测试和建议设置,其他设置也可能有效:

    • 材料: PLA
    • 喷嘴直径和精度: 0.4mm喷嘴直径,层高0.2mm;或0.6mm喷嘴直径,层高0.4mm。
    • 填充密度: 13%
  2. 获取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上:

  1. 安装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
  2. 重新启动Shell或执行 source ~/.bashrc

  3. 创建并激活一个新的conda环境:

    conda create -y -n lerobot python=3.10 && conda activate lerobot
  4. 克隆Lerobot仓库:

    git clone https://github.com/huggingface/lerobot.git ~/lerobot
  5. 安装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* 查看所有串口名称。

如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂

确保两个机械臂都已连接,然后运行以下脚本启动手动校准:

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 文件中摄像头参数的对齐。

如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂

然后,您将能够在遥操作时在计算机上显示摄像头,方法是运行以下代码。这对于在记录第一个数据集之前准备您的设置非常有用。

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

如何从0搭建具身智能Lerobot SO-ARM100机械臂并完成自定义抓取任务_so100机械臂

重播一个回合

现在尝试在您的机器人上重播第一个回合:

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

让我们解释一下:

  1. 我们使用 dataset_repo_id=${HF_USER}/so100_test 提供了数据集作为参数。
  2. 我们使用 policy=act_so100_real 提供了策略。这将从 lerobot/configs/policy/act_so100_real.yaml 加载配置。重要的是,这个策略使用两个摄像头作为输入 laptopphone
  3. 我们使用 env=so100_real 提供了环境作为参数。这将从 lerobot/configs/env/so100_real.yaml 加载配置。
  4. 我们提供了 device=cuda,因为我们在 Nvidia GPU 上训练,但如果您使用的是带有 Apple Silicon 的 Mac,可以使用 device=mps,否则使用 device=cpu
  5. 我们提供了 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

如您所见,这几乎与之前用于记录训练数据集的命令相同。只有两处变化:

  1. 增加了 -p 参数,指示您的策略检查点的路径(例如 -p outputs/train/eval_so100_test/checkpoints/last/pretrained_model)。如果您将模型检查点上传到 Hub,也可以使用模型仓库(例如 -p ${HF_USER}/act_so100_test)。
  2. 数据集的名称以 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