
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肩部旋转1sts3215角度度shoulder_lift肩部抬升2sts3215角度度elbow_flex肘部弯曲3sts3215角度度wrist_flex腕部俯仰4sts3215角度度wrist_roll腕部旋转5sts3215角度度gripper夹爪6sts32150–100 百分比主臂leader的映射完全相同见 src/lerobot/teleoperators/so_leader/so_leader.py因此 leader 与 follower 在软件层面是一一对应的同构机械结构只是末端执行器不同leader 装手柄与扳机follower 装夹爪。提醒这里的 6 个 ID1–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-sdk1.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.typeso100_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, idmy_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 芯线首尾串联并把第一个电机id1 的shoulder_pan接到控制器板最后把控制器板固定在机械臂底座上。故障排查Troubleshooting如果此步骤报错请检查以下接线电源供电是否正常电脑与控制器板之间的 USB 线控制器板到电机的 3 芯线。如果使用的是 Waveshare 控制器板请确认板上两个跳线帽位于B通道USB 模式。[!TIP] 每次按回车前都检查一下接线——例如在搬动板子时电源线可能意外松脱。主臂Leader主臂执行完全相同的过程只是命令与类型不同lerobot-setup-motors \ --teleop.typeso100_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, idmy_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 Instructions4.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 的导线接到电机 2Step 10装肩部电机支架加装肩部电机支架确保电机 1→2 的导线位于支架后方、另一根导线向上走线。该件较紧可借助工作台等平面把支架推压到位Step 11用 4 颗螺丝固定电机 2Step 12给电机 2 装两个舵盘其中一个使用舵盘螺丝Step 13用 2 颗螺丝安装底座连接件Step 14用每侧 4 颗螺丝连接上臂。4.5 第三电机肘部Step 15把电机 2 的电缆穿过线夹引至电机 3然后用 4 颗螺丝固定电机 3Step 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 颗螺丝把腕部固定到电机 4Step 23腕部电机只装一个舵盘并用舵盘螺丝固定。4.8 从臂配置Follower ConfigurationStep 24–27Step 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 颗螺丝把手柄安装到电机 5Step 26装入夹爪电机两侧各 3 颗螺丝固定装一个舵盘舵盘螺丝并接好电机导线Step 27用 4 颗螺丝安装扳机triggerStep 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 位编码器全量程把MotorCalibrationid、drive_mode、homing_offset、range_min、range_max写入电机并保存到与id关联的标定文件。另外calibrate()还会检查是否已存在与当前id关联的标定文件若存在会提示按回车直接复用该文件写入电机或输入c重新校准。5.1 校准从臂Followerlerobot-calibrate \ --robot.typeso100_follower \ --robot.port/dev/tty.usbmodem58760431551 \ # - The port of your robot --robot.idmy_awesome_follower_arm # - Give the robot a unique name等价 API 写法from lerobot.robots.so_follower import SO100FollowerConfig, SO100Follower config SO100FollowerConfig( port/dev/tty.usbmodem585A0076891, idmy_awesome_follower_arm, ) follower SO100Follower(config) follower.connect(calibrateFalse) follower.calibrate() follower.disconnect()5.2 校准主臂Leaderlerobot-calibrate \ --teleop.typeso100_leader \ --teleop.port/dev/tty.usbmodem58760431551 \ # - The port of your robot --teleop.idmy_awesome_leader_arm # - Give the robot a unique name等价 API 写法from lerobot.teleoperators.so_leader import SO100LeaderConfig, SO100Leader config SO100LeaderConfig( port/dev/tty.usbmodem58760431551, idmy_awesome_leader_arm, ) leader SO100Leader(config) leader.connect(calibrateFalse) leader.calibrate() leader.disconnect()主臂与从臂的calibrate()实现逻辑一致见 src/lerobot/teleoperators/so_leader/so_leader.py。六、校准后的软件配置细节与运行机制装配与校准完成后双机械臂即可被 LeRobot 驱动。理解以下几个源码层面的细节能帮助你更好地排查问题波特率与通信Feetech 总线默认波特率为 1,000,000src/lerobot/motors/feetech/feetech.pyconnect()时会做握手并自动校验标定是否匹配src/lerobot/robots/so_follower/so_follower.py。电机参数写入从臂configure()会在连接时写入位置模式 PID 系数默认 P16、I0、D32见 src/lerobot/robots/so_follower/config_so_follower.py并对夹爪电机写入电流/力矩保护Max_Torque_Limit500、Protection_Current250、Overload_Torque25防止夹爪堵转烧毁电机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),仅供参考