ST3215 舵机接入 LeRobot 完整实战指南
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
你的 ST3215 舵机接上 SO-100 机械臂后,在 LeRobot 里要么没反应、要么角度乱跳?这份指南带你从零跑通 ST3215 在 LeRobot 中的完整控制链路,从串口扫描到角度标定全部落地。
动手前——环境与前置条件
先确认手上齐活:
- LeRobot 仓库:
git clone https://gitcode.com/GitHub_Trending/le/lerobot - 舵机:Feetech ST3215 × N 个,默认波特率 1M(出厂默认,见 src/lerobot/motors/feetech/feetech.py 中
DEFAULT_BAUDRATE = 1_000_000) - 一个 USB 转串口模块(CH340 即可),供电 ≥5V/2A 建议独立供电
- Python ≥ 3.10,以及
feetech-servo-sdk、pyserial两个依赖(通过 extra 一次性装齐)
先花 20 秒理解核心概念:ST3215 走 Feetech 协议 0(一套基于串口的寄存器读写协议),每个舵机有独立 ID,位置用 0~4095 的整数编码(12 位精度),且角度类寄存器用符号-绝对值编码(最高位是方向位)。LeRobot 把"查表、编码、同步读写"这些脏活全部封装在 motors 模块里,你只需要按名字读写寄存器。
# 克隆后带 feetech 依赖安装,一条命令装齐 SDK pip install -e ".[feetech,pyserial-dep]"装完能import lerobot不报错,环境就算就绪。
五步跑通——最小可用链路
第一步:找到串口。不知道板子接在哪个端口?跑一下这条命令,按提示插拔 USB 即可自动定位:
# 拔插 USB 定位舵机总线所在串口 python src/lerobot/scripts/lerobot_find_port.py输出形如/dev/ttyUSB0(Linux)或/dev/tty.usbmodemXXX(macOS),记下来。
第二步:最小化连通总线。拿到端口后,直接构造一条单舵机总线,这是验证硬件最短的路径:
# 构造单舵机 Feetech 总线:端口 + {名称: (ID, 型号)} from lerobot.motors.feetech import FeetechMotorsBus bus = FeetechMotorsBus( port="/dev/ttyUSB0", motors={"my_motor": (1, "sts3215")}, ) bus.connect() # 握手:逐波特率扫描 + 校验型号号 777 print(bus.motors)connect()内部会做_assert_motors_exist和固件版本一致性检查,任何一步失败都会直接抛错,方便你定位。
第三步:验证角度读取。连接成功后,读一个原始位置确认通信双向可用:
# 读原始位置(0~4095),确认通信正常 pos = bus.read("Present_Position", "my_motor", normalize=False) print(pos)输出在 0~4095 之间且随手拨动舵机会变化,说明读写都通了。
第四步:写入目标位置并微调速度。上一步确认能读之后,接下来让它动:
# 写目标位置并压短响应延迟(2µs 级) bus.write("Goal_Position", "my_motor", pos + 30, normalize=False) bus.configure_motors() # 同时把 ST3215 的 Phase 位修掉,防角度跳变注意configure_motors()里有一段只对 sts3215 生效的逻辑:清除 Phase 寄存器的 bit 4,强制读数落在[0, 4095],不跑这一步,部分固件版本的角度读数会在 2048 附近来回跳。
第五步:标定关节限位。舵机原始角度和机器人关节空间对不齐,靠标定解决。把舵机摆到运动范围中点,再逐个关节走满全程:
# 交互式标定:写 Homing_Offset 和 Min/Max_Position_Limit python src/lerobot/scripts/lerobot_calibrate.py --robot so100_follower标定结果会写进舵机 EEPROM 并落盘成*_calibration.json,之后connect(calibrate=True)会自动比对,不一致才重新标。
验证命令:重跑第二步脚本,print(pos)在关节静止时读数应稳定不变,手拨后回读值平滑跟随,误差在几个 LSB 内就算过了。
知其所以然——关键模块拆解
| 模块路径 | 职责 | 关键接口/函数 |
|---|---|---|
| src/lerobot/motors/feetech/tables.py | ST3215 的寄存器表:控制表、4096 分辨率、波特率表、符号位位置 | MODEL_CONTROL_TABLE、MODEL_RESOLUTION |
| src/lerobot/motors/feetech/feetech.py | 协议 0 帧收发、多舵机同步读写、校准读写 | FeetechMotorsBus.read/write/sync_read、configure_motors |
| src/lerobot/motors/encoding_utils.py | 角度类寄存器的符号-绝对值编解码 | encode_sign_magnitude/decode_sign_magnitude |
| src/lerobot/robots/so_follower/config_so_follower.py | SO-100/101 的电机配置、PID 增益、读失败重试数 | SOFollowerRobotConfig |
| src/lerobot/motors/motors_bus.py | 总线抽象层,Dynamixel 与 Feetech 共用 | SerialMotorsBus、Motor、MotorCalibration |
数据流向一句话串起来:上层代码调bus.read("Present_Position"),总线类查 tables.py 拿到寄存器地址,经 encoding_utils 解码符号位,底层 SDK 发一帧协议 0 包给舵机,舵机回包后按同一链路反向归一化,最终返回给调用方。
调优与排障——踩过的坑都在这儿
| 现象 | 根因 | 一句话解法 |
|---|---|---|
| 舵机完全不动 | 扭矩未使能或波特率不匹配 | 检查bus.enable_torque()是否执行,确认两端都是 1M |
| 读数在 2048 附近正负乱跳 | ST3215 的 Phase 寄存器 bit 4 未清 | 连接时跑bus.configure_motors(),它会自动处理 |
COMM_RX_TIMEOUT频繁出现 | 波特率猜错或 USB 线质量差 | 重新跑 find_port 定位端口,换根短线试试 |
Incorrect status packet! | 多关节同时运动时状态包损坏 | 把num_read_retries调到 2~3,失败立即重试不睡眠 |
| 校准后角度整体偏移 | Homing_Offset 写错或机械零点变了 | 重跑lerobot_calibrate.py并确认摆正中点再回车 |
| 控制周期抖动 | 默认 500µs 响应延迟叠加在轮询上 | configure_motors(return_delay_time=0)压到 2µs |
进阶调优两条,都在 src/lerobot/robots/so_follower/config_so_follower.py 里:
默认 PID 增益是
P=16, I=0, D=32,连接时写入 ST3215。关节发飘(超调震荡)就调大 D;追不上快速动作就调大 P,一次只动一个参数。
num_read_retries只在读失败时触发、无额外睡眠开销,所以放心加大;如果你用的是协议 1 的 SCS 系列舵机,sync_read不可用,别指望这招。
下一步——从能跑到跑好
- 用 SO-100 主从臂遥操录数据,参考 examples/so100_to_so100_EE/teleoperate.py,跑通"人示教→存数据集"的完整闭环。
- 想搞清观测怎么归一化、怎么喂给策略,顺着 src/lerobot/processor/normalize_processor.py 读一遍处理管线。
- 手上是别的 Feetech 型号(sts3250、sm8512bl)?照 docs/source/integrate_hardware.mdx 往 tables.py 加一张表,多数情况只需补几个字段。
到这里,ST3215 从串口号、寄存器表到标定的整条链路你都亲手摸过了,机械臂该动就动、该稳就稳。把仓库 clone 下来照上面五步跑一遍;遇到表里没有的型号或诡异的跳变,去 issue 区提你的场景,或者给 tables.py 提个 PR。
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考