使用 SO-100 机械臂与 LeRobot
目录
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 环境
conda create -y -n lerobot python=3.10
然后激活你的 conda 环境(每次打开 shell 使用 lerobot 时都要这样做!):
conda activate lerobot
4. 克隆 LeRobot
git clone https://github.com/huggingface/lerobot.git ~/lerobot
5. 在环境中安装 ffmpeg
使用 miniconda
时,在环境中安装 ffmpeg
:
conda install ffmpeg -c conda-forge
6. 安装 LeRobot 及 feetech 电机依赖
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. 运行脚本查找端口
要找到每个总线伺服适配器的端口,运行实用脚本:
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 端口的访问权限:
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
2. 组装底座
让我们从组装跟随臂底座开始
a. 为所有 12 个电机设置 ID
插入你的第一个电机 F1 并运行此脚本将其 ID 设置为 1。它还会将其当前位置设置为 2048,所以预期你的电机会旋转。将 --port 后的文本替换为相应的跟随控制板端口,并在 cmd 中运行此命令:
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。
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:插入电线
将两根电线插入第一个电机。
步骤 3:安装到底座
将第一个电机放入底座。
步骤 4:固定电机
- 用 4 个螺丝固定电机。底部两个,顶部两个。
步骤 5:安装电机支架
滑过第一个电机支架并用两个螺丝固定(每边一个)。
步骤 6:安装电机角
安装两个电机角,用螺丝固定顶部的角。尽量不要在安装电机角时移动电机位置,特别是对于我们移除了齿轮的领导臂。
步骤 7:安装肩部零件
将一根电线引导到机器人背面,另一根引导到左侧或照片中朝向你的方向(见照片)。
安装肩部零件。
步骤 8:固定肩部
- 用顶部 4 个螺丝和底部 4 个螺丝拧紧肩部零件 (通过转动肩部来接触底部孔)。
第二个电机组装
步骤 9:安装电机 2
从顶部滑入第二个电机,并将电机 1 的电线连接到电机 2。
步骤 10:安装肩部支架
添加肩部电机支架。
确保从电机 1 到电机 2 的电线在支架后面,而另一根电线向上引导(见照片)。
这个零件可能很紧,你可以使用工作台如图像或类似设置来推动零件围绕电机。
步骤 11:固定电机 2
- 用 4 个螺丝固定第二个电机。
步骤 12:安装电机角
- 将两个电机角安装到电机 2,再次使用角螺丝。
步骤 13:安装底座
使用 2 个螺丝安装底座附件。
步骤 14:安装上臂
用每边 4 个螺丝安装上臂。
第三个电机组装
步骤 15:安装电机 3
- 将电机 2 的电机电缆通过电缆支架引导到电机 3,然后用 4 个螺丝固定电机 3。
步骤 16:安装电机角
将两个电机角安装到电机 3,再次用角螺丝固定一个。
步骤 17:安装前臂
用每边 4 个螺丝将前臂连接到电机 3。
第四个电机组装
步骤 18:安装电机 4
滑入电机 4,连接来自电机 3 的电缆,并用螺丝将电缆固定在其支架中。
步骤 19:安装电机支架 4
安装第四个电机支架(紧配合)。确保一根电线向上引导,来自电机 3 的电线向下引导(见照片)。
步骤 20:固定电机 4 并安装角
用 4 个螺丝固定电机 4 并安装其电机角,为一个使用角螺丝。
手腕组装
步骤 21:安装电机 5
将电机 5 插入手腕支架并用 2 个前螺丝固定。
步骤 22:安装手腕
将来自电机 4 的电线连接到电机 5。并已经为夹爪插入另一根电线。
用两边各 4 个螺丝将手腕固定到电机 4。
步骤 23:安装手腕角
在手腕电机上只安装一个电机角并用角螺丝固定。
跟随臂配置
步骤 24:安装夹爪
将夹爪安装到电机 5。
步骤 25:安装夹爪电机
插入夹爪电机,将电机 5 的电机电线连接到电机 6,并用每边 3 个螺丝固定。
步骤 26:安装夹爪角和爪
安装电机角并再次使用角螺丝。
安装夹爪爪并用两边各 4 个螺丝固定。
步骤 27:安装控制器
将电机控制器安装在背面。
组装完成 – 继续进行领导臂组装。
领导臂配置
对于领导臂配置,执行步骤 1–23。确保你已经从电机中移除了电机齿轮。
步骤 24:安装领导支架
将领导支架安装到手腕上并用螺丝固定。
步骤 25:安装手柄
用 4 个螺丝将手柄安装到电机 5。
步骤 26:安装夹爪电机
插入夹爪电机,用每边 3 个螺丝固定,用角螺丝安装电机角,并连接电机电线。
步骤 27:安装触发器
用 4 个螺丝安装跟随触发器。
步骤 28:安装控制器
将电机控制器安装在背面。
组装完成 – 继续进行校准。
E. 校准
接下来,你需要校准你的 SO-100 机器人,以确保领导臂和跟随臂在相同物理位置时具有相同的位置值。 校准过程非常重要,因为它允许在一个 SO-100 机器人上训练的神经网络在另一个机器人上工作。
跟随臂手动校准
你需要按顺序将跟随臂移动到这些位置,注意旋转位置在机器人的右侧,你必须完全打开夹爪。
1. 中间位置 | 2. 零位置 | 3. 旋转位置 | 4. 休息位置 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
确保两个机械臂都已连接,运行此脚本启动手动校准:
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_follower"]'
领导臂手动校准
你还需要按顺序将领导臂移动到这些位置:
1. 中间位置 | 2. 零位置 | 3. 旋转位置 | 4. 休息位置 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
运行此脚本启动手动校准:
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_leader"]'
F. 遥操作
简单遥操作 然后你就可以遥操作你的机器人了!运行这个简单的脚本(它不会连接和显示摄像头):
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--robot.cameras='{}' \
--control.type=teleoperate
a. 带摄像头显示的遥操作
按照此指南设置你的摄像头。然后你将能够在遥操作时在计算机上显示摄像头,运行以下代码。这对于在记录第一个数据集之前准备设置很有用。
注意: 要可视化数据,启用
--control.display_data=true
。这使用rerun
流式传输数据。
python lerobot/scripts/control_robot.py \
--robot.type=so100 \
--control.type=teleoperate
G. 记录数据集
一旦你熟悉了遥操作,就可以用 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 \
--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 来在线可视化你的数据集:
echo ${HF_USER}/so100_test
如果你没有使用 --control.push_to_hub=false
上传,你也可以本地可视化(可以在浏览器 http://127.0.0.1:9090
中打开一个窗口使用可视化工具):
python lerobot/scripts/visualize_dataset_html.py \
--repo-id ${HF_USER}/so100_test \
--local-files-only 1
I. 重放片段
现在尝试在你的机器人上重放第一个片段:
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
脚本。需要一些参数。这里是一个示例命令:
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
让我们解释一下:
- 我们用
--dataset.repo_id=${HF_USER}/so100_test
提供了数据集作为参数。 - 我们用
policy.type=act
提供了策略。这从配置文件加载配置。重要的是,这个策略会自动适应你机器人的电机状态数量、电机动作数量和摄像头数量,这些都保存在你的数据集中。 - 我们提供了
policy.device=cuda
,因为我们在 Nvidia GPU 上训练,但你可以使用policy.device=mps
在 Apple silicon 上训练。 - 我们提供了
wandb.enable=true
来使用 Weights and Biases 可视化训练图表。这是可选的,但如果你使用它,确保通过运行wandb login
登录。
训练应该需要几个小时。你会在 outputs/train/act_so100_test/checkpoints
中找到检查点。
要从检查点恢复训练,下面是从 act_so100_test
策略的 last
检查点恢复的示例命令:
python lerobot/scripts/train.py \
--config_path=outputs/train/act_so100_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true
K. 评估策略
你可以使用控制脚本的 record
功能,但以策略检查点作为输入。例如,运行此命令记录 10 个评估片段:
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
如你所见,这几乎与之前用于记录训练数据集的命令相同。有两个变化:
- 有一个额外的
--control.policy.path
参数,指示策略检查点的路径。如果你将模型检查点上传到 hub,你也可以使用模型仓库。 - 数据集名称以
eval
开头,反映你正在运行推理。