Skip to content

使用 SO-100 机械臂与 LeRobot

SO-100机械臂

目录

A. 采购零件

请参考这个 README。它包含了物料清单、零件采购链接,以及 3D 打印零件的说明,如果这是你第一次打印或者你没有 3D 打印机,还提供了相关建议。

在组装之前,你首先需要配置电机。为此,我们提供了一个便捷的脚本,所以让我们先安装 LeRobot。配置完成后,我们还会指导你完成组装。

B. 安装 LeRobot

TIP

我们经常使用命令提示符(cmd)。如果你不熟悉 cmd 或想复习命令行的使用,可以查看这里:命令行速成课程

在你的计算机上:

1. 安装 Miniconda

2. 重启 Shell

在你的 shell 中复制粘贴:source ~/.bashrc 或者对于 Mac:source ~/.bash_profile 或者如果你使用 zshell:source ~/.zshrc

3. 为 lerobot 创建并激活新的 conda 环境

bash
conda create -y -n lerobot python=3.10

然后激活你的 conda 环境(每次打开 shell 使用 lerobot 时都要这样做!):

bash
conda activate lerobot

4. 克隆 LeRobot

bash
git clone https://github.com/huggingface/lerobot.git ~/lerobot

5. 在环境中安装 ffmpeg

使用 miniconda 时,在环境中安装 ffmpeg

bash
conda install ffmpeg -c conda-forge

6. 安装 LeRobot 及 feetech 电机依赖

bash
cd ~/lerobot && pip install -e ".[feetech]"

太棒了 🤗!你现在已经完成了 LeRobot 的安装,我们可以开始组装 SO100 机械臂了 🤖。 每次你想使用 LeRobot 时,可以进入我们安装 LeRobot 的 ~/lerobot 文件夹并运行其中的命令。

C. 配置电机

NOTE

在整个教程中,你会找到如何执行步骤的视频,完整的视频教程可以在这里找到:组装视频

1. 找到与每个机械臂关联的 USB 端口

为你的领导臂指定一个总线伺服适配器和 6 个电机,同样为跟随臂指定另一个总线伺服适配器和 6 个电机。建议给它们贴标签,在每个电机上写明它是用于跟随臂 F 还是领导臂 L,以及它的 ID 从 1 到 6(F1...F6 和 L1...L6)。

a. 运行脚本查找端口

要找到每个总线伺服适配器的端口,运行实用脚本:

bash
python lerobot/scripts/find_motors_bus_port.py

b. 示例输出

识别领导臂端口时的示例输出(例如,Mac 上的 /dev/tty.usbmodem575E0031751,或 Linux 上可能是 /dev/ttyACM0):

Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
Remove the usb cable from your MotorsBus and press Enter when done.

[...断开领导臂连接并按 Enter...]

The port of this MotorsBus is /dev/tty.usbmodem575E0031751
Reconnect the usb cable.

c. 故障排除

在 Linux 上,你可能需要通过运行以下命令来授予对 USB 端口的访问权限:

bash
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1

2. 组装底座

让我们从组装跟随臂底座开始

a. 为所有 12 个电机设置 ID

插入你的第一个电机 F1 并运行此脚本将其 ID 设置为 1。它还会将其当前位置设置为 2048,所以预期你的电机会旋转。将 --port 后的文本替换为相应的跟随控制板端口,并在 cmd 中运行此命令:

bash
python lerobot/scripts/configure_motor.py \
  --port /dev/tty.usbmodem58760432961 \
  --brand feetech \
  --model sts3215 \
  --baudrate 1000000 \
  --ID 1

NOTE

这些电机目前有限制。它们只能取 0 到 4096 之间的值,对应一个完整的转动。它们不能转动超过这个范围。2048 在这个范围的中间,所以我们可以向后 -2048 步(逆时针 180 度)达到最大范围,或者向前 +2048 步(顺时针 180 度)达到最大范围。配置步骤还将归位偏移设置为 0,这样如果你错误组装了机械臂,你总是可以更新归位偏移来补偿最多 ± 2048 步(± 180 度)的偏移。

然后拔掉你的电机,插入第二个电机并将其 ID 设置为 2。

bash
python lerobot/scripts/configure_motor.py \
  --port /dev/tty.usbmodem58760432961 \
  --brand feetech \
  --model sts3215 \
  --baudrate 1000000 \
  --ID 2

对所有电机重复此过程直到 ID 6。对领导臂的 6 个电机也做同样的操作。

b. 移除 6 个领导电机的齿轮

按照视频移除齿轮。你需要移除领导臂电机的齿轮。这样,你将只使用电机的位置编码并减少摩擦,以便更容易操作领导臂。

D. 分步组装说明

步骤 1:清洁零件

  • 从 3D 打印零件中移除所有支撑材料。

第一个电机

步骤 2:插入电线

  • 将两根电线插入第一个电机。

    步骤2

步骤 3:安装到底座

  • 将第一个电机放入底座。

    步骤3

步骤 4:固定电机

  • 用 4 个螺丝固定电机。底部两个,顶部两个。

