做桌面机器人或者微型机械臂时,很多人常常在上位机、强化学习步态或者运动学逆解(IK)上死磕,却忽略了底层的物理实体。等把模型打印出来一装机,往往发现末端晃动严重、舵机莫名过流发热、甚至运动几十个周期后信号线直接疲劳折断。
很多所谓控制算法跑不稳、Sim2Real 差距大,本质是硬件机构在公差、虚位与走线上埋了雷。这篇记录我在复现 LeRobot 机械臂以及 Open Duck Mini 机器鸭过程中,总结的一套针对 3D 打印结构与串口总线舵机(以常见的 Feetech STS3215 / SCS 系列为例)的装配避坑实录。
一、 核心耗材与工具(BOM)
在开工前,先确认手头的基础件规格。桌面微型结构对紧固件非常敏感,不建议用手拧自攻螺丝直接拧进塑料件。
| 类别 | 规格 / 型号 | 用途 |
|---|---|---|
| 打印耗材 | PETG / PLA-CF / ABS | 推荐使用收缩率低且刚性好的 PLA-CF 作为结构骨架,关节活动件用 PETG |
| 总线舵机 | Feetech STS3215 或 XL430 | 机械臂主关节 / 机器鸭腿部高扭矩节点 |
| 预埋紧固件 | M2.5 / M3 滚花热熔铜螺母(斜纹/网纹) | 提供反复拆卸寿命与抗拉拔力 |
| 辅助支承 | 小型法兰轴承(如 F683ZZ / F684ZZ) | 舵机副轴支承,分担径向力 |
| 线束防护 | 阻燃自卷编织网管(4mm - 6mm)、超柔硅胶排线 | 旋转关节出线缓冲 |
| 润滑消隙 | 阻尼脂(如高粘度干性四氟润滑剂) | 消除齿轮箱反向间隙轻微冲击 |
二、 FDM 3D 打印公差补偿:孔位与嵌件装配
FDM 打印天然存在外壁膨胀和内孔收缩现象。直接按模型标称尺寸切片,热熔螺母放不进,舵机盘卡不紧,强行敲入会导致层间开裂。
1. 切片补偿参数设定(以 OrcaSlicer / Bambu Studio 为例)
- X-Y 孔洞尺寸补偿(X-Y Hole Compensation):
+0.15 mm至+0.20 mm。这能解决内径因塑料融化收缩变小的问题。 - X-Y 外轮廓补偿(X-Y Contour Compensation):通常保持
0.0 mm或-0.05 mm,避免外形配合产生干涉。 - 壁厚(Wall Loops):至少设置 4 层(1.6 mm 以上)。热熔螺母周围如果只有 2 层壁,铜螺母受热挤压时会把外壁顶鼓包甚至烫穿。
2. 热熔螺母开孔设计规范
以标准的 M3 热熔铜螺母(外径 4.2 mm,长度 4.0 mm)为例:
- 3D 模型建模孔径:开
4.0 mm,并留出0.5 mm × 45°的倒角作为预定位槽。 - 开孔深度:至少留出
4.8 mm(深度大于螺母长 15% - 20%),用于容纳烙铁压入时被挤出的熔融塑料废料,防止底部塑料把螺纹堵死。 - 烙铁压入手法:烙铁调至 230 - 260 ℃,轻搭在螺母上,依靠铜件自身导热融化周围塑料沉入,在螺母低于塑料表面 0.2 mm 处收手,立即用金属平块(如轴承外圈)压平定型 3 秒。
三、 消除关节虚位(Backlash)与双支撑副轴设计
桌面机器人的末端抖动,往往不是 PID 没调好,而是多级舵机公差累加后的机械死区。
1. 舵机单臂受力翻车点
很多轻型开源模型为了图省事,将大臂连杆直接锁在舵机主轴舵盘上。这种单悬臂结构会导致舵机内部小轴承承受弯矩,运行几周后内部齿轮轴孔扩孔,末端晃动可达数毫米。
2. 对称副轴承沉孔设计
所有受力关节必须做“主舵盘 + 尾轴承”双向支撑:
- 同轴度保障:打印模型时,主轴安装位与副轴承(如 F684ZZ)沉孔尽量放在同一个打印摆放面上,避免因层间错位导致两端轴线不平行。
- 法兰轴承限位:法兰外边沿用于轴向限位,通过 M3 螺丝加薄垫片顶紧内圈。
- 零间隙预紧:利用弹性垫圈(波形弹簧垫片)在副轴端提供轻微预紧力,吸收轴向窜动。
四、 总线舵机零位标定与串口校准
总线舵机在把臂装上去之前,必须先读取当前编码器位置并锁死零点,否则带电归零瞬间扭力输出极大,容易掰断机械限位件。
以下是用 Python 基于 scservo_sdk 读写总线舵机零位、检测虚位的最小排查脚本:
import time
from scservo_sdk import (
PortHandler,
PacketHandler,
COMM_SUCCESS
)
# 端口配置
PORT_NAME = "/dev/ttyUSB0"
BAUDRATE = 1000000
SERVO_ID = 1
# STS3215 常用寄存器地址
ADDR_TORQUE_ENABLE = 40
ADDR_PRESENT_POSITION = 56
ADDR_LOCK = 55
port_handler = PortHandler(PORT_NAME)
packet_handler = PacketHandler(1) # 协议版本 1.0
if not port_handler.openPort() or not port_handler.setBaudRate(BAUDRATE):
print("串口连接失败, 检查接线与权限")
exit()
# 1. 释放扭矩, 便于手动转动定位
packet_handler.write1ByteTxRx(port_handler, SERVO_ID, ADDR_TORQUE_ENABLE, 0)
print(f"舵机 ID:{SERVO_ID} 扭矩已释放, 请手动转动至机械物理零位...")
try:
while True:
# 持续读取当前真实物理位置 (0-4095)
pos, comm_res, error = packet_handler.read2ByteTxRx(
port_handler, SERVO_ID, ADDR_PRESENT_POSITION
)
if comm_res == COMM_SUCCESS:
deg = (pos / 4096.0) * 360.0
print(f"\r当前读数 Raw: {pos:4d} | 角度: {deg:6.2f}°", end="")
time.sleep(0.05)
except KeyboardInterrupt:
print("\n已捕获位置, 准备锁轴并测试虚位...")
# 2. 重新开启扭矩锁定
packet_handler.write1ByteTxRx(port_handler, SERVO_ID, ADDR_TORQUE_ENABLE, 1)
print("扭矩已开启, 请轻微晃动摇臂, 感受机械齿隙并观察有无跳动")
port_handler.closePort()
装配规则:先上电发指令使舵机回到中位(如 2048),断电,再将机械臂连杆对准水平基准压入舵盘。如果强行靠软件写入 offset 偏置,会导致两侧可动范围不对称。
五、 总线拓扑与线束保护:抗疲劳走线实录
总线舵机采用三线(GND / VCC / RX-TX 半双工信号)串联拓扑。这种接法最大的隐患在于:中间任何一段线折断,其下游的所有关节全部下线。
1. 旋转关节走线避坑
- 禁止做直角折弯:线缆出线口不要紧贴旋转中心,必须留出至少等于线缆外径 5 倍的弯曲半径($R \ge 5D$)。
- 双纽线(扭簧式)走线:在类似机械臂腰关节、机器鸭颈部的 180° - 270° 回转自由度上,严禁让线缆承受轴向拉伸力,应让线束形成一个“U”形环或卷簧形态,使线束通过自身扭转释放转角应力。
[错误示范: 拉扯受力]
(关节转轴) ----[紧绷线束]----> (舵机) <- 极限转角时铜丝内部拉断
[正确示范: U型扭簧余量]
(关节转轴)
|
( U型缓冲环 )
|
(结构固定夹) ----[编织网管收束]----> (舵机)
2. 应力释放点(Strain Relief)
- 3D 打印件上在距离舵机插头 10 mm 处,预留用于穿扎带(宽度 2.5 mm)的沉槽。
- 插头插入后,用扎带将线束根部死死固定在非活动结构上。保证机械运动时拉扯的只是外围包裹层,严禁将拉力直接传递给舵机的 PH2.0 / XH2.54 端子金属卡脚。
- 活动段线束套上阻燃自卷编织网管,防止线皮与 3D 打印粗糙的层纹反复摩擦导致破皮短路。
六、 装配后上电检查清单
在正式跑控制代码前,按顺序完成以下四步硬检查:
- 断电手动滑行测试:断电状态下手动牵引各关节在全行程内运动,手感应顺滑且阻尼均匀;若在某个固定角度阻力突增,说明轴承不同心或孔位打印歪了。
- 接线对地阻抗测量:用万用表二极管档测系统 VCC 与 GND,确认没有由于热熔螺母打穿导致的隐性短路。
- 零扭矩回读测试:释放扭矩状态下,用上位机监控回读的角度数据,手动摆动连杆,确认编码器数据连续无丢步、无跳变。
- 单步微幅阶跃:给关节下发 $\pm 1^\circ$ 的微调信号,观察末端是否立即响应。如果舵机有响声但末端不动,立刻检查舵盘螺丝是否咬紧以及齿轮箱消隙情况。
许可协议:CC BY-NC 4.0
更新于 12 小时前
觉得文章有帮助?点个赞吧!
0 条评论


