机器狗这东西,第一次上手的人十有八九会卡在同一个地方:硬件装好了,电机能转了,遥控器一按也能走两步,可一旦想让它做点"像样"的动作——比如小跑、爬坡、原地转身、被踹一脚还能站稳——就发现完全不知道从哪儿下手。标题问的是"控制方法有哪些",但真正值得聊的不是列个清单,而是每种方法解决什么问题、在什么阶段用、彼此怎么衔接。我做过几个四足平台的运动控制调试,从最朴素的舵机时序到模型预测控制都趟过一遍,踩的坑不算少。这篇就把机器狗控制这条链路从底到顶拆开讲,既说清楚原理,也给得出能直接照着调的参数和步骤,不管你是刚买套件的学生,还是要把平台做成产品原型的工程师,都能从中找到自己那一层该干的事。
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坏了"的情况,有版本管理才能快速定位是哪次改动引入的问题。
这套流程走下来,一台中小型四足平台从零件到能小跑、能抗扰,大概需要几周的专注调试。时间主要花在标定和参数整定上,算法本身的代码量并不大。这也是我想强调的:机器狗控制的难点从来不是某个高深的算法,而是把每一层的细节做对、把层与层之间的接口对齐、把调试手段建起来。把这些基础工作做扎实,标题里问的那些控制方法,你自然就知道在什么场景该用哪个了。