步骤 5:安装电机支架

  • 滑过第一个电机支架并用两个螺丝固定(每边一个)。

    步骤5

步骤 6:安装电机角

  • 安装两个电机角,用螺丝固定顶部的角。尽量不要在安装电机角时移动电机位置,特别是对于我们移除了齿轮的领导臂。

    步骤6

步骤 7:安装肩部零件

  • 将一根电线引导到机器人背面,另一根引导到左侧或照片中朝向你的方向(见照片)。

  • 安装肩部零件。

    步骤7

步骤 8:固定肩部

  • 用顶部 4 个螺丝和底部 4 个螺丝拧紧肩部零件 (通过转动肩部来接触底部孔)。

第二个电机组装

步骤 9:安装电机 2

  • 从顶部滑入第二个电机,并将电机 1 的电线连接到电机 2。

    步骤9

步骤 10:安装肩部支架

  • 添加肩部电机支架。

  • 确保从电机 1 到电机 2 的电线在支架后面,而另一根电线向上引导(见照片)。

  • 这个零件可能很紧,你可以使用工作台如图像或类似设置来推动零件围绕电机。

    步骤10-1步骤10-2步骤10-3

步骤 11:固定电机 2

  • 用 4 个螺丝固定第二个电机。

步骤 12:安装电机角

  • 将两个电机角安装到电机 2,再次使用角螺丝。

步骤 13:安装底座

  • 使用 2 个螺丝安装底座附件。

    步骤13

步骤 14:安装上臂

  • 用每边 4 个螺丝安装上臂。

    步骤14


第三个电机组装

步骤 15:安装电机 3

  • 将电机 2 的电机电缆通过电缆支架引导到电机 3,然后用 4 个螺丝固定电机 3。

步骤 16:安装电机角

  • 将两个电机角安装到电机 3,再次用角螺丝固定一个。

    步骤16

步骤 17:安装前臂

  • 用每边 4 个螺丝将前臂连接到电机 3。

    步骤17


第四个电机组装

步骤 18:安装电机 4

  • 滑入电机 4,连接来自电机 3 的电缆,并用螺丝将电缆固定在其支架中。

    步骤18-1步骤18-2

步骤 19:安装电机支架 4

  • 安装第四个电机支架(紧配合)。确保一根电线向上引导,来自电机 3 的电线向下引导(见照片)。

    步骤19

步骤 20:固定电机 4 并安装角

  • 用 4 个螺丝固定电机 4 并安装其电机角,为一个使用角螺丝。

    步骤20


手腕组装

步骤 21:安装电机 5

  • 将电机 5 插入手腕支架并用 2 个前螺丝固定。

    步骤21

步骤 22:安装手腕

  • 将来自电机 4 的电线连接到电机 5。并已经为夹爪插入另一根电线。

  • 用两边各 4 个螺丝将手腕固定到电机 4。

    步骤22

步骤 23:安装手腕角

  • 在手腕电机上只安装一个电机角并用角螺丝固定。

    步骤23


跟随臂配置

步骤 24:安装夹爪

  • 将夹爪安装到电机 5。

    步骤24

步骤 25:安装夹爪电机

  • 插入夹爪电机,将电机 5 的电机电线连接到电机 6,并用每边 3 个螺丝固定。

    步骤25

步骤 26:安装夹爪角和爪

  • 安装电机角并再次使用角螺丝。

  • 安装夹爪爪并用两边各 4 个螺丝固定。

    步骤26

步骤 27:安装控制器

  • 将电机控制器安装在背面。

    步骤27-1步骤27-2

组装完成 – 继续进行领导臂组装。


领导臂配置

对于领导臂配置,执行步骤 1–23。确保你已经从电机中移除了电机齿轮。

步骤 24:安装领导支架

  • 将领导支架安装到手腕上并用螺丝固定。

    领导步骤24

步骤 25:安装手柄

  • 用 4 个螺丝将手柄安装到电机 5。

    领导步骤25

步骤 26:安装夹爪电机

  • 插入夹爪电机,用每边 3 个螺丝固定,用角螺丝安装电机角,并连接电机电线。

    领导步骤26

步骤 27:安装触发器

  • 用 4 个螺丝安装跟随触发器。

    领导步骤27

步骤 28:安装控制器

  • 将电机控制器安装在背面。

    领导步骤28-1领导步骤28-2

组装完成 – 继续进行校准。

E. 校准

接下来,你需要校准你的 SO-100 机器人,以确保领导臂和跟随臂在相同物理位置时具有相同的位置值。 校准过程非常重要,因为它允许在一个 SO-100 机器人上训练的神经网络在另一个机器人上工作。

跟随臂手动校准

你需要按顺序将跟随臂移动到这些位置,注意旋转位置在机器人的右侧,你必须完全打开夹爪。

1. 中间位置2. 零位置3. 旋转位置4. 休息位置
跟随臂中间位置跟随臂零位置跟随臂旋转位置跟随臂休息位置

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

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

领导臂手动校准

