news 2026/9/10 13:26:47

LeRobot SO-100 六轴机械臂实战指南:从零部件采购、电机配置、整机装配到双臂标定全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeRobot SO-100 六轴机械臂实战指南:从零部件采购、电机配置、整机装配到双臂标定全流程

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 个 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)、pyserialdeepdiff三个依赖。安装完成后,LeRobot 会提供lerobot-find-portlerobot-setup-motorslerobot-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/ttyACM1

3.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)遍历,即从grippershoulder_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(),核心流程是:

  1. 关闭力矩(disable_torque),把 6 个电机都设为位置模式(OperatingMode.POSITION);
  2. 提示把机器人移到每个关节行程的中点位置,按回车后调用set_half_turn_homings()写入归零偏移,使当前位置对应 12 位编码器的半圈值2047(见 src/lerobot/motors/motors_bus.py);
  3. 提示依次把除wrist_roll外的所有关节走满整个行程,record_ranges_of_motion()会实时打印每个关节的 MIN/POS/MAX 并持续记录极值,按回车结束(见 src/lerobot/motors/motors_bus.py);
  4. 特殊处理wrist_roll:该关节行程固定为 0–4095(整圈,即 12 位编码器全量程);
  5. 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=500Protection_Current=250Overload_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/disconnectget_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 13:23:08

用Python复刻我的世界小游戏:体素引擎与区块存储实战

简介&#xff1a;这是一套基于Python和Pygame库实现的‘我的世界’风格二维沙盒小游戏源码&#xff0c;面向已经掌握Python基础语法、希望真正进入游戏开发领域的初学者。项目借助窗口创建、事件监听、方块绘制、碰撞检测与帧速率控制等机制&#xff0c;完整展示像素化沙盒游戏…

作者头像 李华
网站建设 2026/9/10 13:22:01

YOLOv5双目测距毕设实战:标定、视差与三维映射全链路解析

简介&#xff1a;本资源是一套完整的毕业设计级项目方案&#xff0c;面向计算机视觉方向的本科生与初学者&#xff0c;解决目标检测与三维空间距离测量的融合实践问题。项目基于YOLOv5实现高效目标识别&#xff0c;并结合双目摄像头标定与视差计算完成实时距离估计&#xff0c;…

作者头像 李华
网站建设 2026/9/10 13:21:56

OpenVoice即时语音克隆:10秒参考音频,让它用你的声音说话

OpenVoice即时语音克隆&#xff1a;10秒参考音频&#xff0c;让它用你的声音说话 【免费下载链接】OpenVoice Instant voice cloning by MIT and MyShell. Audio foundation model. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice OpenVoice 是 MIT 与 My…

作者头像 李华
网站建设 2026/9/10 13:18:36

数据库性能优化:程序操作优化策略与实践

1. 程序操作优化在数据库性能中的核心地位数据库性能优化从来都不是单一维度的技术活&#xff0c;而程序操作优化恰恰是最容易被忽视的关键环节。我见过太多团队在硬件配置和索引设计上投入大量精力&#xff0c;却对应用程序中的数据库操作代码放任自流。实际上&#xff0c;根据…

作者头像 李华
网站建设 2026/9/10 13:18:15

湖南家长必读:如何帮孩子规划单招升学

在湖南&#xff0c;越来越多家长已经认清升学现实&#xff1a;文化课成绩中等、偏薄弱的孩子&#xff0c;硬拼夏季高考&#xff0c;大概率无缘公办大专&#xff0c;最终要么高价就读民办院校&#xff0c;要么直接落榜无学可上。而高职单招作为湖南省教育厅、省教育考试院官方统…

作者头像 李华