ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于STM32与神经网络的50Hz双足机器鸭闭环控制实战

基于STM32与神经网络的50Hz双足机器鸭闭环控制实战 1. 项目缘起为什么我要做一只机器鸭1.1 从能走到走得稳的鸿沟双足机器人这个领域外行看热闹内行看门道。很多人第一次看到双足机器人走路视频第一反应是哇好厉害但真正做过的人都知道让一个双足机构在平地上迈出第一步和让它在受到扰动后还能稳住重心中间隔着的不是一行代码而是一整套控制体系的搭建。MicroDuck 这个项目就是我在踩了无数坑之后决定从零搭一套完整神经控制闭环的产物。它的核心目标很明确用一只体型小巧的双足机器鸭跑通从传感器采集、神经网络推理、关节指令下发到姿态反馈修正的完整闭环并且把整个控制回路的运行频率稳定在 50Hz。50Hz 这个数字不是随便定的它意味着每 20 毫秒就要完成一次感知—决策—执行的循环这对算力分配、通信延迟、滤波设计都提出了实打实的要求。1.2 这只鸭子到底能做什么MicroDuck 不是玩具也不是那种只能做预设动作的演示品。它具备的能力包括实时读取 IMU 姿态数据、通过训练好的轻量神经网络输出关节目标角度、驱动多个舵机或电机完成步态、在受到侧向推力时通过闭环反馈调整重心。适合谁来参考如果你正在做双足机器人、四足机器人、或者任何需要高频闭环控制的嵌入式项目这套思路可以直接迁移。哪怕你是刚入门的学生只要有一点 Python 和嵌入式基础跟着走也能把框架搭起来。我之所以选择鸭这个形态是因为它的重心分布和腿部结构与常见的双足人形有相似之处但体积更小、成本更低、摔了不心疼。这一点在早期调试阶段极其重要——你不会想拿一台几万块的平台去试一个还没验证过的控制参数。1.3 50Hz 这个数字背后的取舍很多人会问为什么不是 100Hz 或者 200Hz理论上频率越高控制越平滑但实际工程里频率越高意味着每个周期可用的计算时间越短。50Hz 给出 20ms 的预算其中 IMU 读取和滤波大概占 2-3ms神经网络推理占 5-8ms剩下的留给通信和余量。如果硬上 100Hz推理时间就被压缩到 5ms 以内普通 MCU 根本扛不住除非上更贵的算力平台。提示控制频率的选择要和你的执行器响应速度匹配。舵机的响应延迟通常在 10-20ms 量级你控制频率再高执行器也跟不上反而浪费算力。所以 50Hz 是一个在算力、延迟、执行器特性之间取得平衡的甜点值。这也是我在这个项目里反复强调的一个理念不要盲目追求参数上的漂亮要让每个数字都有工程依据。2. 整体架构设计闭环是怎么转起来的2.1 神经控制闭环的四个环节MicroDuck 的控制闭环可以拆成四个环节环环相扣。第一个环节是感知IMU 以固定频率采集加速度和角速度经过滤波后得到相对干净的姿态角。第二个环节是推理把姿态角、关节当前角度、上一周期的动作等拼成一个状态向量喂给训练好的神经网络网络输出下一时刻各关节的目标角度。第三个环节是执行把目标角度通过总线下发给舵机或电机驱动器。第四个环节是反馈读取关节的实际角度和新的 IMU 数据进入下一轮循环。这四个环节必须在 20ms 内跑完任何一个环节超时整个闭环的稳定性都会受影响。我在早期版本里就吃过亏——IMU 读取用了阻塞式等待结果偶尔卡住 30ms鸭子直接原地抽搐。2.2 为什么用神经网络而不是传统 PID传统 PID 控制双足机器人不是不行但调参极其痛苦。双足系统是非线性的、强耦合的一个关节的角度变化会影响整个身体的姿态PID 的三个参数在不同步态阶段需要不同的值你得做增益调度工作量巨大。神经网络的优势在于它可以通过训练直接学到当前状态到目标动作的映射把复杂的耦合关系隐式地编码在权重里。当然神经网络也不是银弹。它的输出没有可解释性出问题的时候你很难定位是哪个环节的错。所以我在设计上做了一个折中神经网络负责生成目标角度底层仍然保留一个轻量的位置环 PID 来保证关节能准确跟踪目标。这样上层负责决策下层负责执行精度各司其职。2.3 硬件选型的考量硬件这块我列个表把关键部件的选型和理由说清楚。部件选型选型理由主控STM32F4 系列有 FPU跑轻量神经网络够用生态成熟IMU六轴陀螺仪加速度计成本低50Hz 下噪声可接受配合滤波够用执行器串行总线舵机支持角度回读方便做闭环反馈通信板载串口 上位机调试阶段需要实时看数据电源2S 锂电池体积小能给舵机提供足够瞬时电流选 STM32F4 而不是更便宜的 F1核心原因就是 FPU。神经网络推理涉及大量浮点运算F1 没有硬件浮点单元纯软件浮点跑一次推理要几十毫秒根本进不了 50Hz 的预算。F4 带 FPU同样的网络推理能压到 5-8ms这就是差距。注意舵机的瞬时电流可能达到堵转电流的好几倍电源一定要留足余量否则一迈步电压就被拉垮主控直接复位。3. 核心细节解析50Hz 闭环里的关键环节3.1 IMU 数据采集与姿态解算IMU 是整个闭环的眼睛它的数据质量直接决定了控制效果。六轴 IMU 输出的是三轴加速度和三轴角速度要得到姿态角需要做姿态解算。常见的方法有互补滤波、Mahony 滤波、Madgwick 滤波。我在 MicroDuck 上用的是互补滤波原因是它计算量小参数直观适合在 MCU 上跑。互补滤波的核心思想很简单加速度计在静态下能给出准确的重力方向但动态下噪声大陀螺仪积分能得到平滑的角度但会漂移。把两者按频率特性互补——高频信陀螺仪低频信加速度计——就能得到相对稳定的姿态角。公式大致是角度 α × (角度 陀螺仪角速度 × dt) (1-α) × 加速度计解算角度。α 一般取 0.95 到 0.98 之间。这里有个坑我必须提醒加速度计解算角度时如果机器人正在加速运动加速度计测到的不只是重力还有运动加速度解算出来的角度就是错的。所以互补滤波的 α 不能取太小否则动态下姿态会被运动加速度带偏。我实测下来 α 取 0.97 比较稳。3.2 50Hz 陷波器的设计与实现这是整个项目里最容易被忽视、但影响最大的一个环节。舵机在运动时会产生周期性的机械振动这个振动会耦合到 IMU 上让姿态数据出现周期性波动。如果这个波动频率接近控制频率的整数倍就会和控制回路形成共振鸭子会越走越抖。50Hz 陷波器的作用就是把特定频率的干扰信号滤掉。陷波器的原理是在频域上挖一个坑让某个窄带频率的信号无法通过。设计一个数字陷波器核心参数有三个中心频率、带宽、采样频率。中心频率就是你要滤掉的干扰频率带宽决定了坑的宽度采样频率就是你的控制频率。我用的是一种双 T 型陷波滤波器结构它的传递函数在中心频率处增益为零能有效抑制该频率的干扰。离散化之后每个采样周期只需要几次乘加运算计算量很小完全能塞进 50Hz 的预算里。提示陷波器的中心频率要和实际干扰频率对准偏了效果会大打折扣。建议先用上位机把 IMU 原始数据录下来做一次频谱分析找到干扰的主频再设陷波器参数。3.3 神经网络的结构与推理优化MicroDuck 上跑的神经网络不能太大我的目标是参数量控制在几千到一万级别推理时间控制在 8ms 以内。网络结构用的是全连接网络输入层接收状态向量中间两到三个隐藏层输出层输出各关节的目标角度。输入状态向量的构成很关键我用了这些量身体俯仰角和横滚角、身体角速度、各关节当前角度、各关节当前角速度、上一周期的关节目标角度、一个相位信号。相位信号用来告诉网络当前处于步态的哪个阶段这样网络可以学到分阶段的控制策略。推理优化上我做了几件事。第一把权重和偏置量化成定点数减少浮点运算量。第二把激活函数从 tanh 换成计算更快的近似函数。第三把矩阵乘法展开成循环避免动态内存分配。这几招下来推理时间从最初的 15ms 压到了 6ms 左右。3.4 关节指令下发与总线通信舵机通过串行总线通信每个舵机有独立的 ID主控按 ID 逐个下发目标角度。这里有个细节总线通信是串行的舵机越多一轮通信耗时越长。MicroDuck 有 8 个关节如果每个舵机通信耗时 1ms一轮就是 8ms加上推理和滤波20ms 的预算就很紧张了。我的优化办法是把舵机通信做成非阻塞的主控发出指令后不等待回复直接进入下一轮循环舵机的实际角度在下一轮循环里读取。这样通信时间就被隐藏在了控制周期里不占用关键路径。代价是反馈有一拍的延迟但在 50Hz 下20ms 的延迟对双足平衡影响可以接受。4. 实操过程从零搭起闭环4.1 开发环境搭建先说环境。主控端我用的是 STM32CubeIDE配合 HAL 库开发。上位机用 Python主要做数据可视化和神经网络训练。训练框架用 PyTorch训练好的模型导出成权重文件再转成 C 数组烧进主控。这里有个流程上的建议不要在主控上直接调神经网络先在 PC 上把网络训好、验证好再移植。PC 上可以用 MuJoCo 做仿真把训练好的策略在仿真里跑通再上真机。这样能省下大量真机调试时间也能避免真机被摔坏。4.2 MuJoCo 仿真与回放MuJoCo 是这个项目里我最推荐的仿真工具。它的物理引擎精度高接触模型处理得好适合做双足机器人的仿真。我在 MuJoCo 里建了 MicroDuck 的模型把质量、惯量、关节限位都按真机参数设置好然后在仿真里训练和验证控制策略。仿真回放这个功能特别有用。每次真机跑完我把真机的传感器数据录下来在 MuJoCo 里重新播放看看仿真里的表现和真机是否一致。如果不一致说明仿真模型和真机有偏差需要调整模型参数。这个仿真—真机—回放—修正的循环是我把控制策略调稳的核心方法。提示MuJoCo 的 viewer 支持重新播放录制的轨迹这个功能在排查问题时极其好用。你可以逐帧看机器人在哪个时刻姿态开始发散然后针对性分析。4.3 神经网络训练流程训练数据的来源有两个一是 MuJoCo 仿真里用传统控制器生成的成功步态数据二是真机上人工遥控采集的数据。前者量大、干净后者量少、但更贴近真实。我把两者混合起来训练效果比单用仿真数据好很多。训练的目标函数设计也很讲究。不能只让网络模仿目标角度还要加上姿态稳定的惩罚项。我的损失函数包含三部分关节角度跟踪误差、身体姿态偏差、动作平滑度惩罚。第三项是为了避免网络输出剧烈跳变的动作那种动作在真机上会让舵机抖得厉害。训练完之后我会在仿真里做扰动测试给机器人施加侧向推力看它能不能恢复。能恢复的策略才拿去真机验证。这个筛选过程能过滤掉大部分不鲁棒的策略。4.4 真机调试与参数整定真机调试是最考验耐心的环节。我的流程是先让机器人悬空验证关节能按指令运动再放到地面上用手扶着验证步态节奏最后放手让它自己走。参数整定上我重点调三个东西控制频率的实际稳定性、陷波器的中心频率、神经网络的输出缩放系数。控制频率用示波器或者 GPIO 翻转来测确保每个周期真的是 20ms。陷波器中心频率通过频谱分析确定。输出缩放系数决定了网络输出的动作幅度太小走不动太大直接摔。这里分享一个我踩过的坑早期我为了让鸭子走得快把输出缩放系数调得很大结果鸭子一迈步就往前扑。后来才明白双足行走的稳定性比速度重要得多宁可走慢一点也要保证每一步都稳。把速度降下来之后反而能走得更远。5. 常见问题与排查技巧实录5.1 姿态数据抖动严重这是最常见的问题。表现是 IMU 读出来的姿态角一直在小幅震荡导致网络输出也跟着抖。排查思路先看原始数据如果原始数据就抖那是硬件或滤波问题如果原始数据干净但解算后抖那是解算参数问题。硬件层面检查 IMU 是否固定牢靠有没有和振动源刚性连接。滤波层面检查互补滤波的 α 值是否合适陷波器中心频率是否对准。我遇到过一种情况是舵机电源和主控电源共地不良导致 IMU 数据里混入了电源噪声重新布线之后就干净了。5.2 控制周期不稳定50Hz 要求每个周期严格 20ms但实际跑起来经常是 18ms 到 25ms 之间跳。这种抖动对控制效果影响很大。排查方法是在每个周期的开始和结束翻转一个 GPIO用示波器看周期长度。常见原因是某个环节耗时不稳定比如串口通信偶尔阻塞、神经网络推理遇到分支预测失败、或者中断嵌套太深。我的解决办法是把耗时长的操作拆成多个周期分步执行保证每个周期的负载均衡。另外把不关键的中断优先级降下来避免打断控制循环。5.3 神经网络输出异常有时候网络会输出明显不合理的角度比如超过关节限位或者相邻两帧之间跳变很大。这种情况通常是输入状态向量里有异常值。排查方法是把输入向量打印出来逐个检查是否有 NaN、无穷大、或者超出正常范围的值。我遇到过一次是 IMU 在某个姿态下解算出了 NaN原因是加速度计读数恰好让某个除法分母为零。后来加了一个保护检测到异常值就用上一帧的值替代。这种边界情况的处理在真机上非常必要。5.4 常见问题速查表问题现象可能原因排查方向解决思路姿态角持续漂移陀螺仪零偏未校准静止时读陀螺仪输出上电时做零偏校准步态节奏紊乱控制周期抖动GPIO 翻转测周期均衡各周期负载侧向推力后无法恢复网络鲁棒性不足仿真扰动测试增加扰动训练数据舵机发热严重目标角度频繁跳变看网络输出曲线加动作平滑惩罚通信偶发丢包总线负载过高统计通信错误率降低通信频率或分帧5.5 独家避坑经验第一条永远先在仿真里验证再上真机。真机摔一次可能就要修半天仿真里摔一万次都没事。第二条所有参数都要有记录改了哪个参数、效果怎么变都记下来。双足控制的参数空间很大不记录的话改着改着就忘了之前哪个组合效果好。第三条控制频率宁低勿高先把 50Hz 跑稳再考虑往上提。频率不稳的高频控制还不如频率稳定的低频控制。第四条也是我最想强调的不要迷信神经网络。神经网络是工具不是目的。如果某个环节用传统方法能解决得更好就用传统方法。MicroDuck 里底层的位置环就是传统 PID它比神经网络更可靠、更可预测。把合适的方法用在合适的地方才是工程思维。6. 拆解资料与后续扩展方向6.1 拆解资料的整理思路做这种项目拆解资料的价值不亚于代码本身。我整理资料的习惯是按模块分文件夹硬件资料、仿真模型、训练代码、主控固件、调试记录。每个文件夹里放一个 README说明这个模块的作用、关键参数、以及踩过的坑。硬件资料里我会放接线图、电源分配图、机械尺寸图。仿真模型里放 MuJoCo 的 XML 文件和对应的参数说明。训练代码里放网络结构定义、训练脚本、以及训练好的权重。主控固件里放各个模块的驱动代码和控制主循环。调试记录里放每次真机测试的数据和结论。这样整理的好处是过几个月回头看或者别人接手都能快速理解整个项目。我见过太多项目代码写得不错但没有任何文档最后只能烂在硬盘里。6.2 后续可以扩展的方向MicroDuck 目前跑通了基本的行走闭环但还有很多可以扩展的地方。第一个方向是增加地形适应能力让鸭子能在轻微不平的地面上行走。这需要在状态向量里加入足底接触信息并重新训练网络。第二个方向是提高控制频率把 50Hz 提到 100Hz这需要换更强的算力平台或者进一步优化网络推理。第三个方向是加入视觉让鸭子能感知前方障碍。这属于更高层次的任务规划和底层的平衡控制是两套系统需要设计好两者之间的接口。第四个方向是做多鸭协同研究多个双足机器人之间的协调控制。这个方向偏研究性质但很有意思。6.3 我个人的一些体会做 MicroDuck 这个项目最大的收获不是最后鸭子能走多稳而是整个过程中建立起来的一套方法论先仿真后真机、先稳定后速度、先记录后优化。这套方法论放到任何机器人项目里都适用。另外一点体会是50Hz 这个数字看起来简单但背后涉及的每一个环节——滤波、推理、通信、执行——都需要仔细打磨。工程上的事情往往不是某个环节特别难而是所有环节都要同时达标任何一个短板都会拖垮整体。这也是为什么我花了大量时间在陷波器和周期稳定性上而不是一味追求网络结构的复杂。最后分享一个小技巧如果你也在做类似的双足项目建议从最简单的单腿站立开始把单腿的平衡闭环跑通再扩展到双腿。单腿站立时控制目标单一容易定位问题。等单腿稳了双腿行走就是水到渠成的事。我当初就是跳过单腿直接做行走结果在姿态耦合上卡了很久回头补单腿的课才理顺。
返回列表