LeRobot SO-101 完整指南:从零件采购、机械臂组装、电机配置到校准

发布时间:2026/9/10 23:18:16
LeRobot SO-101 完整指南:从零件采购、机械臂组装、电机配置到校准
LeRobot SO-101 完整指南从零件采购、机械臂组装、电机配置到校准【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot本指南面向希望在真实硬件上运行 LeRobot 端到端学习的开发者以仓库内 SO-101 官方组装文档 为主体完整讲解 LeRobot 旗舰机械臂 SO-101 的从零落地流程如何采购零件与 3D 打印、如何安装 Feetech 电机依赖、如何为 leader遥操作臂与 follower执行臂配置电机 id 与波特率、如何逐步完成机械组装以及如何通过校准让两条机械臂在物理空间中保持一致的位姿语义最终让神经网络模型可以在真实机器人上直接训练与部署。读完本文你将获得一套可直接照做的 SO-101 硬件搭建与调试方案。SO-101 是什么LeRobot 的旗舰双臂系统SO-101 是 LeRobot 项目src/lerobot的代表性双臂遥操作系统由两条六自由度机械臂组成Leader 臂遥操作主臂由操作员直接手持作为动作输入设备向系统提供高精度的关节角度动作指令Follower 臂执行从臂根据 leader 提供或模型预测的动作在真实环境中执行任务。在仓库中二者的实现分别位于 so_leader.py 与 so_follower.py。从源码结构可以推断它们共用了同一套FeetechMotorsBus总线和几乎相同的电机拓扑但承担的角色不同leader 通过get_action()读取当前关节位置作为遥操作动作follower 通过send_action()把目标关节位置写入电机这正是 LeRobot 数据采集lerobot-record与真机 rollout 的核心硬件基础。SO-101 与更早的 SO-100 在软件层高度兼容源码中SO100Leader SOLeader、SO101Leader SOLeader配置类也通过TeleoperatorConfig.register_subclass(so101_leader)与so100_leader同时注册因此下文针对 SO-101 的绝大多数命令与 API 同样适用于 SO-100。第一步获取零件与 3D 打印SO-101 的机械结构件全部为 3D 打印件。零件清单BOM、零件采购渠道以及 3D 打印说明由 SO-ARM100 项目维护。在开始之前请注意若你是第一次进行 3D 打印或没有自己的 3D 打印机建议先在零件清单中确认第三方打印服务或代打印渠道避免自行摸索支撑材料的拆除与打印参数打印完成后需要清理所有支撑材料后续组装章节会给出具体建议。第二步安装 LeRobot 与 Feetech 支持SO-101 使用 Feetech 品牌的舵机因此除了 LeRobot 本体之外还必须安装 Feetech 专属依赖。仓库的安装指引位于 安装指南其中明确列出 Feetech 电机支持对应的 extra 为lerobot[feetech]且多个 extra 可以组合使用例如.[aloha,feetech]。在已克隆仓库根目录下执行pip install -e .[feetech]如果使用uv作为包管理器则用uv pip install -e .[feetech]替代。安装完成后即可使用下文中的lerobot-find-port、lerobot-setup-motors、lerobot-calibrate等 CLI 工具。理解电机布局与齿轮比SO-101 每条机械臂的六个关节都使用Feetech STS3215舵机但 leader 与 follower 的减速比配置截然不同Follower 臂全部 6 个电机统一使用 1/345 减速比以输出足够的扭矩支撑负载并稳定执行动作Leader 臂按关节功能差异化配置减速比——既要能承受自身重量需要大扭矩又要保证操作员可以轻松拨动需要低阻力因此底座/肩部关节用较高减速比腕部与夹爪用较低减速比。Leader 各轴对应的电机序号与齿轮比见下表这也是配置电机 id 时的依据Leader 臂关节轴电机序号齿轮比Base / Shoulder Pan底座/肩部旋转11 / 191Shoulder Lift肩部抬升21 / 345Elbow Flex肘部屈伸31 / 191Wrist Flex腕部屈伸41 / 147Wrist Roll腕部旋转51 / 147Gripper夹爪61 / 147从 so_leader.py 与 so_follower.py 的源码可以看到总线上的电机 id 映射固定为motors{ shoulder_pan: Motor(1, sts3215, norm_mode_body), shoulder_lift: Motor(2, sts3215, norm_mode_body), elbow_flex: Motor(3, sts3215, norm_mode_body), wrist_flex: Motor(4, sts3215, norm_mode_body), wrist_roll: Motor(5, sts3215, norm_mode_body), gripper: Motor(6, sts3215, MotorNormMode.RANGE_0_100), },注意夹爪id6的归一化模式为RANGE_0_1000-100 开度百分比其余关节在use_degreesTrue默认时以**角度度**为单位归一化若在配置中将use_degrees设为False则改为RANGE_M100_100模式。这一细节在后续校准与训练数据生成中会直接影响数值含义。配置电机id 与波特率新出厂的电机默认 id 通常都为1波特率也可能不一致而总线通信要求每个电机拥有唯一的 id、且与控制器使用相同的波特率。这些参数写入电机内部的非易失性 EEPROM因此只需执行一次如果你从其他机器人拆借了电机也建议重新执行本步骤。1. 定位每只机械臂对应的 USB 串口将 MotorBus 控制器通过 USB 连接电脑并供电运行lerobot-find-port脚本会列出当前所有可用串口然后提示你拔掉 USB 线并回车通过对比拔插前后端口列表的差异来定位目标设备实现见 lerobot_find_port.py。不同平台输出示例如下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. [...断开对应的 leader 或 follower 臂后回车...] The port of this MotorsBus is /dev/tty.usbmodem575E0032081 Reconnect the USB cable.即该 MotorBus对应你的某一条机械臂的端口为/dev/tty.usbmodem575E0032081。Linux 示例输出Finding all available ports for the MotorBus. [/dev/ttyACM0, /dev/ttyACM1] Remove the usb cable from your MotorsBus and press Enter when done. [...断开对应的 leader 或 follower 臂后回车...] The port of this MotorsBus is /dev/ttyACM1 Reconnect the USB cable.即端口为/dev/ttyACM1。在 Linux 下如果出现权限不足无法访问串口需要先放开设备权限以实际设备号为准sudo chmod 666 /dev/ttyACM0 sudo chmod 666 /dev/ttyACM1重复上述流程分别确定 leader 与 follower 各自的端口后续所有命令都需要用到。2. 设置电机 id 与波特率Follower将电脑 USB 线以及电源接到 follower 臂的控制器板上然后运行下面命令把端口替换为上一步找到的值或使用等价的 Python API命令行方式lerobot-setup-motors \ --robot.typeso101_follower \ --robot.port/dev/tty.usbmodem585A0076841 # - 填入上一步找到的端口Python API 方式from lerobot.robots.so_follower import SO101Follower, SO101FollowerConfig config SO101FollowerConfig( port/dev/tty.usbmodem585A0076841, idmy_awesome_follower_arm, ) follower SO101Follower(config) follower.setup_motors()脚本启动后会提示Connect the controller board to the gripper motor only and press enter.请按提示操作先把夹爪电机单独接到控制器板确保它是板上唯一连接的电机且该电机尚未与其他电机串联daisy-chain。按下回车后脚本会自动为该电机写入 id 与波特率。故障排查Troubleshooting如果此时报错请依次检查电源是否接通、电脑与控制器板之间的 USB 线是否插牢、控制器板到电机的 3-pin 线是否接触良好。若使用 Waveshare 控制器板还需确认两个跳线帽设置在B通道USB上。成功后屏幕会输出gripper motor id set to 6随后脚本给出下一条指令Connect the controller board to the wrist_roll motor only and press enter.此时可以拔下控制器板上的 3-pin 线另一端仍可留在夹爪电机上再插一根新的 3-pin 线把 wrist_roll 电机接到控制器板同样确保它是唯一连接的电机且未与其他电机串联。照此流程依次为每个电机执行配置。从源码 so_leader.py 可以看到setup_motors()按逆序遍历电机先gripper、再wrist_roll……最后shoulder_pan这样逐个把 id 6 到 id 1 写入对应电机。提示每一步按下回车之前务必检查接线。例如在操作电路板的过程中电源线可能松动脱落。所有电机配置完成后脚本自动退出。此时可把每个电机的 3-pin 线首尾串联daisy-chain将第一个电机shoulder panid1的线接回控制器板并把控制器板固定到机械臂底座。3. 设置电机 id 与波特率Leader对 leader 臂执行完全相同的流程区别仅在于 CLI 参数从--robot.*换成--teleop.*设备类型改为so101_leader命令行方式lerobot-setup-motors \ --teleop.typeso101_leader \ --teleop.port/dev/tty.usbmodem575E0031751 # - 填入上一步找到的端口Python API 方式from lerobot.teleoperators.so_leader import SO101Leader, SO101LeaderConfig config SO101LeaderConfig( port/dev/tty.usbmodem585A0076841, idmy_awesome_leader_arm, ) leader SO101Leader(config) leader.setup_motors()CLI 层的参数分流实现在 lerobot_setup_motors.pyteleop与robot二者必须且只能提供一个脚本据此实例化SO101Leader或SO101Follower并调用其setup_motors()。逐步机械组装说明原文档为每个关节附带了对应的装配演示视频可在仓库文档页查看下面给出文字版操作步骤与螺丝规格。装配前建议先为电机接好 3-pin 线便于后续串接。清理打印件用一把小螺丝刀从支撑材料下方撬起逐一清除所有 3D 打印件上的支撑材料。Joint 1底座/肩部旋转安装两个电机舵盘motor horn顶部舵盘用 1 颗 M3x6mm 螺丝固定底部舵盘不需要螺丝将 1 号电机放入底座用 4 颗 M2x6mm 螺丝最小号螺丝固定电机顶部 2 颗、底部 2 颗套上第一个电机固定座用 2 颗 M2x6mm 螺丝每侧 1 颗固定安装肩部零件用顶部 4 颗 M3x6mm 螺丝、底部 4 颗 M3x6mm 螺丝拧紧肩部零件安装肩部电机固定座。Joint 2肩部抬升安装两个电机舵盘顶部舵盘用 M3x6mm 螺丝固定底部舵盘不需螺丝从上方滑入 2 号电机用 4 颗 M2x6mm 螺丝固定 2 号电机用每侧 4 颗 M3x6mm 螺丝安装上臂。Joint 3肘部屈伸安装两个电机舵盘顶部舵盘用 M3x6mm 螺丝固定底部舵盘不需螺丝插入 3 号电机用 4 颗 M2x6mm 螺丝固定用每侧 4 颗 M3x6mm 螺丝把前臂连接到 3 号电机。Joint 4腕部屈伸安装两个电机舵盘顶部舵盘用 M3x6mm 螺丝固定底部舵盘不需螺丝套上 4 号电机固定座滑入 4 号电机用 4 颗 M2x6mm 螺丝固定 4 号电机。Joint 5腕部旋转将 5 号电机插入腕部固定座用 2 颗 M2x6mm 前部螺丝固定腕部电机只安装一个舵盘用 M3x6mm 舵盘螺丝固定用两侧各 4 颗 M3x6mm 螺丝把腕部固定到 4 号电机上。夹爪 / 手柄Follower执行臂夹爪把夹爪连接到 5 号电机用 4 颗 M3x6mm 螺丝固定在腕部舵盘上插入夹爪电机每侧用 2 颗 M2x6mm 螺丝固定在夹爪电机上安装两个舵盘顶部舵盘用 M3x6mm 螺丝固定底部舵盘不需螺丝安装夹爪钳爪两侧各用 4 颗 M3x6mm 螺丝固定。Leader遥操作臂手柄将 leader 固定座安装到腕部用 4 颗 M3x6mm 螺丝固定用 1 颗 M2x6mm 螺丝把手柄固定到 leader 固定座插入夹爪电机每侧用 2 颗 M2x6mm 螺丝固定再用 1 颗 M3x6mm 舵盘螺丝安装舵盘用 4 颗 M3x6mm 螺丝安装 follower 扳机trigger。校准机械臂校准的目标是让 leader 与 follower 在相同物理姿态下输出相同的关节位置值。这一步至关重要只有两臂的位姿语义一致在一条机械臂上采集的数据、或在仿真与另一台机器上训练出的神经网络才能直接迁移到你的机器人上运行。从 so_leader.py 与 so_follower.py 的calibrate()实现看校准流程实际包含三个环节归零homing先把机械臂移动到所有关节行程的中间位置按回车后系统通过set_half_turn_homings()为每个电机写入半圈归零偏移homing offset把中间位姿定义为角度 0行程记录range of motion随后系统提示除wrist_roll外的所有关节依次走完整个行程通过record_ranges_of_motion()记录每个关节的物理最小/最大位置特殊处理wrist_roll腕部旋转支持多圈旋转其行程被直接固定为原始编码范围 0~4095无需手动记录。校准得到的MotorCalibration含 id、drive_mode、homing_offset、range_min、range_max会写入电机并保存为与设备id相关联的校准文件。此后每次connect()时若检测到电机中的校准值与文件不匹配或没有校准文件会提示重新校准若已有校准文件按回车直接使用文件中的值输入c则强制重新校准。校准 Follower命令行方式lerobot-calibrate \ --robot.typeso101_follower \ --robot.port/dev/tty.usbmodem58760431551 \ # - 你的机器人端口 --robot.idmy_awesome_follower_arm # - 给机器人一个唯一名称Python API 方式from lerobot.robots.so_follower import SO101FollowerConfig, SO101Follower config SO101FollowerConfig( port/dev/tty.usbmodem585A0076891, idmy_awesome_follower_arm, ) follower SO101Follower(config) follower.connect(calibrateFalse) follower.calibrate() follower.disconnect()校准 Leader对 leader 执行相同步骤参数前缀换成--teleop.*命令行方式lerobot-calibrate \ --teleop.typeso101_leader \ --teleop.port/dev/tty.usbmodem58760431551 \ # - 你的机器人端口 --teleop.idmy_awesome_leader_arm # - 给机器人一个唯一名称Python API 方式from lerobot.teleoperators.so_leader import SO101LeaderConfig, SO101Leader config SO101LeaderConfig( port/dev/tty.usbmodem58760431551, idmy_awesome_leader_arm, ) leader SO101Leader(config) leader.connect(calibrateFalse) leader.calibrate() leader.disconnect()CLI 背后的执行序列见 lerobot_calibrate.py先connect(calibrateFalse)避免连接时自动触发校准造成流程冲突再调用calibrate()最后在finally中disconnect()。校准操作要领首先把机械臂移到所有关节都处于行程中间的位置并回车随后依次把每个关节腕部旋转除外从一端拨到另一端走完整段行程系统实时记录位置范围完成后回车结束。leader 与 follower 均需执行且应保证两臂在同一姿态定义下校准。安全与运行相关的配置细节在真机训练与 rollout 之前理解 follower 的几个关键配置参数定义见 config_so_follower.py有助于避免损坏硬件PID 位置环增益连接时写入 STS3215 电机的position_p_coefficient默认 16、position_i_coefficient默认 0、position_d_coefficient默认 32夹爪过载保护configure()会对gripper额外写入Max_Torque_Limit500最大扭矩的 50%、Protection_Current250最大电流的 50%、Overload_Torque25过载时扭矩降至 25%防止夹爪电机烧毁见 so_follower.pymax_relative_target限制单步相对目标位置向量的幅度用于安全防护支持一个标量或按电机名映射的字典设置后send_action()会先读取当前实际位置再对超出限幅的目标进行裁剪见 so_follower.pynum_read_retries默认 2Feetech 总线在多个关节同时运动时偶发返回损坏状态包Incorrect status packet!该参数控制在sync_read失败时的额外重试次数重试立即执行且仅在失败时发生不增加稳态读取开销disable_torque_on_disconnect默认True断开连接时自动卸载扭矩防止机械臂意外坠落。下一步开始真机训练校准完成后机械臂已经可以稳定地收发关节角度数据。接下来可以使用lerobot-record采集 leader 遥操作的演示数据在 LeRobot 中选择合适的策略模型进行端到端训练使用lerobot-rollout在 follower 上评估训练好的模型。完整的真机入门教程参见 Getting started with real-world robots即仓库中il_robots文档覆盖数据采集、训练与评估的完整工作流。至此你的 SO-101 双臂系统已具备开始端到端学习的所有硬件前提。【免费下载链接】lerobot LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考