机器狗控制方法全解析:从关节伺服到步态规划与平衡抗扰
机器狗这东西第一次上手的人十有八九会卡在同一个地方硬件装好了电机能转了遥控器一按也能走两步可一旦想让它做点像样的动作——比如小跑、爬坡、原地转身、被踹一脚还能站稳——就发现完全不知道从哪儿下手。标题问的是控制方法有哪些但真正值得聊的不是列个清单而是每种方法解决什么问题、在什么阶段用、彼此怎么衔接。我做过几个四足平台的运动控制调试从最朴素的舵机时序到模型预测控制都趟过一遍踩的坑不算少。这篇就把机器狗控制这条链路从底到顶拆开讲既说清楚原理也给得出能直接照着调的参数和步骤不管你是刚买套件的学生还是要把平台做成产品原型的工程师都能从中找到自己那一层该干的事。1. 先搞清楚控制到底在控什么很多人一上来就问用什么算法其实这个问题问早了。机器狗的控制是一个多层嵌套的结构每一层的输入输出、时间尺度、失败表现都不一样。不把层次理清楚你会在错误的地方用错误的工具比如拿PID去调步态相位或者指望强化学习直接输出舵机角度最后调半个月也调不明白。1.1 从任务到力矩的四层分解我习惯把整条链路分成四层从上往下依次是任务层、规划层、步态与平衡层、关节伺服层。任务层管的是去哪儿、干什么比如前进两米、左转九十度、爬上那个十五度的坡输出的是一个期望速度或者期望位姿。规划层把期望速度翻译成落脚点序列和身体轨迹决定每一步脚踩在哪儿、身体重心怎么移动。步态与平衡层负责在支撑相和摆动相之间切换同时处理扰动——被推一下、踩到石子、地面打滑都在这一层做补偿。最底下的关节伺服层才是真正给电机发指令的地方把期望的关节角度或力矩变成PWM或者CAN帧。这四层的时间尺度差得很远。任务层可能几百毫秒才更新一次规划层几十毫秒步态层几毫秒伺服层则是微秒到毫秒级。你要是把任务层的逻辑塞进伺服循环里跑实时性立刻崩掉。我见过一个同学把路径规划写在定时器中断里结果电机响应忽快忽慢查了两天才发现是规划算法偶尔超时把中断拖长了。提示调试时务必给每一层单独打时间戳记录输入输出和耗时。机器狗出问题八成不是算法本身错而是某一层的时间预算被吃掉了。1.2 为什么不能跳过中间层直接端到端现在强化学习很火确实有团队做端到端——传感器输入直接出关节指令。但你要清楚它的代价训练需要大量仿真环境和真机数据奖励函数设计极其磨人而且出了问题极难定位因为中间没有可观测的变量。对于绝大多数做项目、做课程、做原型的人来说分层控制才是能落地、能调试、能讲清楚的路子。端到端可以作为上层策略的补充比如用学习的方法生成步态参数但底层的关节伺服和平衡补偿还是得用经典方法兜底。这个判断不是保守是工程现实你需要的是能修而不只是能跑。2. 关节伺服层最底层也最容易翻车的地方所有上层算法再漂亮最终都要落到给某个电机发一个什么样的指令上。这一层看着简单实际上新手翻车最多。位置控制、速度控制、力矩控制三种模式选哪个编码器怎么读零点怎么标通信延迟怎么压每一项都能让你卡上几天。2.1 三种伺服模式的适用边界位置控制是最直观的告诉关节转到多少度驱动器内部自己闭环。优点是简单、稳定、不怕负载扰动适合做静态姿势、慢速动作、示教回放。缺点是它硬遇到冲击时电机死扛容易过流或者烧驱动。速度控制适合轮式或者连续旋转的关节四足上用得少。力矩控制则是四足的灵魂——它让腿能软下来落地时吸收冲击被推时顺势卸力这也是机器狗能做出柔顺动作的根本原因。实际选型上我一般这样分配髋关节的横滚自由度用位置控制保证身体不歪大腿和小腿的俯仰关节用力矩控制做柔顺步态膝关节在支撑相切力矩、摆动相切位置。这个混合策略在多数中小型平台上都验证过兼顾了稳定和灵动。你要是全套位置控制机器狗走起来会像踩高跷硬邦邦的稍微有点不平就弹起来。伺服模式适用关节优点典型问题位置控制髋横滚、示教关节稳定、实现简单遇冲击易过流速度控制连续旋转关节平滑四足上场景少力矩控制大腿、小腿俯仰柔顺、抗扰需要精确的力矩常数标定2.2 零点标定和编码器读数一个不能省的仪式每台机器狗装配完关节零点是歪的。你要做的第一件事是把所有腿摆到标准站姿然后逐个记录编码器读数作为零点偏移。这个偏移量必须存进配置文件每次上电加载。我见过有人偷懒不标定结果机器狗一上电就自己往一边倒还以为是平衡算法的问题查了半天是零点差了十几度。标定的具体做法把机器狗架在支架上让四脚悬空手动把每条腿摆到大腿垂直、小腿垂直的几何零位读取每个关节的原始编码器值减去理论零位值得到偏移。重复三次取平均消除手动摆放的误差。标定完做一次验证给所有关节发零位指令看实际姿态是否和几何零位一致偏差超过两度就重标。注意力矩控制模式下零点误差会被放大成持续的下压力或上抬力机器狗会慢慢趴下去或者踮起来。所以力矩控制对零点精度的要求比位置控制高一个量级。2.3 通信延迟看不见的性能杀手关节伺服层最容易被忽视的是通信。CAN总线在1Mbps下一帧标准数据大约一百多微秒一条腿三个电机四条腿十二个电机一轮下来就是一两毫秒。如果你还用轮询方式一个个发延迟直接翻倍。正确做法是用广播帧或者分组并行下发把一轮控制周期压在两毫秒以内。超过这个数步态层的相位补偿就会失准机器狗走起来一顿一顿的。我实测过一个对比轮询下发时控制周期约4.5毫秒改成同步广播后降到1.8毫秒同样的步态参数后者走起来明显顺滑。这个差距在慢速行走时还不明显一旦上小跑就原形毕露。所以别在通信上省钱省事这是底层的地基。3. 步态层让四条腿协调起来的核心逻辑步态层是机器狗控制里最有味道的部分。它要解决的核心问题是四条腿什么时候抬、什么时候落、抬多高、落多远以及身体怎么配合。这一层做不好机器狗要么原地踏步要么走两步就摔。下面把最常用的几种步态生成方法拆开讲每种都给到能调的参数。3.1 相位驱动的步态生成最实用的起点相位法是我推荐所有人从这儿起步的方案。核心思想是给每条腿分配一个相位偏移用一个统一的相位变量驱动所有腿的摆动。以最常见的对角小跑为例前左和后右同相前右和后左同相两组相差半个周期。相位变量随时间线性增长取模归一化到零到一之间然后通过查表或者分段函数把相位映射成抬腿高度和前后摆角。具体参数上步频一般取1.5到3赫兹小型平台可以到4赫兹。占空比支撑相占整个周期的比例小跑取0.5慢走取0.75。抬腿高度取腿长的百分之十到十五太高费能量还容易失稳太低容易绊到小障碍。前后摆幅根据期望速度反推速度等于步幅乘以步频步幅又约等于两倍的摆幅乘以腿长所以给定速度就能算出摆幅。# 相位驱动步态生成的核心逻辑伪代码 phase (phase dt * freq) % 1.0 for leg in legs: leg_phase (phase leg.offset) % 1.0 if leg_phase duty: # 支撑相 x stride * (leg_phase / duty - 0.5) z 0.0 else: # 摆动相 t (leg_phase - duty) / (1 - duty) x stride * (0.5 - t) z height * sin(pi * t) leg.set_foot_position(x, z)这段逻辑简单到几十行就能写完但效果出奇地稳。它的好处是相位、步频、占空比、抬腿高度、摆幅这五个参数物理意义明确调起来有方向感。缺点是它开环遇到扰动不会自适应所以必须配合下一节的平衡补偿一起用。3.2 落脚点规划从会走到走得稳相位法给的是相对身体的脚位置但真正决定稳不稳的是脚落在世界坐标系的哪儿。落脚点规划要解决的是根据当前身体速度和期望速度算出每条腿在摆动相结束时应该落在哪个位置。最经典的是 Raibert 式落脚点公式落脚点等于髋关节投影点加上半个支撑期速度乘以当前速度再加上一个速度误差修正项。用生活化的话说就像你跑步时眼睛会往前看脚自然落在身体前方一点速度越快落得越远。机器狗也一样落脚点要超前于身体才能持续加速或者维持速度。修正项的作用是纠偏如果实际速度比期望慢落脚点再往前放一点把身体拉上去。这个公式里有个增益需要调我一般从0.1开始试逐步加到0.3左右。增益太小纠偏无力机器狗加速慢太大则落脚点来回摆走起来左右晃。调这个参数时把机器狗放在跑步机上最方便能清楚看到落脚点的摆动。3.3 身体姿态补偿让机器狗抬头挺胸光有腿的协调还不够身体姿态得单独管。机器狗在斜坡上、加速减速时身体会俯仰或者侧倾如果不补偿四条腿的受力会严重不均容易打滑甚至翻倒。姿态补偿的做法是用IMU读出身体的横滚和俯仰角通过逆运动学反算出四条腿应该怎么调整长度来把身体端平。举个具体场景机器狗上坡时身体会往后仰前腿被拉长、后腿被压缩。补偿逻辑检测到俯仰角为正就主动缩短前腿、伸长后腿让身体保持水平。这个补偿量不用太大一般限制在正负十度以内超了说明地形太陡该切换到爬坡步态了。提示姿态补偿和步态生成要解耦。补偿只改腿的长度z方向步态只管前后摆x方向两者叠加后再送逆运动学。混在一起写会让参数互相干扰调一个坏一个。4. 平衡与抗扰机器狗站得住的关键步态让机器狗能走平衡让它摔不倒。这两件事得分开做因为它们的触发条件和响应速度完全不同。平衡控制本质是一个高频的反馈回路处理的是意外而步态是计划。下面讲三种从简到繁的平衡策略你可以根据平台算力和传感器配置选。4.1 基于IMU的姿态反馈最基础的一道防线最朴素的平衡控制就是读IMU的姿态角做PD反馈输出到四条腿的长度调整或者髋关节的力矩。横滚角偏了就一侧腿伸长一侧缩短把身体推回来。俯仰角偏了就前后腿配合调整。这个方案不需要力传感器一个像样的IMU就够算力消耗极低是几乎所有平台的第一道防线。参数上比例增益决定回正力度微分增益抑制振荡。我一般先调微分再调比例先把比例设很小加大微分直到不抖再慢慢加比例直到回正够快。横滚和俯仰要分开调因为四条腿的几何不对称同样的增益效果不一样。这个方案的局限也很明显它只能处理慢速扰动遇到快速冲击比如被踢一脚反应不过来因为IMU有噪声、滤波有延迟。所以它适合做稳态维持不适合做应急恢复。4.2 虚拟模型控制把机器狗当成一个弹簧虚拟模型控制VMC是我最喜欢的平衡方案性价比极高。它的思路是把机器狗的身体想象成一个挂在四条虚拟弹簧上的刚体每条腿就是一根弹簧加一个阻尼器。当身体偏离期望位置或姿态时虚拟弹簧产生恢复力通过雅可比矩阵映射到关节力矩上。这个方法的妙处在于它天然柔顺。你推机器狗一下它会像弹簧一样被推歪再弹回来而不是硬扛。落地时腿会自动软下来吸收冲击不需要额外的落地检测逻辑。实现上每条腿算一个虚拟力方向从足端指向髋关节大小等于刚度乘以长度误差加上阻尼乘以速度误差然后乘以雅可比转置得到关节力矩。刚度参数的选择很关键。刚度太高机器狗硬得像块铁抗扰好但落地冲击大刚度太低软绵绵站不稳。我一般从每米几千牛每米的量级开始试小型平台取低值大型平台取高值。阻尼取刚度的百分之五到十保证临界阻尼附近不振荡。4.3 捕获点与迈步恢复被推了会自己迈腿前面两种都是原地不动的平衡但机器狗被大力推的时候光靠腿长调整是救不回来的必须迈一步。捕获点理论解决的就是往哪儿迈才能停下来的问题。它的核心是计算一个点如果脚落在那个点上身体的动量刚好能被抵消机器狗就能停住。计算捕获点需要知道身体质心位置、速度和重力加速度公式是质心位置加上速度乘以根号下质心高度除以重力加速度。算出来的捕获点如果落在支撑多边形外面就说明必须迈步而且脚要落在捕获点附近。这个逻辑让机器狗有了应急反应能力被推一下会自己调整脚步而不是硬撑。实现捕获点迈步要注意两点一是迈步的时机太早浪费动作太晚来不及二是迈步后的落脚点要留余量不能正好落在捕获点上否则下一次扰动就没空间了。我一般取捕获点往支撑多边形内缩百分之二十的位置作为实际落脚点。5. 上层规划与任务控制从能走到能干活底层稳了之后才轮到上层发挥。这一层决定机器狗去哪儿、怎么绕开障碍、怎么完成具体任务。很多人觉得这层是纯软件跟机器狗硬件无关其实不然——上层的输出必须和底层的步态能力匹配否则规划出来的轨迹底层根本执行不了。5.1 速度指令接口上下层之间的契约上下层之间最干净的接口是速度指令上层给一个前进速度、侧移速度、转向角速度底层负责执行。这个接口的好处是解耦上层不用关心步态细节底层不用关心任务逻辑。但要注意速度指令的可行域底层能执行的最大速度、最大转向速率是有限的上层规划时必须限制在这个范围内否则底层会饱和实际轨迹和规划轨迹对不上。我一般会在接口处加一个限幅和平滑速度指令先过一阶低通滤波避免阶跃指令让步态突变再限制在标定过的可行域内。这个细节看着小但能避免大量规划得好好的、执行起来乱走的问题。5.2 路径跟踪把几何轨迹变成速度指令路径跟踪的常见做法是纯跟踪或者模型预测。纯跟踪简单实用在规划路径上找一个前视点根据机器狗当前位置和前视点的几何关系算出转向角速度前进速度保持恒定或者按曲率调整。前视距离是个关键参数太短跟踪紧密但容易振荡太长跟踪平滑但会切弯。模型预测则适合复杂场景能同时考虑速度约束、障碍物、动力学。但它的计算量大在机载算力有限的平台上要谨慎。我的经验是结构化环境用纯跟踪足够非结构化或者动态障碍多的场景再上模型预测。5.3 任务状态机把动作串起来机器狗要完成走到指定点、蹲下、拍照、站起来、返回这样的任务需要一个状态机来管理。每个状态对应一组底层指令和退出条件状态之间按事件跳转。这个部分没有太多算法含量但工程上极其重要因为它是所有功能的粘合剂。写状态机时我踩过的坑是退出条件写得太死导致某个状态卡住出不来。比如蹲下状态等关节到位信号但关节因为负载没到位就永远卡在那儿。解决办法是加超时和容错每个状态都有最大停留时间超时强制跳转并记录日志。这个习惯能省掉大量现场调试的麻烦。6. 学习类方法什么时候值得上什么时候是坑强化学习在四足控制上确实出了不少成果仿真里跑出来的步态很漂亮。但我得说句实话对大多数做项目的人来说学习类方法是锦上添花而不是雪中送炭。它的门槛不在算法本身而在环境搭建、奖励设计、仿真到现实的迁移这三座大山。6.1 仿真训练到真机部署的鸿沟仿真里机器狗可以跑得飞快真机上却可能连站都站不稳这个差距主要来自三方面动力学参数不准质量、惯量、摩擦系数、传感器噪声、执行器延迟。要缩小鸿沟得做域随机化——训练时随机化质量、摩擦、延迟、噪声让策略见过足够多的变体真机上才能泛化。域随机化的范围要拿捏。随机化太窄迁移不过去太宽策略学不出精细动作。我一般先测真机的参数分布然后按两倍标准差做随机化再根据迁移效果微调。这个过程很耗时间要有心理准备。6.2 学习方法的合理定位我的建议是把学习方法用在参数生成而不是直接控制上。比如用学习的方法根据地形调整步态参数步频、抬腿高度、占空比底层还是用经典的相位法加虚拟模型控制执行。这样既有学习的适应性又有经典方法的可解释性和稳定性。真出了问题你至少知道是参数不对还是底层不对。注意不要一上来就追求端到端。先用经典方法把平台跑通建立完整的调试工具链和数据记录再考虑引入学习。没有这套基础设施学习类方法出了问题你连从哪儿查都不知道。7. 调试工具链比算法更值得投入的部分我见过太多人把时间全花在算法上工具链凑合着用结果一个简单的时序问题查三天。机器狗是多输入多输出的实时系统没有好的观测手段调试就是盲人摸象。这一节讲讲我实际在用的工具和方法。7.1 数据记录与可视化第一件事是把所有关键变量记录下来每条腿的相位、足端位置、关节角度、关节力矩、IMU姿态、速度指令、实际速度。记录频率至少和步态层同频最好和伺服层同频。存成时间对齐的表格事后用脚本画图。可视化时我习惯把四条腿的相位画在同一张图上能一眼看出相位关系对不对把足端轨迹画成侧视图能看出抬腿高度和摆幅是否合理把IMU姿态和速度指令画在一起能看出平衡补偿的响应延迟。这些图比看数字直观一百倍。7.2 分阶段验证的流程调试机器狗一定要分阶段不能一上来就整机跑。我的流程是先单腿悬空验证逆运动学和伺服响应再四腿悬空验证相位关系和姿态补偿然后支架上验证落脚点规划最后落地慢走、快走、小跑。每个阶段都有明确的通过标准比如单腿阶段要求足端位置误差小于五毫米四腿悬空阶段要求姿态补偿后身体水平误差小于两度。这个流程看着慢其实快。因为每个阶段的问题范围小定位快。跳过阶段直接整机跑出了问题你面对的是所有层的耦合根本无从下手。7.3 常见故障的快速定位表现象最可能的原因排查方向上电就往一边倒关节零点错误重新标定零点走起来一顿一顿通信延迟过大检查下发方式改同步广播落地弹跳明显力矩控制刚度过高降低虚拟模型刚度加速时后腿打滑落脚点超前量不足增大落脚点增益转向时内侧腿拖地转向时抬腿高度未补偿转向时提高内侧腿抬腿高度被推后原地硬撑摔倒未启用捕获点迈步加入捕获点恢复逻辑这张表是我从实际调试里攒出来的覆盖了八成以上的常见问题。遇到新问题先对照这张表能省不少时间。8. 从零搭一套控制系统的落地顺序最后说说如果让我从零给一台机器狗搭控制系统我会按什么顺序做。这个顺序不是理论最优是踩过坑之后总结的最少返工路径。第一步把关节伺服层做扎实。标定零点、验证三种伺服模式、压通信延迟到两毫秒以内。这一步不做扎实后面全是空中楼阁。第二步实现逆运动学和正运动学用单腿悬空验证足端位置控制精度。第三步上相位驱动步态四腿悬空看相位关系支架上看落脚点。第四步加IMU姿态反馈做基础平衡落地慢走。第五步加虚拟模型控制做柔顺尝试小跑。第六步加捕获点做抗扰恢复。第七步接上层速度接口和路径跟踪。第八步才是考虑学习类方法做参数优化。这个顺序里每一步都有明确的验收标准通过了再进下一步。我见过太多人第三步还没稳就跳到第五步结果小跑摔了回头查发现是逆运动学的符号错了。分层推进每层验证是机器狗控制这种多耦合系统唯一靠谱的工程方法。提示每一步都保留一个可回退的配置版本。机器狗调试经常出现改好了A结果B坏了的情况有版本管理才能快速定位是哪次改动引入的问题。这套流程走下来一台中小型四足平台从零件到能小跑、能抗扰大概需要几周的专注调试。时间主要花在标定和参数整定上算法本身的代码量并不大。这也是我想强调的机器狗控制的难点从来不是某个高深的算法而是把每一层的细节做对、把层与层之间的接口对齐、把调试手段建起来。把这些基础工作做扎实标题里问的那些控制方法你自然就知道在什么场景该用哪个了。