LeRobot SO-100 六轴机械臂实战指南:从零部件采购、电机配置、整机装配到双臂标定全流程
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
本指南以 LeRobot 官方文档 src/lerobot/robots/so_follower/so100.md 为核心骨架,完整讲解在 LeRobot 生态中搭建 SO-100 遥操作双臂(leader/follower)的四个阶段:采购 3D 打印零件与 BOM、安装带 Feetech SDK 的 LeRobot 环境、为 6 个 STS3215 舵机配置 ID 与波特率、以及逐步骤机械装配与标定。读完本文你将具备从零组装出一套可被 LeRobot 控制、可用于模仿学习数据采集与策略训练的真实机器人双臂。
SO-100 是一款开源低成本的 6 自由度机械臂(肩部 3 自由度 + 腕部 2 自由度 + 夹爪 1 自由度),是 Hugging Face LeRobot 项目中最主流的入门硬件之一。本仓库中,SO-100 的"从臂(follower)"实现在 src/lerobot/robots/so_follower/so_follower.py,"主臂(leader)"实现在 src/lerobot/teleoperators/so_leader/so_leader.py。两只手臂通过同一套 Feetech STS3215 舵机总线协议驱动,组装与配置流程高度一致,本文会在对应小节同时给出双端命令。
一、采购零件与 3D 打印(Source the parts)
文档要求你参考 TheRobotStudio SO-ARM100 的官方指南来准备硬件,其中包含:
- 物料清单(BOM):包括 6 个 Feetech STS3215 舵机、控制器板、USB 线、电源、螺丝与 3D 打印件清单等,并附有零件采购链接;
- 3D 打印指引:如果这是你第一次打印、或者你没有 3D 打印机,按官方指南中的建议渠道获取打印件即可。
从仓库源码可以确认,SO-100 每个关节对应的电机模型、ID 和归一化模式在 src/lerobot/robots/so_follower/so_follower.py 中被硬编码为 6 个sts3215舵机,映射关系如下(MotorNormMode来自 src/lerobot/motors/feetech/feetech.py):
| 关节名 | 电机 ID | 模型 | 归一化模式 |
|---|---|---|---|
shoulder_pan(肩部旋转) | 1 | sts3215 | 角度(度) |
shoulder_lift(肩部抬升) | 2 | sts3215 | 角度(度) |
elbow_flex(肘部弯曲) | 3 | sts3215 | 角度(度) |
wrist_flex(腕部俯仰) | 4 | sts3215 | 角度(度) |
wrist_roll(腕部旋转) | 5 | sts3215 | 角度(度) |
gripper(夹爪) | 6 | sts3215 | 0–100 百分比 |
主臂(leader)的映射完全相同(见 src/lerobot/teleoperators/so_leader/so_leader.py),因此 leader 与 follower 在软件层面是一一对应的同构机械结构,只是末端执行器不同(leader 装手柄与扳机,follower 装夹爪)。
提醒:这里的 6 个 ID(1–6)与默认波特率 1,000,000(见 src/lerobot/motors/feetech/feetech.py 的
DEFAULT_BAUDRATE = 1_000_000)正是后文lerobot-setup-motors会写入电机 EEPROM 的目标值。
二、安装 LeRobot 与 Feetech SDK
安装 LeRobot 本体请参考仓库内的安装指南 docs/source/installation.mdx。对于 SO-100 还需要额外安装 Feetech 舵机 SDK 及其依赖:
pip install -e ".[feetech]"该 extra 在 pyproject.toml 中定义为:
feetech = ["feetech-servo-sdk>=1.0.0,<2.0.0", "lerobot[pyserial-dep]", "lerobot[deepdiff-dep]"]即需要feetech-servo-sdk(≥1.0.0 且 <2.0.0)、pyserial与deepdiff三个依赖。安装完成后,LeRobot 会提供lerobot-find-port、lerobot-setup-motors、lerobot-calibrate等命令行工具(入口定义在 pyproject.toml)。
三、配置电机(Configure the motors)
关键注意点:与 SO-101 不同,SO-100 组装完成后电机连接器不再容易触及,因此电机 ID 与波特率的配置必须在整机装配之前完成。如果你是从其他机器人上拆下来的二手舵机,ID 和波特率几乎必然不匹配,同样必须先做这一步。
3.1 第一步:找到两只机械臂对应的 USB 串口
运行:
lerobot-find-port脚本会列出当前所有可用的串口,然后要求你依次拔掉对应机械臂的 USB 线来逐个识别端口。
macOS 示例输出:
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. [...Disconnect corresponding leader or follower arm and press Enter...] The port of this MotorsBus is /dev/tty.usbmodem575E0032081 Reconnect the USB cable.本例中/dev/tty.usbmodem575E0032081就是当前这只 leader/follower 臂对应的端口。
Linux 示例输出:
Finding all available ports for the MotorBus. ['/dev/ttyACM0', '/dev/ttyACM1'] Remove the usb cable from your MotorsBus and press Enter when done. [...Disconnect corresponding leader or follower arm and press Enter...] The port of this MotorsBus is /dev/ttyACM1 Reconnect the USB cable.在 Linux 上,如果出现权限问题,需要先放开 USB 设备访问权限:
sudo chmod 666 /dev/ttyACM0 sudo chmod 666 /dev/ttyACM13.2 第二步:为每只臂设置电机 ID 与波特率
为什么必须做:每个电机在总线上都有一个唯一 ID,新电机出厂默认 ID 通常都是1,多个 ID 相同的电机无法通信;同时总线上数据传输速率由波特率决定,控制器与所有电机必须使用相同的波特率才能互相通信。这些参数写入电机内部非易失存储器(EEPROM),因此只需配置一次。
配置过程的核心逻辑在 src/lerobot/motors/motors_bus.py 的setup_motor中:它先扫描/确认电机当前的波特率与 ID,关闭力矩,写入目标 ID,再写入总线默认波特率(1,000,000)对应的寄存器值,最后把控制器端口切到默认波特率。
从臂(Follower)
先把 USB 线与电源接到从臂的控制器板上,然后执行(把端口换成上一步找到的):
lerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/tty.usbmodem585A0076841 # <- paste here the port found at previous step等价 API 写法:
from lerobot.robots.so_follower import SO100Follower, SO100FollowerConfig config = SO100FollowerConfig( port="/dev/tty.usbmodem585A0076841", id="my_awesome_follower_arm", ) follower = SO100Follower(config) follower.setup_motors()关于id参数:它给机械臂起一个唯一名字,用于关联专属的标定文件(后续校准结果会以该 id 命名保存)。
脚本启动后,你会看到提示:
Connect the controller board to the 'gripper' motor only and press enter.按提示只将夹爪电机接到控制器板(不要菊花链到其他电机),然后按回车,脚本会自动为该电机写入 ID 和波特率。成功后显示:
'gripper' motor id set to 6接着出现下一条指令:
Connect the controller board to the 'wrist_roll' motor only and press enter.此时可以把 3 芯线从控制器板端拔下(另一端留在夹爪电机上不动),另接一根 3 芯线到腕部旋转电机并连到控制器板,同样保证它是唯一连接、且没有串联到其他电机。按此流程逐一处理 6 个电机(注意脚本按逆序reversed(self.bus.motors)遍历,即从gripper到shoulder_pan,见 src/lerobot/robots/so_follower/so_follower.py)。
全部完成后脚本自然结束,电机即处于可用状态。此时再把各电机用 3 芯线首尾串联,并把第一个电机(id=1 的shoulder_pan)接到控制器板,最后把控制器板固定在机械臂底座上。
故障排查(Troubleshooting):如果此步骤报错,请检查以下接线:
- 电源供电是否正常;
- 电脑与控制器板之间的 USB 线;
- 控制器板到电机的 3 芯线。
如果使用的是 Waveshare 控制器板,请确认板上两个跳线帽位于B通道(USB 模式)。
[!TIP] 每次按回车前都检查一下接线——例如在搬动板子时电源线可能意外松脱。
主臂(Leader)
主臂执行完全相同的过程,只是命令与类型不同:
lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/tty.usbmodem575E0031751 # <- paste here the port found at previous step等价 API 写法:
from lerobot.teleoperators.so_leader import SO100Leader, SO100LeaderConfig config = SO100LeaderConfig( port="/dev/tty.usbmodem585A0076841", id="my_awesome_leader_arm", ) leader = SO100Leader(config) leader.setup_motors()主臂的setup_motors实现与从臂完全同构(见 src/lerobot/teleoperators/so_leader/so_leader.py)。
视觉参考:如何逐一定位电机 ID 的完整视频演示可参见 SO101 的 setup-motors 视频(SO-101 与该流程一致)。
四、逐步装配说明(Step-by-Step Assembly Instructions)
4.0 前置准备:拆除 6 个主臂电机的齿轮
主臂(leader)的 6 个电机需要拆除减速齿轮(文档提供了拆齿轮视频作为参考)。拆掉齿轮后,电机只保留位置编码功能,摩擦大幅降低,操作主臂时更加轻便灵活——这正是遥操作主臂需要的"顺滑手感"。从臂(follower)的电机保留齿轮,以提供足够的输出力矩来带动真实负载。
4.1 清理打印件
清除所有 3D 打印件的支撑材料,最简单的方式是用小螺丝刀从支撑材料下方撬除。
4.2 通用装配提示
文档提供了整臂装配视频作为视觉参考,但需要特别说明:视频不讲解何时、如何走线,而提前走线远比事后补线容易。实际经验是:第一只臂装配可能耗时略超过 1 小时,熟悉后第二只臂可控制在 1 小时以内。
4.3 第一电机(底座肩部)
- Step 2(插线):向第一个电机插入两根导线;
- Step 3(装入底座):将第一个电机放入底座;
- Step 4(固定电机):用 4 颗螺丝固定,底部 2 颗、顶部 2 颗;
- Step 5(安装电机支架):套上第一个电机支架,两侧各 1 颗螺丝;
- Step 6(安装电机舵盘):装上两个舵盘,顶部舵盘用一颗舵盘螺丝固定。安装舵盘时尽量不要带动电机转动——尤其对于拆了齿轮的 leader 电机;
- Step 7(安装肩部件):将一根导线从机器人后方走线,另一根走向左侧或朝向自己,然后装上肩部件;
- Step 8(固定肩部):肩部件顶部 4 颗、底部 4 颗共 8 颗螺丝(翻转肩部以够到底部孔位)。
4.4 第二电机(肩部抬升)
- Step 9:从顶部滑入第二个电机,并把电机 1 的导线接到电机 2;
- Step 10(装肩部电机支架):加装肩部电机支架,确保电机 1→2 的导线位于支架后方、另一根导线向上走线。该件较紧,可借助工作台等平面把支架推压到位;
- Step 11:用 4 颗螺丝固定电机 2;
- Step 12:给电机 2 装两个舵盘,其中一个使用舵盘螺丝;
- Step 13:用 2 颗螺丝安装底座连接件;
- Step 14:用每侧 4 颗螺丝连接上臂。
4.5 第三电机(肘部)
- Step 15:把电机 2 的电缆穿过线夹引至电机 3,然后用 4 颗螺丝固定电机 3;
- Step 16:给电机 3 装两个舵盘,其中一个使用舵盘螺丝;
- Step 17:用每侧 4 颗螺丝连接前臂。
4.6 第四电机(腕部俯仰)
- Step 18:滑入电机 4,接上电机 3 的电缆,并用螺丝把电缆固定在线夹中;
- Step 19(装电机 4 支架):安装第四个电机支架(配合较紧),确保一根导线向上走线、电机 3 的导线向下走线;
- Step 20:用 4 颗螺丝固定电机 4,并装好舵盘(其中一个用舵盘螺丝)。
4.7 腕部(第五电机)
- Step 21:把电机 5 装入腕部支架,用 2 颗正面螺丝固定;
- Step 22:连接电机 4→5 的导线,并提前插入夹爪用的导线;用两侧各 4 颗螺丝把腕部固定到电机 4;
- Step 23:腕部电机只装一个舵盘,并用舵盘螺丝固定。
4.8 从臂配置(Follower Configuration,Step 24–27)
- Step 24:将夹爪安装到电机 5 上;
- Step 25:装入夹爪电机,连接电机 5→6 的导线,两侧各 3 颗螺丝固定;
- Step 26:装好电机舵盘(其中一个用舵盘螺丝),再安装夹爪钳,两侧各 4 颗螺丝;
- Step 27:把电机控制器板安装到机器人背部。
至此从臂装配完成,进入主臂装配。
4.9 主臂配置(Leader Configuration)
主臂执行Step 1–23,且务必确保舵机齿轮已被拆除。之后:
- Step 24:把 leader 支架安装到腕部并用一颗螺丝固定;
- Step 25:用 4 颗螺丝把手柄安装到电机 5;
- Step 26:装入夹爪电机,两侧各 3 颗螺丝固定,装一个舵盘(舵盘螺丝),并接好电机导线;
- Step 27:用 4 颗螺丝安装扳机(trigger);
- Step 28:把电机控制器板安装到机器人背部。
主臂末端是手柄+扳机结构而非夹爪,用于人手握持遥操作,其余机械结构(肩、肘、腕)与从臂完全相同。
五、校准(Calibrate)
校准的目标是让 leader 与 follower 在相同物理姿态下具有相同的位置值。这非常关键:只有完成校准,基于一台机器人采集数据训练出的神经网络策略才能迁移到另一台(或多台)机器上运行。
LeRobot 已把大多数机器人的校准流程统一化,SO-100 的校准步骤与 Koch、SO101 完全一致(SO101 的校准视频可作为参考)。其底层实现见 src/lerobot/robots/so_follower/so_follower.py 的calibrate(),核心流程是:
- 关闭力矩(
disable_torque),把 6 个电机都设为位置模式(OperatingMode.POSITION); - 提示把机器人移到每个关节行程的中点位置,按回车后调用
set_half_turn_homings()写入归零偏移,使当前位置对应 12 位编码器的半圈值2047(见 src/lerobot/motors/motors_bus.py); - 提示依次把除
wrist_roll外的所有关节走满整个行程,record_ranges_of_motion()会实时打印每个关节的 MIN/POS/MAX 并持续记录极值,按回车结束(见 src/lerobot/motors/motors_bus.py); - 特殊处理
wrist_roll:该关节行程固定为 0–4095(整圈,即 12 位编码器全量程); - 把
MotorCalibration(id、drive_mode、homing_offset、range_min、range_max)写入电机并保存到与id关联的标定文件。
另外,calibrate()还会检查是否已存在与当前id关联的标定文件:若存在,会提示按回车直接复用该文件写入电机,或输入c重新校准。
5.1 校准从臂(Follower)
lerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/tty.usbmodem58760431551 \ # <- The port of your robot --robot.id=my_awesome_follower_arm # <- Give the robot a unique name等价 API 写法:
from lerobot.robots.so_follower import SO100FollowerConfig, SO100Follower config = SO100FollowerConfig( port="/dev/tty.usbmodem585A0076891", id="my_awesome_follower_arm", ) follower = SO100Follower(config) follower.connect(calibrate=False) follower.calibrate() follower.disconnect()5.2 校准主臂(Leader)
lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/tty.usbmodem58760431551 \ # <- The port of your robot --teleop.id=my_awesome_leader_arm # <- Give the robot a unique name等价 API 写法:
from lerobot.teleoperators.so_leader import SO100LeaderConfig, SO100Leader config = SO100LeaderConfig( port="/dev/tty.usbmodem58760431551", id="my_awesome_leader_arm", ) leader = SO100Leader(config) leader.connect(calibrate=False) leader.calibrate() leader.disconnect()主臂与从臂的calibrate()实现逻辑一致(见 src/lerobot/teleoperators/so_leader/so_leader.py)。
六、校准后的软件配置细节与运行机制
装配与校准完成后,双机械臂即可被 LeRobot 驱动。理解以下几个源码层面的细节,能帮助你更好地排查问题:
- 波特率与通信:Feetech 总线默认波特率为 1,000,000(src/lerobot/motors/feetech/feetech.py),
connect()时会做握手并自动校验标定是否匹配(src/lerobot/robots/so_follower/so_follower.py)。 - 电机参数写入:从臂
configure()会在连接时写入位置模式 PID 系数(默认 P=16、I=0、D=32,见 src/lerobot/robots/so_follower/config_so_follower.py),并对夹爪电机写入电流/力矩保护(Max_Torque_Limit=500、Protection_Current=250、Overload_Torque=25),防止夹爪堵转烧毁电机(src/lerobot/robots/so_follower/so_follower.py)。 - 观测与动作:从臂通过
sync_read("Present_Position")读取 6 个关节位置作为观测(observation_features),通过sync_write("Goal_Position")下发目标位置作为动作;主臂则通过get_action()读取关节位置生成遥操作动作、通过send_feedback()把从臂力反馈写回主臂(见 src/lerobot/teleoperators/so_leader/so_leader.py)。 - 读重试机制:Feetech 总线在多关节同时运动时偶尔返回损坏的状态包(
Incorrect status packet!),因此SOFollowerConfig/SOLeaderConfig提供num_read_retries: int = 2参数,在读取失败时立即重试而不中断控制循环(src/lerobot/robots/so_follower/config_so_follower.py)。 - 安全限位:从臂支持
max_relative_target参数,限制单次下发的目标位置与当前位置的最大相对偏移(可设为标量或按电机设置的字典),避免过大动作导致机械损坏(src/lerobot/robots/so_follower/config_so_follower.py 与 src/lerobot/robots/so_follower/so_follower.py)。
仓库中对应的单元测试 tests/robots/test_so100_follower.py 覆盖了connect/disconnect与get_observation返回键格式(每个关节形如shoulder_pan.pos),可作为理解该机器人数据接口的参考。
七、下一步:开始训练
恭喜,你的机器人已全部就绪,可以开始学习任务了!接下来请跟随真实机器人入门教程 docs/source/il_robots.mdx 完成数据采集、策略训练与评估,从而用端到端学习让 SO-100 自主完成抓取积木等真实任务。
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考