
1. 为什么我要做一台轮腿机器人轮腿机器人这个概念第一次看到的时候我正蹲在工位上刷视频一个两条腿带轮子的小家伙在台阶和斜坡之间来回切换平地滑得飞快遇到障碍就抬腿跨过去。当时脑子里就一个念头这东西把轮式的高效和腿式的越障能力捏在了一起比纯轮式或者纯足式都更实用。后来查了一圈资料发现市面上的轮腿方案要么是高校实验室的大家伙动辄几万块的成本要么是商业产品价格直接劝退。真正适合个人玩家、成本压到千元以内的开源方案少得可怜。这就是我做这个项目的出发点。我想验证一件事用常见的嵌入式硬件和开源工具链能不能攒出一台能跑、能跳、能保持平衡的轮腿机器人而且总成本控制在大多数人能接受的范围内。答案是能。整机物料成本我压到了八百块左右核心控制器用的是一块常见的MCU开发板电机驱动和IMU都是市面上容易买到的模块。代码全部开源结构件用3D打印你只要有台打印机和一把螺丝刀周末两天就能装出一台能跑的样机。这篇文章我会把整个项目的来龙去脉讲清楚。从轮腿的运动学模型怎么建、LQR平衡控制器怎么调、电机怎么选、结构件怎么设计到实际调试中遇到的坑和解决办法全部摊开来说。适合有嵌入式基础、玩过平衡车或者四轴、想进阶做足式机器人的朋友。如果你连PID都没调过建议先找个平衡车项目练手再来看这个。提示这个项目涉及一定的机械加工和电子焊接动手前请确保你有基本的工具和安全意识。锂电池操作务必小心不要短路。2. 轮腿机器人的运动学与控制核心2.1 轮腿构型的选择为什么是两轮加两条腿轮腿机器人的构型其实有好几种。最常见的是两轮加两条腿的倒立摆加腿结构也就是我采用的方案。另外还有四轮加四条腿的、轮腿一体的轮子直接装在腿末端等等。我选两轮加两腿理由很直接零件少、控制维度低、成本可控。四轮四腿的方案虽然稳定性更好但需要协调的关节数量翻倍对控制器的算力要求也高得多不适合低成本入门。具体来说我的机器人每条腿有两个自由度髋关节的俯仰和膝关节的俯仰。轮子直接驱动没有额外的转向舵机转向靠左右轮差速实现。这样整机一共四个主动自由度左轮、右轮、左髋、左膝、右髋、右膝实际上是六个电机。等等这里要纠正一下是六个电机两个轮毂电机加四个关节电机。这个配置在保证基本运动能力的前提下把复杂度压到了最低。为什么不用轮腿一体的结构那种结构把轮子装在腿的末端腿只负责伸缩控制上更接近传统的倒立摆。但问题是轮子需要承受全部的冲击力对轮毂电机的强度要求很高而且腿的伸缩行程有限越障能力打折扣。我选的方案是腿和轮子分开轮子装在髋关节下方腿可以独立摆动。这样在平地上轮子着地腿收起来遇到台阶时腿伸出去撑地把整个身体抬起来。逻辑上更清晰调试也更容易分步进行。2.2 运动学建模从关节角度到轮子位置轮腿机器人的运动学模型不算复杂但必须建准否则后面的控制器全是空中楼阁。我用的是简化的平面模型把机器人投影到侧视图上忽略横向的滚动。每条腿可以看作一个两连杆机构大腿和小腿髋关节连接机身膝关节连接大腿和小腿轮子装在小腿末端。正运动学很简单给定髋关节角度θ1和膝关节角度θ2轮子末端的位置可以通过三角函数直接算出来。我在这里踩过一个坑一开始我把关节角度的零点设在了腿完全伸直的位置结果算出来的雅可比矩阵在奇异点附近数值爆炸控制器直接发散。后来把零点改到了腿自然下垂的位置也就是大腿和小腿呈一定夹角的状态问题就解决了。这个细节在教科书上不会写但实际调试中非常关键。逆运动学稍微麻烦一点因为给定轮子目标位置反解关节角度可能有多组解。我的处理方式是限制膝关节只能向一个方向弯曲这样解就唯一了。具体推导过程我在代码注释里写得很清楚这里不展开公式只说结论对于我的结构尺寸大腿长120毫米小腿长120毫米轮子半径35毫米逆解的计算量很小在MCU上跑一次不到50微秒。2.3 LQR平衡控制器的设计与调参平衡控制是轮腿机器人的灵魂。我试过PID也试过LQR最后选了LQR。原因很简单轮腿系统是一个多变量耦合系统机身俯仰角和轮子位置是相互影响的PID单回路调起来顾此失彼而LQR天生就是处理多变量系统的。LQR的核心是状态反馈矩阵K的求解。我的状态向量选了六个量机身俯仰角、俯仰角速度、轮子水平位置、轮子水平速度、腿的等效摆角、腿的等效角速度。前四个量负责平衡后两个量负责腿的姿态。权重矩阵Q和R的调参是个体力活我的经验是先把Q中俯仰角的权重调大让机器人能站住再慢慢加位置和速度的权重让它在受扰动后能回到原位。这里有个实操心得调LQR的时候一定要在仿真里先跑通再上真机。我用Python写了一个简单的仿真环境把动力学方程离散化步长1毫秒跑个几秒钟就能看出K值合不合理。真机上如果K值不对机器人会直接疯狂抖动或者瞬间倒地很容易烧电机。仿真里试错成本几乎为零这个时间花得绝对值。注意LQR的K值对模型参数很敏感。如果你的机器人换了电机或者改了结构尺寸K值必须重新算。不要直接抄我的参数结构不一样抄了必倒。3. 硬件选型把钱花在刀刃上3.1 主控与传感器够用就好主控我用的是一块STM32F405开发板主频168MHz带浮点运算单元。为什么选它因为LQR和运动学解算都需要浮点运算没有FPU的MCU跑起来会很吃力。F405的价格在三十块左右性能足够社区资料也多出了问题容易找到答案。如果你手头有F103理论上也能跑但控制频率可能要降到500Hz以下平衡效果会差一些。IMU我选的是MPU6050六轴陀螺仪加加速度计。这个模块便宜十块钱以内但它的零漂比较明显直接读原始数据做姿态解算会飘。我的处理方式是加了一个简单的互补滤波陀螺仪积分得到角度加速度计解算得到角度两者按系数融合。系数我取的是0.98和0.02实测下来静态漂移在0.1度以内足够用了。如果你预算充足可以上BMI088或者ICM42688性能更好但价格也翻好几倍。编码器方面轮毂电机自带霍尔编码器精度是每转90个脉冲。对于平衡控制来说这个精度够了。关节电机我用的是AS5600磁编码器I2C接口12位分辨率价格十五块左右。它的好处是非接触式测量没有磨损而且安装方便磁铁贴在电机轴上就行。3.2 电机与驱动扭矩和响应速度的平衡轮毂电机我选的是那种常见的平衡车拆机电机额定电压24V功率大概100W自带霍尔编码器。二手拆机的价格在五十块左右一个性价比极高。它的扭矩对于轮腿机器人来说绰绰有余平地上跑起来很轻松。缺点是重量偏大每个大概500克两个就是一公斤对腿的负载有影响。如果你追求轻量化可以考虑无刷云台电机但驱动成本会上去。关节电机我用的是串口总线舵机扭矩20公斤厘米金属齿轮价格八十块左右一个。为什么不用无刷电机加FOC驱动因为FOC驱动的调试门槛高而且四个关节电机加两个轮毂电机如果全用FOC光是驱动板就要不少钱。串口舵机虽然响应速度慢一些但对于腿的摆动来说够用了。它的另一个好处是内置了位置闭环我只需要发目标角度它自己会转过去省了很多底层代码。驱动板方面轮毂电机我用的是两块独立的MOS管驱动板每块支持20A持续电流价格二十五块。这里要注意驱动板的死区时间一定要设置正确否则上下桥臂直通会烧板子。我一开始没注意烧了两块板才反应过来。关节舵机直接接24V电源通过串口发送指令不需要额外的驱动。3.3 电源与结构件稳定供电是前提电池我用的是6S航模锂电池22.2V容量5000mAh放电倍率25C。这个电池能提供足够的瞬时电流同时重量控制在600克左右。续航方面平地慢速行驶大概能跑四十分钟如果频繁做跳跃动作可能只有十五分钟。电池一定要配低压报警器我设的阈值是3.5V每节低于这个值就赶紧充电过放会永久损坏电池。结构件全部3D打印材料用的PETG。为什么不用PLA因为PLA脆摔几次就裂了。PETG韧性好耐冲击打印温度230度热床80度打印速度慢一点层间结合力更好。大腿和小腿的壁厚我设的是4层填充率30%实测强度足够。髋关节的轴承座用了金属衬套减少摩擦打印件直接当轴承座用的话磨损很快。提示3D打印件的公差要留够。我的经验是孔位比实际尺寸大0.2毫米轴比孔小0.1毫米这样装配的时候不用硬敲也不会太松。4. 从零到一装配与调试的完整流程4.1 机械装配先装腿再装轮最后上电装配顺序很重要我建议先装腿再装轮子最后接电。为什么因为腿的结构比较复杂需要反复调整关节的松紧度如果先把轮子和电子件装上去腿的调试会很碍事。具体步骤是这样的先把髋关节的轴承压入打印件注意方向轴承的外圈要完全贴合。然后把大腿和小腿用膝关节轴连接起来轴用M4螺丝加一个尼龙锁紧螺母拧到腿能自由摆动但不会晃动为止。接着把关节舵机安装到髋关节和膝关节的位置舵机的输出轴要对准关节轴心偏差不能超过0.5毫米否则舵机会一直受力发热严重。轮毂电机用支架固定在髋关节下方注意左右轮的电机线要朝向机身内侧避免运动时刮到腿。IMU安装在机身正中央尽量靠近重心位置并且要保证IMU的X轴和机器人的前进方向一致。我一开始把IMU装歪了结果机器人走起来总是往一边偏查了半天才发现是安装角度的问题。4.2 电气连接与固件烧录电气连接按照电源、主控、驱动的顺序来。电池先接一个XT60插头然后分两路一路给轮毂电机驱动板一路降压到5V给主控和舵机。降压模块我用的是LM2596便宜好用但要注意它的最大电流只有3A舵机同时动作的时候可能会不够。我的解决方案是舵机单独用一个5V 5A的降压模块主控和IMU用另一个小模块互不干扰。固件烧录用ST-LinkSWD接口四根线VCC、GND、SWDIO、SWCLK。烧录之前一定要确认板子的供电正常我遇到过因为供电不足导致烧录失败的情况查了半天以为是芯片锁了其实是电压不够。烧录完成后先不要装轮子让机器人悬空上电看IMU数据是否正常关节舵机是否能响应指令。4.3 分步调试从悬空到落地调试必须分步来不能一上来就让机器人自己站。我的调试流程分四步第一步悬空测试。把机器人架起来轮子离地上电后观察IMU的俯仰角读数用手转动关节看角度变化是否跟预期一致。这一步主要是验证传感器和舵机的基本功能。第二步轮子着地但腿固定。把腿锁死在收起位置只让轮子着地调试平衡控制。这时候机器人相当于一个普通的平衡车LQR的参数可以先按平衡车的经验值来设。如果这一步都站不住后面的腿控制不用想了。第三步腿解锁但轮子不动。让腿可以自由摆动但轮子不驱动用手扶着机器人观察腿在重力作用下是否能保持姿态。这一步是调腿的PD控制器目标是腿能稳定地维持在指令角度。第四步全系统联调。轮子和腿同时工作先低速前进再逐步加速最后试跳跃。跳跃是最难的需要腿在极短时间内爆发力矩同时轮子要配合做缓冲。我调了大概两周才让跳跃动作比较稳定。注意每次上电前都要检查电池电压和接线尤其是舵机的电源线接反了会直接烧舵机。我烧过两个舵机才养成这个习惯。5. 调试中踩过的坑与解决方案5.1 机器人原地抖动IMU滤波没做好第一次让机器人站起来的时候它在地上疯狂抖动像抽筋一样。我一开始以为是LQR参数太激进把K值调小了一半结果抖动减轻了但站不住。后来用示波器看IMU的原始数据发现加速度计的噪声很大尤其是电机转动的时候振动直接耦合到了IMU上。解决方案有两个一是硬件上给IMU加减震我用的是那种软的硅胶垫把IMU和机身隔开效果立竿见影。二是软件上把互补滤波的加速度计权重降低从0.02降到0.01同时把陀螺仪的积分时间缩短。改完之后抖动基本消失了。这个坑让我明白IMU的减震和滤波比控制器参数更重要传感器数据不干净再好的算法也白搭。5.2 腿伸出去收不回来舵机扭矩不够调试腿的动作时我发现腿伸出去之后经常收不回来尤其是机器人倾斜的时候。一开始以为是舵机坏了换了新的还是一样。后来用电流表测了一下发现舵机在收腿的时候电流直接飙到3A超过了它的额定电流。原因是腿的重心在伸出时偏离了关节轴心形成了一个很大的力矩舵机需要输出很大的扭矩才能克服。解决办法是重新设计腿的结构把舵机的位置往机身方向移缩短力臂。同时把小腿的打印件掏空减轻重量。改完之后收腿的电流降到了1.5A左右舵机不再过热。这个经验告诉我结构设计的时候一定要算力矩不能只看舵机的标称扭矩。5.3 轮子打滑导致位置漂移机器人走直线的时候走个两三米就会往一边偏。我一开始以为是LQR的位置环没调好后来发现是轮子打滑。轮毂电机的橡胶轮胎在光滑的地板上抓地力不够尤其是加速的时候左右轮的打滑程度不一样导致里程计不准。解决方案是换了一套软一点的橡胶轮胎增加了胎面的花纹。同时在代码里加了打滑检测如果左右轮的速度差超过阈值就暂时降低位置环的权重优先保证平衡。这个改动之后直线行走的偏差从每米5厘米降到了1厘米以内。5.4 跳跃落地时机器人散架第一次试跳跃的时候机器人落地直接散了腿和机身连接的地方裂开了。原因是落地时的冲击力远超我的预期3D打印件的层间结合力扛不住。后来我把连接处的壁厚从3层加到6层填充率从30%提到50%并且在受力最大的地方加了金属支架。改完之后又试了十几次跳跃没有再出现结构损坏。这个坑让我意识到3D打印件的强度不能只看填充率层间结合力才是关键。打印温度高一点、速度慢一点层间结合会更好。另外受力集中的地方一定要用金属件打印件只适合做非承重结构。6. 开源代码与后续玩法6.1 代码结构说明整个项目的代码我放在了GitHub上主要分三个模块硬件驱动层、运动学解算层、控制层。硬件驱动层负责读IMU、读编码器、控制舵机和电机这部分和具体的硬件绑定换硬件需要改。运动学解算层是纯数学输入关节角度输出轮子位置或者反过来这部分可以复用。控制层是LQR和PD控制器参数在头文件里方便调整。代码里我写了详细的注释尤其是LQR的K值计算过程每一步都有说明。如果你用的是不同的结构尺寸只需要改运动学层的参数重新算K值就行。我还提供了一个Python脚本可以在电脑上跑仿真验证K值是否合理再烧到板子上。6.2 可以继续折腾的方向这台机器人目前能实现平衡、前进、转向、简单的跳跃。如果你想继续折腾有几个方向可以试试。一是加视觉用OpenMV或者树莓派做个简单的巡线或者避障。二是加手臂在机身上装一个二自由度的机械臂做抓取任务。三是改造成四轮四腿稳定性会更好但控制复杂度也上去了。我个人最想尝试的是让机器人学会上下台阶。目前它只能跳过比较矮的障碍遇到连续的台阶还是没办法。这需要更复杂的步态规划和落点控制涉及到模型预测控制算力要求也更高。如果你对这个方向感兴趣可以一起讨论。提示开源项目最怕的就是代码跑不起来。我在README里写了详细的依赖版本和编译步骤如果你按照步骤还是跑不通大概率是硬件差异导致的可以先在issue里搜一下有没有类似问题。6.3 成本清单与采购建议最后列一下我的物料清单给想复现的朋友一个参考。主控STM32F405开发板35元IMU MPU6050模块8元轮毂电机两个100元关节舵机四个320元驱动板两块50元电池和充电器150元3D打印耗材大概50元螺丝轴承等杂件30元。总计大概743元加上一些运费和损耗八百块以内能搞定。采购的时候注意几点轮毂电机买拆机的就行新的太贵没必要。舵机一定要买金属齿轮的塑料齿轮的用不了几次就扫齿。电池买品牌货杂牌电池虚标严重而且不安全。3D打印如果自己没有打印机可以找代打PETG材料的价格大概每克两毛钱整机打印件大概200克四十块钱左右。这个项目我从开始做到能跑大概花了三个月其中大部分时间在调试和改结构。如果你有平衡车的基础可能一个月就能搞定。最难的其实是第一步把平衡控制调稳后面加腿的动作反而顺理成章。我在调试过程中最大的体会是不要怕失败机器人倒了就扶起来参数不对就重新算每一次失败都让你更了解这个系统。