
手上这台机器人已经跑了三个月累计拆装不下二十次从最初的一堆舵机到现在能做出“慢速直行—原地转向—单腿微抬”这一套动作中间踩过的坑比想象中多得多。这篇博文就围绕“中配低成本类人机器人”展开把机械结构和电子系统两部分彻底拆开讲清楚。先交代一下“中配”是什么档位。低配是网上最常见的四轴六轴玩具只有头、手能转脚是摆设高配是带力控、几十个自由度、一套下来上万甚至几十万的工程样机。而我做的这一版定位在两者之间身高70厘米左右全身22个自由度理论成本控制在三千元上下用市面上最容易买到的MG996R和MG90S舵机配合STM32主控和PCA9685舵机驱动板。这个配置足够研究步态规划、重心控制和基本姿态反馈又能控制返工成本和调试复杂度。如果你也打算从零开始做人形机器人这篇文章可以直接照着抄作业。1. 整体设计思路与自由度分配1.1 中配方案到底指什么做类人机器人最忌讳一上来就追求“全都要”。我见过很多朋友第一次规划就打算做26甚至32个自由度结果钱包扛不住装配调试也扛不住最后烂尾。人形机器人的自由度数决定的是动作上限但同时也直接决定结构复杂度、电源功率、代码规模和调试难度。这版中配方案全身上下22个自由度头部2个、双臂各6个肩2肘1腕3、腰部2个前后/左右倾斜、双腿各6个髋3膝1踝2。相比高端方案的每只手都单独做五指自由度这版把腕部的复杂动作简化成俯仰、偏摆两个方向省略手指和脚趾。省下的费用和调试精力全部投入到腿部的稳定性和姿态控制上——对人形机器人来说能站稳、能走起来才是核心价值。1.2 自由度怎么分配最划算自由度分配的核心标准是“每个舵机都得有不可替代的作用”。检验方法是如果某关节砍掉之后仍然能完成核心动作那这个自由度就该砍掉。我的实际分配逻辑是这样的部位自由度舵机选型核心作用头颈2MG90S x2左右转头、上下点头双臂12肩/肘用6个MG996R腕用6个MG90S挥手、抓取演示腰部2MG996R x2重心调节、上身倾斜补偿双腿12髋/膝/踝均用MG996R髋前后和膝可考虑双机构站立、重心转移、步态移动其中双腿以髋关节的3个自由度最为复杂俯仰前后踢、偏摆左右开合、旋转大腿扭转。中配方案里我给髋关节的俯仰和膝关节做了“双舵机并联”其余都是单舵机。这个细节直接决定了机器人是稳稳站着还是不可控地劈叉后面机械结构章节会细讲。1.3 一体化骨架对后续升级很关键自由度分配完就要确定骨架方案。很多人习惯先买舵机再找外壳结果材料到了发现尺寸对不上。我建议反过来先画一版简化的人体比例图梳理每个关节之间的连杆长度再去采购舵机和结构件。这版设计的人体比例参照了7头身简化模型整机高70cm大腿30cm、小腿25cm、脚掌15cm髋部到肩部大约20cm。为什么大腿要比小腿长因为大腿短、小腿长时走路会显得僵硬重心起伏大大腿略长则步态更接近人类姿态规划也更容易。实际加工时还要注意大腿和小腿的连杆不是简单直线而是带有“膝关节偏置”——为避免弯腰时大腿与小腿的舵机摇臂干涉膝关节处应留出2到3厘米的偏移空间。2. 机械结构材料选型与关节设计2.1 骨架材料怎么选中配机器人不建议一上来就用碳纤维或全金属加工成本高且一旦尺寸误差返工就是钱。我自己用的是“3D打印铝合金板材混合结构”主体骨架大腿、小腿、上臂、前臂用PLA打印壁厚设计在3mm以上必要时内部加十字筋板。PLA比普通PLA韧性好不容易在舵机振动下开裂骨盆、肩部这类受力集中且需要高精度的位置用2mm厚6061铝合金板材CNC切割或线切割安装孔位公差控制在±0.1mm脚板用3mm铝合金板底面贴防滑胶垫兼顾重量与抓地力。为什么不用全金属一个很现实的原因是重量。金属大腿虽然稳但会让髋关节舵机长期过载走不了几步就开始发烫。3D打印件虽然强度不如金属但在中配这个负载量级下配合筋板设计完全够用。还有一个容易被忽略的点打印件要预留舵机安装孔和走线槽。打印前务必确认舵机耳朵的孔径与螺距多数MG996R用的耳朵孔是2.5mm直径螺丝选M2或M2.5孔径要留0.2mm余量否则打进去直接胀裂。2.2 关节尺寸与扭矩计算关节尺寸不是拍脑袋定的每个舵机承受多少扭矩必须先算清楚否则做出来就是个“站立即瘫”的模型。这里以髋关节为例教你估算单腿总质量估算大腿350g、小腿300g、脚板及传感器100g合计约750g单腿质心到髋关节的力臂近似取大腿中部偏下约25cm静载扭矩 ≈ 0.75×9.8×0.25 ≈ 1.84N·m约18.8kg·cm考虑步行摆动时的冲击和加速度通常乘以2.5到3倍的安全系数峰值需求约47到56kg·cm。单个MG996R的标称堵转扭矩约11kg·cm6V供电时显然不够。所以髋关节俯仰和膝关节采用双舵机并联两个舵机加一起有效输出大约24kg·cm配合减重后的腿部结构刚好压住静态站立和慢速步态的峰值。如果你觉得余量不足预算再宽裕一点可以直接上DS321820kg·cm级单电机就能覆盖需求结构也更简单。2.3 关节组装的三个关键细节第一个细节是舵机安装方向。以膝关节为例单舵机方案的舵机输出轴必须指向身体内侧朝外的一侧加装限位挡片这样既减少干涉又能让走线贴近骨架。双舵机并联时两个舵机要镜像安装输出轴通过双孔联动臂合并到一个旋转点上。联动臂买现成的“U型舵机延长支架”自己打印也行但要注意两个舵机的中位角度必须一致否则互相别劲。第二个细节是线缆管理。所有舵机线束走骨架内侧每隔5厘米用扎带或热熔胶固定一次。关节处要预留足够的活动余量我建议在转轴位置留出一小段弹簧式预弯避免转动时线缆被反复拉扯导致内部断芯。舵机线头是3pin杜邦头装配过程中特别容易被压断或拉脱最好在最外侧加一层螺旋保护管。第三个细节是腕部和踝部这种小空间关节。不要直接用舵机本身固定输出先在舵盘和连杆之间加0.5mm垫片消除轴向虚位再用螺丝胶中强度243锁死机械螺丝。这一步能明显减少“机器人在那站着手腕自己在抖”的尴尬情况。3. 电子系统舵机、主控与供电3.1 舵机选型和PWM原理中配方案最核心的选型就是MG996R和MG90S的组合。MG996R是标准尺寸金属齿舵机工作电压4.8V到7.2V标称堵转扭矩约11kg·cm适合腿部和肩部这类高载关节。MG90S是微型金属齿舵机扭矩约1.8kg·cm适合头部和手腕。两条线的共同点是价格便宜、坏了对换成本低缺点是精度一般标称死区约5微秒但中配阶段完全够用。舵机的控制原理说穿了就是用PWM脉宽控制角度。常规舵机接收50Hz的PWM信号周期20ms脉宽1ms对应0度1.5ms对应90度2ms对应180度。MG996R实际可调范围约500到2500微秒对应约0到180度。控制核心在STM32里做的事很简单计算每个关节的目标角度换算成对应的脉宽数值通过I2C总线写入PCA9685驱动板由驱动板生成精确的PWM波。PCA9685是16路PWM驱动芯片12位分辨率意味着每路脉宽有4096个细分档位。常用的设置如下内部时钟25MHz50Hz频率时计数范围是0到4096这时代码里“脉宽375”就对应90度1.5ms具体映射表我们可以通过实测校准确定不建议直接套网上模板因为不同厂家舵机存在个体差异。3.2 主控方案为什么选STM32而非树莓派中配机器人不建议拿树莓派当主控。树莓派本身需要5V/2A电源开机慢实时性也容易被系统调度抢占。对舵机控制这种周期性任务最合适的反而是具备定时器中断和硬件I2C接口的单片机。我用的主控是STM32F103C8T6蓝丸板主频72MHzFlash 64KB价格30元左右。它的优势在你的上层程序可以完全控制每个定时器中断保证舵机刷新是严格50Hz稳定输出同时自带多个UART可以接串口命令调试、连蓝牙模块甚至接无线手柄接收器。实际接线图非常清晰STM32 PA0-PA1 / 或I2C1PB6、PB7接PCA9685控制板的SCL/SDAPCA9685供电从主供电源接入板载稳压会输出5V给逻辑部分MPU6050姿态传感器接在另一组I2C接口如PB8、PB9串口1接USB转TTL模块用来打印姿态数据和接收上位机指令。如果你完全没接触过STM32可以先从Arduino兼容板开始跑通逻辑再迁移到STM32但不管哪种最后的舵机刷新频率和中断优先级一定要做成高优先级否则舵机容易出现“卡顿感”。3.3 电源系统怎么分配电源是整个项目最容易被轻视、也最容易出事故的环节。中配方案22个舵机如果共用一颗降压模块舵机启动瞬间会让电压跌落轻则STM32复位重则舵机抽搐、伤到塑料齿轮。我的电源架构分三路用电器电压/电流来源主控STM32、MPU60505V/2A独立5V降压模块UBEC 5V/3A舵机总线6V/10A可调降压模块大功率BEC电池直供前先过保险丝辅助传感器超声波、灯带等5V/1A同主控电源串口隔离电池方面我用了一块3S 2200mAh锂聚合物电池满电12.6V通过一个可调降压模块输出6V给舵机。MG996R标称最高7.2V但长时间顶着高压跑发热严重降到6V后在扭矩和发热之间比较均衡。注意所有降压模块负极要共地且主控电源和舵机电源完全分开——这是一条铁律共用电源会让舵机噪声通过地线直接干扰单片机IO口轻则姿态误判重则程序跑飞。还有一个容易踩的坑舵机电源入口处要并联大容量电解电容我用的是两个1000μF/16V并联并在每个舵机信号线靠近驱动板端串一个100Ω电阻。前者吸收尖峰后者能明显抑制舵机线缆干扰。整体电源线用AWG16或更粗的硅胶线不要用细杜邦线直接引大电流否则线上压降足以让远端舵机欠压抖动。3.4 传感器与扩展接口只用舵机同步动作做出来的机器人本质上是个“盲人”。加传感器不是为了炫技是为了让机器人感知自己到底是直立的还是已经前倾了。这版机器人我加了三个模块MPU6050六轴传感器三轴加速度三轴陀螺仪安装在骨盆正中心位置用来解算机身倾角和角速度脚底压力传感器用薄膜压感片或自制的应变片桥放在脚板前后两端判断重心是否在支撑多边形内HC-SR04超声波或VL53L0X激光测距安装在胸前正中用于前方障碍物距离检测给步态规划提供“停/走”信号。传感器姿态数据的处理上强烈建议做数据融合不要直接用原始加速度值求倾角。零速静止状态下加速度计数据抖动大典型滤波方法是“互补滤波”把陀螺仪积分得到的高频姿态与加速度计得到的低频姿态以一定比例融合。核心公式简化示意float angle 0.98 * (angle gyroRate * dt) 0.02 * accelAngle;这个0.98/0.02的比例可以根据实测调整。比例太偏向陀螺仪角度会漂太偏向加速度计数据噪声大。我调试后固定下来是0.985。4. 实操组装、接线与初调4.1 舵机中位校准组装完成后的第一次上电第一件事不是让它站起来而是校准所有舵机的中位。这一步如果跳过后面所有步态数据都会偏。校准方法是先用上位机或串口发指令让所有通道输出1.5ms脉宽即90度位然后手动挑选舵机的舵盘位置使其带动连杆指向“零位”方向。装舵盘时先不给舵机通电手动转到中点附近再锁紧螺丝这能避免上电瞬间舵机猛跳到机械限位处把齿轮崩断。我踩过最惨的一次忘记校准膝关节上电后一条腿直接踢到前胸把髋关节固定件干裂了。所以要养成习惯每次装完一个关节在主控程序里先执行一次全关节中位测试脚本确认无异常再装配下一个关节。中位校准完成后还需要让每个舵机记住自己PCA9685通道号和角度映射关系。我用一个结构体数组把所有关节配置固化在代码里typedef struct { uint8_t ch; // PCA9685通道 float midOffset; // 中位偏移单位/度 float minAngle; // 机械限位最小角 float maxAngle; // 机械限位最大角 } JointConfig;机械限位角千万要在结构设计时就确认好否则舵机转到位后继续憋力轻则齿轮扫齿重则烧驱动或拉断打印件。4.2 底层驱动代码怎么组织PCA9685的驱动网上有很多现成封装但我的经验是不要直接抄大而全的库只保留自己需要的函数代码量小、调试也直观。核心初始化代码如下// PCA9685地址默认0x40 PCA9685.begin(0x40); PCA9685.setPWMFreq(50); // 50Hz周期20ms // 脉宽换算函数输入角度输出PCA9685计数 uint16_t angleToTicks(float angle) { // 90度为3751.5ms每度对应约2.5个tick return (uint16_t)(375.0f (angle - 90.0f) * 2.5f); }这里2.5这个系数要实测校准发一个90度脉宽用示波器或直接观察舵机是否对准中位不行就微调系数。不同厂家的MG996R响应范围有差异我用几只测出来的系数在2.4到2.6之间。姿态数据读取也比较简单前提是正确处理I2C地址和寄存器// MPU6050地址0x68 MPU6050_Init(); MPU6050_GetData(ax, ay, az, gx, gy, gz);上电后MPU6050需要静置2秒完成寄存器校准代码里要加上这个延时否则前几百组数据全是歪的。对STM32硬件I2C如果调试不顺可以选择软件模拟I2C稳定性和输出速度都够用而且能绕开I2C外设的时序坑。4.3 上电五检与第一次站立测试第一次让机器人站起来我的习惯是执行“上电五检”每一条都不过关就严禁通电检查每个关节的机械位置是否在中位附近并确认无干涉检查电池电压和两组降压模块输出是否正常舵机端6V、主控端5V用串口查看MPU6050姿态数据是否在水平放置时接近0度手动把所有关节搬到“待机位”双膝微屈、手臂自然下垂、重心压低第一次上电必须手扶机架或把机器人的髋部用绳子吊住防止突然跌倒损坏结构。完成五检后第一次“站立”目标不是直腿站而是“微蹲站”。双膝弯曲约10到15度髋关节略微前倾把整体重心降低到接近脚掌中心。这种姿态下对舵机误差和结构虚位的容忍度高得多。测试时观察三件事机身是否明显抖动、脚底压力是否基本均匀、MPU6050的俯仰角是否稳定在几度以内。如果脚底压力某一侧明显偏大说明重心投影偏移直接调整骨盆位置的电池位置来配重比调步态参数快得多。4.4 从站立到慢速步态的调试顺序站立稳定后不要急着写完整的走路步态。我的调试路径是“起身-微蹲-重心转移-抬脚-落脚-单步”六步走第一周只做起身和微蹲让机身习惯重心变化重心转移站立状态下控制髋侧向移动把重心平移至左腿上观察右脚是否可微抬抬脚测试在重心完全偏向右脚的瞬间控制左腿髋和膝做小角度抬升先2厘米保持1秒后放下单步完整流程重心转移→抬脚→摆腿→落脚→重心回中每一步切换之间至少留500ms缓冲时间。动作切换之间的缓冲时间是起步阶段最重要的参数。过快切换会让舵机瞬间吃大电流也会让姿态控制器来不及修正直接摔倒。我建议每步动作之间至少延时300ms整套动作执行周期不低于2秒先把“慢得看起来像树懒”的步态跑顺再逐步提速。5. 常见问题与排查实录5.1 舵机抖动、复位与过载我实测下来这三个问题八成以上是电源问题。舵机抖动多半是电源电压在舵机负载瞬间跌落导致的。检查顺序是先用万用表测舵机端电压如果摆动时低于5.5V就换更大电流的降压模块或者在舵机总线上并联更大容量的电解电容。如果电压稳定但依然抖检查信号线是否过长或与舵机电源线捆在一起信号线加100Ω电阻或独立走线都能缓解。机器人上电瞬间猛跳一下就复位通常是PCA9685在上电初期输出不确定电平导致的。解决方法是主控程序里在初始化I2C之前先把PCA9685的OE输出使能引脚拉高并接一个10kΩ上拉电阻等初始化完成后再拉低使能输出。这个方案是我后期加上的实测能消除90%的上电猛跳问题。舵机发热严重尤其是膝关节这种持续承重的关节第一步先考虑机械问题齿轮是否卡阻、连杆预紧力是否过大、双舵机并联时是否互相别劲。排除机械原因后如果只是发热但不剧烈可以把舵机电压从6.5V降到6.0V减少热损耗代价是扭矩略微下降。中配方案本来就是性能紧平衡动作设计时尽量避免长时间大角度弯腿急停。5.2 姿态漂移与零点漂移MPU6050的姿态角漂移几乎每个做机器人都会遇到。表现是开机静止时角度是0过两分钟变成2度再过五分钟更大。这不是硬件坏了而是陀螺仪零点偏置没有校准。解决分两步第一步上电后抓取前500组数据求平均作为零点补偿量之后每组数据都减去这个零偏第二步姿态解算中把陀螺仪积分结果与加速度计结果做互补滤波抑制积分漂移。还有一点容易被忽略MPU6050的安装方向必须精确对齐机身坐标轴差哪怕1度实际站立时候的姿态都会显得歪斜。安装时用直角三角尺校准不要目测。5.3 典型问题速查表现象可能原因排查与解决某个舵机完全不动信号线松动/通道配置错误先替换舵机验证再查PCA9685通道号所有舵机上电猛跳输出使能未在初始化前关断OE脚先拉高初始化完成再拉低腿部舵机频繁过载双舵机并联不同步校准两舵机中位并检查联动臂间隙站立后持续往一侧倒重心偏移或左右腿长度差异调整电池配重检查左右连杆实际长度差姿态数据噪声大电源地线干扰或传感器固定松动独立电源地共点MPU6050与机架减震连接步态执行卡顿刷新频率不稳定/中断被占用把PWM刷新放到最高优先级定时器中断5.4 几个避开返工的小技巧分享几个实操过程中积累的小技巧能帮你少拆几次机。第一给每个舵机做标签。拆卸时最容易搞混线序和通道我就吃过亏装完发现膝关节和髋关节信号线插反机器人站起来时大腿往反方向别。做法很简单每根舵机线两头贴标签纸标注“左腿-髋-俯仰”。这个习惯在后期拆装维护时能省大量时间。第二紧固件用“两次锁紧法”。装配时第一次先拧到六成紧调整好关节对中后再锁到八成紧不要一次拧到死。打印件上的螺孔一旦滑丝几乎没法修复只能换件重打。第三姿态数据一定要写日志。每次调试步态时把MPU6050的姿态数据和右脚压力数据通过串口打印并记录到电脑跑完一组就能回放数据判断到底哪一步重心转移不到位。这种回溯分析比肉眼盯着机器人猜原因高效太多。第四舵机信号线和电源线在关节处不要并行走线。信号线贴近舵机电源线时舵机电流冲击的磁场会在信号线上感应出毛刺表现出来就是舵机偶尔自己动一下。走线时让信号线走骨架另一侧交叉处尽量成90度。6. 后续还能怎么扩展当这套22自由度平台能稳定完成慢速步态后再往上走的方向其实很多。可以把脚底换用真正的FSR力传感器阵列配合重心控制算法让机器人在受到外部推力时能主动迈步保持平衡——这一步开始进入动态平衡的范畴。也可以增加一个ESP32做上位机通过WiFi接收手机控制指令底层STM32负责实时舵机控制主从架构对学习来说也很友好。如果想走视觉路线在头部加一个USB摄像头用边缘计算模块识别地面标记物引导机器人朝标记方向前进这就把“感知-规划-控制”的完整链路打通了。不过要提醒一句扩展功能前一定要先把基础平台调稳。我这个机器人目前依然不会连续动态行走只在慢速静步态下可靠工作距离“类人”还很远。但正是这种“勉强能走、随时会倒”的状态逼着我把很多底层问题搞清楚——舵机扭矩的瓶颈、重心转移的时序、传感器噪声的表现这些经验是从任何案例或视频里都学不到的。我把这些原原本本记录下来也是想告诉你中配预算做个能站稳的机器人一点都不丢人它是一个足够扎实的起点。