
去年年底我把自己那台积灰半年的3D打印机重新掏出来不是为了打手办而是刷到一个开源双足机器人视频后彻底没睡着。市场上能买到的类人机器人要么是几万块起步的科研开发平台要么是几百块只会原地扭的玩具真正卡在中间的能站稳、能走两步、还能自己改结构的档位基本只能靠手搓。所以我决定按中配的思路做一台低成本类人机器人18个自由度、身高约45cm、总成本压到两千多块能完成稳定步行、蹲起、挥手这几个标志性动作。这篇内容就是整个项目从机械结构到电子系统的完整拆解适合手里有一台普通3D打印机、愿意折腾舵机控制和串口通信、想从零把人形机器人真正立起来的玩家。我在整个项目里反复确认过一件事做类人机器人最难的不是某个单点技术而是机械、电子、控制三个环节互相制约。结构设计得再好供电一塌糊涂照样抖成筛子舵机力量再大重心位置不对照样迈一步就摔。所以这篇不打算只贴图纸或只讲代码而是把整条链路放在一起讲顺带把我踩过的坑和排查逻辑一并写出来。1. 为什么选中配路线预算分配与整机指标1.1 高配、中配、低配的本质差异先说清楚中配到底指什么。高配方案一般指谐波减速器、无框力矩电机、定制伺服驱动器、碳纤维结构件这一整套单关节成本就要上千整机下来几万起步这个成本不是个人玩家能承受的。低配方案则是玩具级舵机加塑料壳力量小、精度差、控制逻辑几乎没有只能做做遥控动作谈不上自主步态。中配方案的核心是用工业级方案的架构思路搭配消费级零部件。关节执行器用数字舵机主控用单片机加轻量级上层的组合结构件用3D打印和碳纤维板混合传感器保留IMU和电位器反馈。这样整机成本能控制在两三千元但控制架构、自由度布局、电源设计都是正经路子后面想升级随时可以替换子模块。这几档方案的差距最直观地体现在关节扭矩上。高配关节输出扭矩轻松做到几十牛米中配舵机大约能达到0.3~1.5牛米低配玩具舵机基本不到0.1牛米。差一个数量级能支撑的结构尺寸和动作复杂度就完全不同。1.2 整机指标自由度、尺寸、续航的取舍做之前我先把目标参数钉死避免边做边拍脑袋改方案。参数项目标值说明整机高度约45cm尺寸越小舵机负载越低但传感器安装空间也越小总自由度18双腿12 双臂6暂时不做手指和腰转整机重量约2.5kg含电池控制在3kg以内续航30分钟以上3S 2200mAh锂电池兼顾重量与续航步行方式静态稳定步态先做稳定不做动态步态负载能力自支撑小幅度挥手不做负重搬运自由度分配是类人机器人区别于普通四足机器人的关键。双腿每侧需要髋关节三个轴向前后摆、外展内收、旋转、膝关节一个前后摆、踝关节两个轴向前后摆、外展内收这就已经是每侧6个自由度。双臂每侧做肩部两个、肘部一个共6个。头部的转向和腰部的旋转我暂时砍掉了等基础步态跑通后再加。这里必须有取舍意识自由度多不等于好。每多一个自由度就多一路PWM信号、多一份供电压力、多一组运动学计算量。中配方案的原则是先能走再谈花活。2. 机械结构设计从骨架到关节的工程决策2.1 骨架方案为什么不用纯3D打印也不全上金属件很多人第一版喜欢全机身3D打印图纸画得挺漂亮装完一通电膝关节咔吧一声断了。原因很简单PLA材料的层间结合强度只有注塑件的三分之一左右细长的腿部结构件在受力方向恰好与层纹平行极易分层断裂。我的做法是3D打印外壳碳纤维板骨架的混合方案。用2mm厚的碳纤维板来加工大腿、小腿和躯干主支撑板这些部件需要承载弯矩和剪切力碳纤维板强度高、重量轻、加工方式也简单勾刀加台钻就能搞定。3D打印则负责舵机支架、外壳、脚掌缓冲件这些形状复杂但受力不集中的部分。碳纤维板加工有个细节值得说切割时用勾刀沿着画好的线多次划刻然后掰断再用砂纸打磨边缘钻孔时一定要垫一块废木板防止出口处撕裂。孔径不要一开始就钻成最终尺寸先用小钻头定位再换最终尺寸的钻头扩孔这样舵机安装孔位才能对得准。2.2 关节结构舵机直接驱动还是加连杆关节驱动方式直接决定了整体结构复杂度。原先我想过用四连杆机构来模仿人体关节的旋转中心但实际算下来腿部这个小空间里塞四连杆对加工精度要求太高配合间隙一多整个关节就松松垮垮。最终选择的是舵机直接驱动方案舵机输出轴直接连接下一段结构件。这种方式的优点是结构简单、装拆方便、齿轮间隙小缺点是关节处要承受弯曲力矩对舵机输出轴的强度要求比较高。为了解决这个问题我在所有承重关节的舵机尾部增加了一个辅助支撑轴承座让结构件骑在舵机外壳上而不是悬臂受力。这个小改动极大减少了舵机输出轴的径向负载也延长了舵机寿命。髋关节和肩关节这类靠近重心的关节我特意选用了双输出轴设计的舵机两侧同时出轴可以两侧都固定支撑刚性会好很多。2.3 扭矩估算让选型不再靠猜选舵机之前必须做的一步是扭矩估算。简化公式是[ \tau m \times g \times L \times S ]其中 ( m ) 是关节需要支撑的质量( g ) 取9.8( L ) 是该质量中心到关节轴的水平距离( S ) 是安全系数通常取2~3。以膝关节为例在单腿支撑相单膝要承受整机约2.5kg的重量假设脚底到髋关节的质心水平距离最大约0.08m代入公式[ \tau 2.5 \times 9.8 \times 0.08 \times 2.5 \approx 4.9,\text{N·m} ]而常见的MG996R金属舵机标称扭矩约为9.4kg·cm换算过来约0.92N·m完全不够。所以我给髋关节和膝关节使用的是标称20kg·cm级别的舵机单关节输出约1.96N·m再配合迈步时的动态冲击考虑依然略显紧张但配合步态控制中的缓冲处理是够用的。腕部和肘部这类低负载关节则使用9g级别的舵机即可没必要大马拉小车。选型结论我列成了表方便对照关节位置舵机级别数量说明髋关节前后摆/外展20kg·cm金属舵机4整机承重核心髋关节旋转20kg·cm金属舵机2负责转向负载不小膝关节20kg·cm金属舵机2步行时力矩最大踝关节15kg·cm金属舵机4支撑与姿态调整肩关节15kg·cm金属舵机4挥手、平衡辅助肘关节9g舵机2仅做展示动作3. 电子系统搭建主控选型、驱动扩展与供电设计3.1 主控架构树莓派Zero 2 W加ESP32的双层结构我看到很多人做类人机器人只用一块Arduino或者ESP32把所有事情都塞进去结果走路时既要算运动学又要处理传感器数据主控卡顿舵机信号出现抖动机器人直接原地抽搐。我采用的方案是树莓派Zero 2 W加ESP32的双层主控各干各的活。树莓派Zero 2 W跑Linux系统承担上层逻辑视觉识别、语音指令、路径规划这些重运算任务。ESP32作为下位机专门负责实时性要求高的活儿读取各个舵机当前角度、控制PWM输出、处理IMU中断、执行步态时序。上下位机之间通过串口通信通信协议用简单的文本帧格式比如#IK 1表示切换站立模式#MOVE 0.5表示前进速度0.5。这个架构最大的好处是实时性有保障。Linux系统在负载高时可能延迟几十毫秒这种延迟对舵机控制是致命的而ESP32在独立运行时PWM周期可以做到完全稳定。3.2 舵机信号扩展PCA9685的坑与替代18路舵机如果直接接ESP32IO口数量肯定不够所以需要PWM扩展芯片。PCA9685是多数人最先接触的方案16路12位PWM输出可以用I2C总线级联两个正好覆盖18路。实际用下来有个问题值得注意PCA9685的输出频率在50Hz时舵机控制信号的脉宽分辨率只有大约0.4微秒左右如果用市面上某些引脚带死区的舵机会出现低速时一顿一顿的现象。我最终改成了PCA9685输出信号只做舵机角度索引让舵机本身的电位器闭环参与到位控制抖动问题才真正缓解。如果重来一次我可能会直接选自带串行总线控制的串行总线舵机比如LX-16A这类直接用TTL串口串接省掉所有PWM线路还能直接读回当前角度。但当时为了控制成本还是用了传统PWM舵机加PCA9685的组合也算走通了一条性价比路线。3.3 供电设计一次压降事故换来的教训这是整个项目里教训最深的部分必须单列出来讲。舵机的工作电压多数是6V但18路舵机同时动作时的瞬时电流非常可观。我实测过单只20kg·cm舵机堵转电流可以到2A以上即使正常动作瞬间电流也在800mA左右。如果10路舵机同时动作瞬时电流能拉到8A甚至更高。最开始我用一个XL4015降压模块从3S电池降压到6V结果一走路就出现两个现象一是舵机全部抖动、动作没力二是树莓派偶尔重启。原因很直接XL4015模块的标称输出电流是5A但多个舵机同时索取电流时降压模块进入过流保护或者电压跌落到5V以下舵机内部控制板供电不足就会产生PWM误触发抖动随之而来。后来我把供电改成了两路独立一路用XL4015降压到5V专供树莓派和ESP32树莓派要求的5V/2A左右电流完全够用另一路直接把3S电池的11.1V接到一个DC-DC降压模块设置输出6V专供舵机同时加了两个2200μF电解电容做储能缓冲。舵机供电输出电流能力至少要达到10A以上所以不能用普通的降压模块而是选了大电流的BEC模块或者开关电源模块。实际改完后的效果立竿见影之前频繁出现的抖舵现象基本消失树莓派也不再莫名重启。电源是机器人的心脏这块绝对不能省钱。3.4 传感器IMU、舵机电位器与足底检测类人机器人比四足机器人更需要姿态感知。四足机器人随便倒一下可以自己翻过来双足机器人一旦摔倒姿态传感器数据就全乱了所以IMU是刚需。我用的是MPU6050通过I2C接口连接到ESP32以200Hz采样率读取三轴加速度计和陀螺仪数据在程序里用互补滤波融合出机器人的横滚角和俯仰角。舵机电位器反馈也要利用起来。传统PWM舵机内部本身就有一个电位器舵机控制板通过它形成位置闭环。如果我们想读取当前关节角度最简单的办法是用ADC测量舵机信号线上反馈出来的电位器电压但这对舵机内部电路改造要求较高。中配方案里我没有对舵机做太深改造而是通过PCA9685记录下发的目标角度结合IMU间接判断实际姿态这样对新手来说更容易上手。足底检测我是用薄膜压力传感器贴在脚掌前部和后部通过分压电路接到ESP32的ADC引脚。当机器人迈步时程序检测前后脚掌的压力差来判断重心是否落在支撑面内避免了只靠开环位置控制导致的前倾摔倒问题。4. 控制逻辑落地从关节角度到稳定步态4.1 舵机控制频率与通信协议设计舵机控制的底层逻辑是给特定脉宽的方波信号常见的模拟舵机需要50Hz的PWM信号脉宽范围在500~2500微秒之间中值1500微秒对应中位角度每100微秒大约对应45度转角。ESP32的LEDC外设可以很方便地输出指定频率和占空比的PWM直接输出到PCA9685即可。通信协议我用的是简单的文本帧上位机下发的命令形如#MOVE 30、#SQUAT、#RELAX。ESP32在串口中断中逐行解析匹配到指令后执行对应动作序列。这样做的调试效率远高于二进制协议毕竟可以直接用串口助手发送指令测试。步态执行时最关键的是周期节拍。我设计了一个基于状态机的步态控制器每个状态站立、单脚支撑、摆动相、落地缓冲都有明确的持续时间。例如一个完整步态周期设置为2秒第一步先执行重心转移到右脚左腿进入摆动相整个过程通过IMU数据实时调整膝髋关节的角度补偿。4.2 逆运动学的轻量实现几何法解双腿做双足步行离不开逆运动学。最简单的双脚逆运动学可以用几何法解决完全不需要复杂的矩阵运算。以一条腿为例髋关节位置固定在躯干上脚踝目标位置已知大腿和小腿长度分别为 ( L_1 ) 和 ( L_2 )。从脚踝目标点到髋关节连线可以得到这条连线的长度 ( D )[ D \sqrt{x^2 y^2} ]其中 ( x ) 是脚踝在前进方向上的偏移( y ) 是脚踝在竖直方向上的偏移。然后用余弦定理计算膝关节角度[ \theta_k \arccos\left(\frac{L_1^2 L_2^2 - D^2}{2 L_1 L_2}\right) ]再算髋关节需要转动的角度加上从髋关节到脚踝连线与竖直方向的夹角得到最终的髋关节摆角。把这两个角度转换成舵机PWM脉宽下发就可以精确控制脚踝的位置了。我把这段逻辑固化成了Python脚本来做离线验证给出一系列脚踝轨迹点例如一个正弦曲线的迈步弧线计算出对应的髋、膝关节角度序列再导入到ESP32中执行。实测这套几何法只需要不到100行Python代码就能跑通运算量完全可以由ESP32承担。4.3 静态稳定步态先站稳再走路类人机器人走路的常用策略包括静态稳定步态和动态稳定步态。动态稳定步态像Atlas那种连续跑跳的依靠的是零力矩点ZMP控制控制周期短、计算量大在中配硬件上很难实现因为舵机响应延迟和控制频率都不够。我选择的是静态稳定步态每一步都保证重心投影落在支撑脚的多边形范围内走起来很慢但每一步都稳稳当当。具体实现时把步态周期拆成四个阶段重心转移、抬脚摆动、落脚缓冲、重心归位。在重心转移阶段先通过髋关节外展电机把上半身重心慢慢移到支撑腿上这个过程中摆动腿的脚底压力传感器会检测到压力逐渐减小当压力降低到阈值以下时才允许摆动腿抬离地面。落地时同样通过踝关节角度控制让脚掌先接触地面再缓慢释放落脚速度避免重心突然前冲。这么做的缺点是速度很慢实测前进速度大约只有每秒5厘米。但换来的优点是稳定性和可调试性任何一个环节不对都能通过日志定位出来不会出现整机瞬间摔倒找不到原因的情况。5. 实测调试记录那些让机器人原地抽搐的时刻5.1 抖舵排查供电、信号干扰还是机械共振项目调试过程中抖舵是我遇到最多也最让人崩溃的问题。一开始以为是舵机质量差换了三只新舵机后问题依旧才发现方向完全错了。后来我按下面这个顺序排查最终定位到问题根源第一步测供电电压。把示波器探头接到舵机电源线上观察舵机动作瞬间的电压波形发现电压从6V跌落到4.8V左右且伴随严重的纹波。这个状态几乎可以断定是电源问题。加电容和独立供电后电压稳定在5.9V以上抖舵明显减少。第二步查PWM信号质量。用逻辑分析仪抓PCA9685输出的PWM波形发现脉宽在1500±50微秒之间波动这个波动已经超出了舵机死区范围会造成舵机反复修正、抖动。根源是PCA9685的I2C总线上还挂了IMU和OLED屏幕通信阻塞导致脉宽更新不及时。我把IMU和OLED换到ESP32另一路I2C接口后问题彻底解决。第三步检查机械安装。如果某个舵机输出轴负载过大也能导致齿轮组啸叫和抖动。检查方式是逐个关节空载运转听声音是否顺畅、看动作是否平滑有阻涩感的重新调整安装间隙。排查顺序很关键因为大多数人第一反应都是怪舵机但实际上供电和PWM信号才是抖舵的两大隐形元凶。5.2 为什么机器人总是往前摔还是往后摔第一次让机器人站起来时它几乎每次都在起步前三秒内往前栽倒。用手机慢动作拍摄后确认问题出在重心补偿策略上。我最初设计的站姿是躯干正直两条腿完全垂直于地面。看上去挺稳但实际上当机器人抬一条腿时整个重心已经偏移到支撑脚边缘之外还没等重心转移完成就开始迈步自然往前倒。解决办法是在站立状态下让躯干轻微后仰3~5度把重心压到脚掌中心稍微靠后一点的位置给前方摆动腿留出空间。同时把脚掌设计成前宽后窄的形状增加落地时的支撑面积。还有一个很容易忽略的点是步态时序。如果抬腿动作和重心转移同时进行重心还没完全落到支撑脚上就抬脚必然出现瞬间失稳。我把重心转移时间从原来的0.5秒延长到1秒牺牲了一点点速度但换来的是极高的稳定性。5.3 舵机过热与整机续航的现实连续跑动五分钟后髋关节舵机外壳的温度能到70度以上虽然金属齿轮舵机还能扛住但内部尼龙齿轮已经在软化边缘。我做了三件事一是把步态周期从1.6秒改成2.2秒降低舵机连续高负载运转的频率二是在髋关节舵机支架周围增加散热孔让空气能流过舵机外壳三是加了一个过热保护逻辑当舵机电流连续超过阈值五秒以上会让机器人自动降低重心改为蹲姿避免硬扛。续航方面整机实测电流在站立状态约0.8A走路状态瞬时电流3~5A3S 2200mAh的电池大概能支撑25到35分钟的实际使用。如果后续想提高续航最简单的办法是换更大容量的电池但要注意整机重量会跟着增加又要校核一遍舵机扭矩这又是一个牵一发动全身的事情。6. 核心物料清单与成本汇总6.1 单台样机完整物料表我把所有核心物料的品牌、数量、参考单价整理成了一张表方便照着采购物料项规格/型号数量参考单价元小计元20kg·cm金属舵机常见品牌DS5160级别88568015kg·cm金属舵机LD-1501MG级别4552209g舵机SG90级别21020碳纤维板2mm厚 300×300mm2751503D打印耗材PLA 1kg装260120树莓派Zero 2 W开发板1120120ESP32开发板常规款13030PCA9685模块16路PWM21530MPU6050模块6轴IMU110103S锂电池2200mAh 30C19090大电流BEC降压模块输出6V/10A14545XL4015降压模块输出5V/5A11010其他辅料螺丝、铜柱、线材、接口、电容等若干100100合计约1625元再加上舵机支架打印失败产生的耗材、调试时烧坏的一两个模块总成本大约在1800到2200元区间属于比较典型的中配成本。如果手头已经有部分模块实际投入还能更低。6.2 哪些地方可以省哪些地方绝对不能省先说绝对不能省的项目。第一是承重舵机的质量这个直接决定了机器人站不站得稳也决定了散热和使用寿命杂牌舵机的标称扭矩虚标非常常见实测扭矩可能只有标称的一半。第二是舵机供电模块大电流能力必须留足这不是性能冗余而是基本可靠性的底线。第三是骨架结构件碳纤维板或者铝合金板材的钱不能省纯3D打印的腿部结构在多次步行冲击后开裂是必然的。可以省的项目也很多。外壳完全可以用最便宜的PLA打印甚至不做外壳裸奔调试也行OLED显示屏、语音模块、视觉摄像头都属于锦上添花的部件初期完全可以不配工具方面一把勾刀、一台手电钻、一套内六角扳手就能完成绝大部分装配工作数控加工的钱没必要花。6.3 后续升级方向从中配走向高配这台机器人的设计初衷就是留出升级空间。当前18个自由度中腿部12个自由度已经和不少商业教育机器人持平后续如果预算允许可以按三个方向升级把传统PWM舵机替换成串行总线舵机减少线路复杂度并直接读取角度反馈把腿部结构换成金属CNC件提升结构刚性和精度把静态稳定步态升级为基于ZMP的动态步态这需要搭配更高精度的编码器和更强的处理芯片。一路做下来最大的体会是低成本类人机器人真正值钱的地方不是那一堆舵机整合出来的躯壳而是搭建过程中逐渐建立的系统思维。每次摔倒背后都至少有一个设计缺陷可能是扭矩不足、重心偏置、供电薄弱或者控制时序不对解决一个对整个系统的理解就深一层。如果让我再重做一遍开头我会先把电源方案和关节扭矩校核放在设计的第一天而不是等到实物通电被现实狠狠教育之后才回头补课。如果你也正在计划从零做一台类人机器人我的建议是不要一上来就追求全功能先把单腿能站稳这个最小目标验证透再逐步扩展到双腿步行。舵机选型、供电计算、骨架材料三件事折腾明白了你的机器人就已经超过大部分只是刷视频羡慕的人。