你还需要按顺序将领导臂移动到这些位置:

1. 中间位置2. 零位置3. 旋转位置4. 休息位置
领导臂中间位置领导臂零位置领导臂旋转位置领导臂休息位置

运行此脚本启动手动校准:

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --robot.cameras='{}' \
  --control.type=calibrate \
  --control.arms='["main_leader"]'

F. 遥操作

简单遥操作 然后你就可以遥操作你的机器人了!运行这个简单的脚本(它不会连接和显示摄像头):

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --robot.cameras='{}' \
  --control.type=teleoperate

a. 带摄像头显示的遥操作

按照此指南设置你的摄像头。然后你将能够在遥操作时在计算机上显示摄像头,运行以下代码。这对于在记录第一个数据集之前准备设置很有用。

注意: 要可视化数据,启用 --control.display_data=true。这使用 rerun 流式传输数据。

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=teleoperate

G. 记录数据集

一旦你熟悉了遥操作,就可以用 SO-100 记录你的第一个数据集。

如果你想使用 Hugging Face hub 功能上传数据集,并且之前没有这样做过,请确保你已经使用写访问令牌登录,可以从 Hugging Face 设置 生成:

bash
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential

将你的 Hugging Face 仓库名称存储在变量中以运行这些命令:

bash
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER

记录 2 个片段并将数据集上传到 hub:

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=record \
  --control.fps=30 \
  --control.single_task="Grasp a lego block and put it in the bin." \
  --control.repo_id=${HF_USER}/so100_test \
  --control.tags='["so100","tutorial"]' \
  --control.warmup_time_s=5 \
  --control.episode_time_s=30 \
  --control.reset_time_s=30 \
  --control.num_episodes=2 \
  --control.push_to_hub=true

注意:你可以通过添加 --control.resume=true 来恢复记录。

H. 可视化数据集

如果你使用 --control.push_to_hub=true 将数据集上传到 hub,你可以通过复制粘贴你的仓库 id 来在线可视化你的数据集

bash
echo ${HF_USER}/so100_test

如果你没有使用 --control.push_to_hub=false 上传,你也可以本地可视化(可以在浏览器 http://127.0.0.1:9090 中打开一个窗口使用可视化工具):

bash
python lerobot/scripts/visualize_dataset_html.py \
  --repo-id ${HF_USER}/so100_test \
  --local-files-only 1

I. 重放片段

现在尝试在你的机器人上重放第一个片段:

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=replay \
  --control.fps=30 \
  --control.repo_id=${HF_USER}/so100_test \
  --control.episode=0

J. 训练策略

要训练控制机器人的策略,使用 python lerobot/scripts/train.py 脚本。需要一些参数。这里是一个示例命令:

bash
python lerobot/scripts/train.py \
  --dataset.repo_id=${HF_USER}/so100_test \
  --policy.type=act \
  --output_dir=outputs/train/act_so100_test \
  --job_name=act_so100_test \
  --policy.device=cuda \
  --wandb.enable=true

让我们解释一下:

  1. 我们用 --dataset.repo_id=${HF_USER}/so100_test 提供了数据集作为参数。
  2. 我们用 policy.type=act 提供了策略。这从配置文件加载配置。重要的是,这个策略会自动适应你机器人的电机状态数量、电机动作数量和摄像头数量,这些都保存在你的数据集中。
  3. 我们提供了 policy.device=cuda,因为我们在 Nvidia GPU 上训练,但你可以使用 policy.device=mps 在 Apple silicon 上训练。
  4. 我们提供了 wandb.enable=true 来使用 Weights and Biases 可视化训练图表。这是可选的,但如果你使用它,确保通过运行 wandb login 登录。

训练应该需要几个小时。你会在 outputs/train/act_so100_test/checkpoints 中找到检查点。

要从检查点恢复训练,下面是从 act_so100_test 策略的 last 检查点恢复的示例命令:

bash
python lerobot/scripts/train.py \
  --config_path=outputs/train/act_so100_test/checkpoints/last/pretrained_model/train_config.json \
  --resume=true

K. 评估策略

你可以使用控制脚本的 record 功能,但以策略检查点作为输入。例如,运行此命令记录 10 个评估片段:

bash
python lerobot/scripts/control_robot.py \
  --robot.type=so100 \
  --control.type=record \
  --control.fps=30 \
  --control.single_task="Grasp a lego block and put it in the bin." \
  --control.repo_id=${HF_USER}/eval_act_so100_test \
  --control.tags='["tutorial"]' \
  --control.warmup_time_s=5 \
  --control.episode_time_s=30 \
  --control.reset_time_s=30 \
  --control.num_episodes=10 \
  --control.push_to_hub=true \
  --control.policy.path=outputs/train/act_so100_test/checkpoints/last/pretrained_model

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

  1. 有一个额外的 --control.policy.path 参数,指示策略检查点的路径。如果你将模型检查点上传到 hub,你也可以使用模型仓库。
  2. 数据集名称以 eval 开头,反映你正在运行推理。