资讯动态

800元自制开源轮腿机器人:STM32与LQR平衡控制实战

发布时间:2026/10/29 19:19:52 来源:尧图企业网站定制
1. 为什么我要做一台低成本轮腿机器人轮腿机器人这个词这两年在创客圈和机器人爱好者社区里出现的频率越来越高。它结合了轮式机器人的高效移动和腿式机器人的越障能力听起来很酷但市面上能买到的成品动辄上万即便是DIY方案一套下来也常常要好几千。我自己是从大二开始接触机器人控制的做过平衡车、四足机器人后来看到轮腿这个概念觉得很有意思但一查成本就有点劝退。于是从去年年底开始我给自己定了一个目标用尽量低的成本做一台能跑能跳、能保持平衡、代码全部开源的轮腿机器人。这个项目从立项到基本跑通前后花了大概四个月中间踩了不少坑也积累了一些经验。最终整机物料成本控制在了800元以内核心控制器用的是常见的STM32F103驱动器是自己画的DRV8313方案姿态传感器用的是MPU6050加一个简单的卡尔曼滤波。整机可以实现原地平衡、前进后退、转向、小幅度跳跃和简单的越障。代码已经全部整理好放在GitHub上包含固件、上位机调试工具和详细的装配说明。这篇文章不是那种“教你从零造火箭”的教程而是把我实际做下来的过程、选型的理由、调试中遇到的问题和解决方法原原本本地分享出来。如果你是对机器人控制感兴趣的在校学生或者想找一个能真正动手做的嵌入式项目又或者你已经在做轮腿但卡在了某个环节那这篇内容应该能给你一些参考。我会尽量把每个关键决策背后的逻辑讲清楚让你不仅知道怎么做还知道为什么这么做。2. 整体方案设计与核心思路拆解2.1 轮腿机器人的基本构型选择轮腿机器人说到底就是在一条腿上装一个轮子通过腿的伸缩或摆动来改变重心和轮子的接地状态从而实现平衡和越障。常见的构型有几种一种是五连杆结构每条腿由两个电机驱动通过连杆实现轮子的上下运动和前后摆动另一种是滑块式用直线导轨或者同步带实现腿的伸缩还有一种是摆杆式腿只有一个关节轮子直接装在摆杆末端。我最终选的是五连杆方案原因有几个。第一五连杆的刚度比较好加工件可以用3D打印的尼龙或者PLA不需要太精密的金属加工。第二两个电机分别控制髋关节和膝关节控制自由度足够既能做平衡又能做跳跃。第三这种结构的零件数量相对少装配和维修都方便。滑块式虽然结构简单但对导轨的精度要求高低成本方案下容易卡涩摆杆式自由度太少越障能力有限。注意五连杆的连杆长度和安装孔位需要仔细设计如果比例不对会出现电机堵转或者腿伸不直的情况。我第一版就是拍脑袋定的尺寸结果腿只能弯到90度后来重新算了一遍才解决。2.2 成本控制的核心策略低成本是这个项目的核心约束。我给自己定的目标是整机不超过800元这个预算下每一个零件都要精打细算。我的策略是能自己画PCB就不买模块能用国产替代就不买进口能3D打印就不CNC。具体来说主控没有用常见的树莓派或者Jetson而是用了STM32F103C8T6最小系统板十几块钱一片性能对于轮腿的平衡控制完全够用。电机驱动没有买现成的ODrive或者VESC而是自己画了一块基于DRV8313的三路驱动板配合AS5600磁编码器做位置反馈。电机用的是2208无刷云台电机二手拆机件大概30元一个四个电机一共120元。电池用的是3S航模锂电100元左右。剩下的结构件、紧固件、线材加起来大概200元。整体算下来物料成本在750到800元之间。这里要说明一下自己画驱动板虽然省钱但需要一定的硬件基础。如果你不想折腾硬件也可以买现成的SimpleFOC驱动板或者ODrive的国产替代版成本会上升300到500元但开发速度会快很多。我在文章后面会给出两种方案的对比。2.3 开源策略与代码架构既然标题里写了“开源”那我就把开源这件事做彻底。代码托管在GitHub上采用MIT许可证意味着你可以自由使用、修改甚至商用只需要保留版权声明。代码结构上我分成了几个模块底层驱动层负责电机、编码器、IMU的读写控制层实现LQR平衡控制器和腿部的运动学解算应用层处理遥控指令和状态机切换。开源不仅仅是把代码扔上去我还写了详细的README包括硬件接线图、装配步骤、调试方法和常见问题。上位机工具用的是Python加PyQt可以实时显示姿态曲线和电机状态方便调参。如果你只想看代码不想看文章直接去仓库里翻也行但文章里会补充很多代码注释里写不下的经验。3. 核心硬件选型与关键细节解析3.1 主控与传感器够用就好主控选STM32F103C8T6这个选择可能会让一些人觉得“太low了”。确实F103的主频只有72MHz没有硬件浮点RAM也只有20KB。但轮腿的平衡控制本质上是一个高频的PID或者LQR运算控制周期1ms每次运算的浮点操作大概几百次F103完全扛得住。我用的是自己移植的定点数运算库把浮点转成Q格式实测控制周期稳定在800微秒左右留有余量。姿态传感器用的是MPU6050六轴陀螺仪加加速度计。这个传感器很便宜十几块钱但噪声比较大尤其是陀螺仪的零偏会随时间漂移。我的做法是加一个简单的卡尔曼滤波把加速度计的角度和陀螺仪的角速度融合起来。滤波器的参数是在上位机上用实际数据调的过程噪声和观测噪声的比值大概在1:100左右。如果你预算稍微宽裕一点可以用ICM20602或者BMI088噪声小很多代码改动也不大。实操心得MPU6050的安装位置要尽量靠近机器人的重心并且要减震。我一开始直接用双面胶粘在碳板上结果电机一转姿态数据全是毛刺。后来加了一层3M泡棉胶效果好很多。3.2 电机与驱动低成本无刷方案电机用的是2208无刷云台电机KV值大概在80到100之间。这种电机本来是给无人机云台用的扭矩不大但配合减速比1:1的直接驱动在轮腿这种轻负载场景下够用。四个电机分别控制两条腿的髋关节和膝关节每条腿两个电机。电机的安装方式是用3D打印的夹紧座固定在碳纤维管上夹紧座的内径要跟电机外径匹配公差控制在0.1mm以内否则会打滑。驱动板是自己画的核心芯片是DRV8313三路半桥驱动每路最大电流2.5A。四个电机需要两片DRV8313加上STM32最小系统板和AS5600编码器接口整块板子尺寸是5cm乘7cm。PCB打样用的是嘉立创的5元套餐加上元器件一片板子的成本大概40元。AS5600磁编码器装在电机轴末端通过I2C读取角度分辨率12位对于轮腿的位置控制足够了。这里要提醒一句DRV8313的散热要注意。我第一版没有加散热片连续跑十分钟后芯片烫得手摸不上去后来在芯片背面贴了一块铝片温度降了20度左右。如果你用更大的电机或者更高的电流建议直接上DRV8323或者用分立MOS方案。3.3 结构件与电源3D打印加航模电池结构件全部是3D打印的材料用的是PETG比PLA韧性好不容易断。打印层高0.2mm壁厚1.2mm填充率30%。关键受力部位比如腿部的连杆填充率提高到50%并且在切片软件里加了加强筋。碳纤维管用的是外径12mm、内径10mm的规格长度根据腿的尺寸裁切用环氧树脂胶粘接在打印件里。电源用的是3S锂聚合物电池容量2200mAh放电倍率25C。这个电池的重量大概180克对于整机重量1.2kg来说占比不小但续航能到20分钟左右够调试用了。电池通过XT60插头连接到驱动板驱动板上有一个LM2596降压模块把12.6V降到5V给STM32和传感器供电。这里要注意LM2596的输入输出压差不能太小否则会不稳定我试过用5V直接降3.3V结果一跑电机就复位后来改成两级降压才解决。4. 实操过程与核心环节实现4.1 机械装配从零件到整机装配的顺序很重要我建议先把两条腿分别装好再把腿安装到机身上。每条腿由髋关节电机、膝关节电机、大腿连杆、小腿连杆和轮子组成。髋关节电机固定在机身侧板上膝关节电机固定在大腿连杆上通过一个十字交叉的连杆机构把运动传递到小腿。轮子直接安装在膝关节电机的输出轴上用顶丝固定。装配的时候有几个关键点。第一所有转动关节都要加轴承不要直接用打印件当滑动轴承否则磨损很快间隙变大后控制精度会下降。我用的是MR105ZZ微型轴承内径5mm外径10mm每个关节两个一共用了16个。第二螺丝要加螺纹胶尤其是电机座的螺丝振动大了容易松。第三走线要预留足够的余量腿在运动的时候线缆会反复弯折如果绷得太紧用不了多久就会断。注意装配完成后先用手转动每个关节感觉一下有没有卡涩。如果有检查轴承是否压得太紧或者连杆孔位是否有偏差。我第一版就是因为一个连杆孔位偏了0.5mm导致膝关节电机电流异常大后来重新打印才解决。4.2 电路连接与上电检查电路部分主要是驱动板和主控板的连接。驱动板上有四路电机输出、四路编码器输入、一路IMU接口和一路电源输入。电机输出用PH2.0插头编码器用GH1.25插头IMU用I2C排针。上电之前一定要用万用表检查电源正负极有没有短路我见过太多人因为电源接反烧板子的。上电的顺序是先接电池测量驱动板上的5V和3.3V输出是否正常然后接主控板看LED是否闪烁最后接电机和编码器。第一次上电不要装轮子让电机空转用上位机发送简单的开环指令确认每个电机都能正反转编码器读数方向正确。如果编码器方向反了可以在代码里改符号也可以把电机线对调。这里有一个调试技巧用SimpleFOC的库来做电机的开环测试非常方便它自带了一个图形化工具可以实时看角度和电流。虽然我最终没有用SimpleFOC做控制但前期调试电机和编码器的时候它帮我省了很多时间。4.3 控制算法实现LQR平衡与腿部解算控制算法是整个项目的核心。轮腿的平衡控制可以分解成两个部分一是轮子的平衡控制类似于倒立摆二是腿部的运动学解算把期望的腿长和摆角转换成两个电机的角度。平衡控制我用的是LQR状态变量包括车身俯仰角、俯仰角速度、轮子位置和轮子速度。LQR的好处是可以显式地优化控制代价比PID更容易调。代价矩阵Q和R是在MATLAB里算的然后手动填到代码里。实际调试的时候Q和R还要根据实际响应微调我大概调了三天才找到一个比较满意的参数。腿部解算用的是几何法。给定腿的末端位置轮子中心反解出髋关节和膝关节的角度。五连杆的正逆解公式在代码里有详细注释这里就不展开了。需要注意的是解算出来的角度要经过限幅和滤波否则电机可能会因为目标角度跳变而抖动。实操心得LQR的参数不要一次调太多先调俯仰角相关的让机器人能站住再调位置相关的让它能移动。我一开始想一步到位结果机器人在地上疯狂抽搐差点把电机烧了。4.4 上位机调试工具与参数整定上位机是用Python写的基于PyQt5和PyQtGraph通过串口和主控通信。界面分三个部分左边是姿态显示用3D模型实时显示机器人的姿态中间是曲线图可以看俯仰角、角速度、电机电流等变量的实时曲线右边是参数面板可以动态修改PID和LQR的参数不用重新烧录固件。这个工具对我帮助很大。调平衡的时候光看机器人在地上晃很难判断是哪个参数的问题。有了曲线图就能看到俯仰角的超调量、振荡频率然后有针对性地调。比如俯仰角一直低频晃动说明角度环的P太小如果高频抖动说明D太大或者滤波不够。串口通信的波特率用的是921600每1ms发一帧数据每帧大概50字节。这个速率下Python端偶尔会丢包但不影响调试。如果你要做更复杂的分析可以把数据存成CSV用MATLAB或者Python的pandas做离线分析。5. 常见问题与排查技巧实录5.1 电机发热严重怎么办电机发热是轮腿机器人最常见的问题之一。原因通常有三个一是电流限幅设得太高二是控制频率太低导致电流波动大三是机械装配有问题导致负载过大。我的排查顺序是先用手转动关节感觉阻力是否正常然后用上位机看电机电流波形如果电流有周期性尖峰说明机械有卡涩最后检查电流限幅2208电机的持续电流不要超过1.5A峰值不要超过3A。我一开始把限幅设到5A结果电机烫得能煎鸡蛋后来降到1.5A温度就正常了。5.2 平衡时低频晃动怎么调低频晃动一般是角度环的增益不够或者速度环的积分太强。我的经验是先把速度环的积分清零只调角度环的P和D让机器人能站住但会缓慢漂移然后再加一点点速度环的P让它能回到原点。速度环的积分要非常小心稍微大一点就会引起低频振荡。如果调了很久还是晃可能是IMU的安装位置不对或者滤波器的相位滞后太大。可以试着把IMU往重心位置挪一挪或者降低滤波器的截止频率。5.3 编码器读数跳变怎么排查编码器读数跳变通常是因为磁铁和芯片的距离不对或者I2C总线受到干扰。AS5600的磁铁和芯片间距建议在0.5到2mm之间太远信号弱太近容易饱和。I2C线要尽量短并且远离电机线。如果还是跳可以在代码里加一个中值滤波连续读三次取中间值。我遇到过一次编码器跳变查了半天发现是电机线跟编码器线捆在一起了电机换向的时候干扰了I2C。后来把线分开走问题就消失了。5.4 常见问题速查表问题现象可能原因排查方法解决方法电机发热严重电流限幅过高、机械卡涩手转关节、看电流波形降低限幅、重新装配平衡低频晃动角度环增益不足、速度环积分过强看俯仰角曲线调P和D、减小积分编码器读数跳变磁铁距离不对、I2C干扰检查间距、分开走线调整间距、加滤波上电后主控复位电源压降太大测5V和3.3V电压两级降压、加大电容机器人往一边倒IMU零偏未校准静止时看角度输出重新校准零偏提示每次修改硬件或者代码后都要重新校准IMU零偏。我习惯在机器人静止时按一下遥控器上的校准键让代码自动采集1000个样本取平均。6. 开源代码与后续扩展方向6.1 代码仓库结构与使用说明代码仓库分为三个目录firmware是STM32的固件工程用Keil或者STM32CubeIDE打开host_tool是Python上位机依赖PyQt5和pyserialdocs是装配说明和调试笔记。固件里有一个config.h文件所有的参数都在里面包括电机极对数、编码器方向、LQR参数、电流限幅等。你拿到代码后第一件事就是根据你的硬件修改config.h。编译固件需要安装ARM GCC工具链仓库里有一个Makefile直接make就行。烧录用的是ST-Link接线是SWD四线。如果你用的是其他主控比如ESP32控制层的代码可以移植过去只需要改底层驱动。6.2 可以继续做的扩展这台机器人目前只实现了基本的平衡和移动还有很多可以扩展的地方。比如加一个激光测距或者超声波传感器做简单的避障加一个摄像头模块用OpenMV做视觉巡线或者把腿的自由度增加到三个实现更复杂的步态。控制算法上可以试试MPC或者强化学习不过那需要更强的算力F103可能跑不动得换H7或者树莓派。电源方面可以换成18650电池组续航更长但重量会增加。我个人接下来打算做的是给机器人加一个简单的跳跃功能通过腿部的快速伸缩让轮子离地越过小障碍。这个需要更精确的力矩控制和落地检测还在调试中。6.3 给想复现的朋友几点建议如果你打算照着这个方案做一台我有几个建议。第一先买齐所有零件再动手不要做一半发现缺东西等快递很浪费时间。第二PCB打样之前一定要仔细检查原理图尤其是电源部分我第一版就因为一个电容画错导致整板报废。第三调试的时候要有耐心平衡控制不是一次就能调好的我大概花了两周才让机器人稳定站立。最后开源的意义在于互相学习。如果你在复现过程中发现了问题或者有更好的改进方案欢迎在仓库里提Issue或者PR。我也会持续更新代码和文档把后续的跳跃功能加进去。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