☰
Raibert足式机器人平衡算法:动态平衡与虚拟腿控制解读
2026/10/11 21:17:22 网站建设 项目流程

简介:《足式机器人平衡算法》(Legged Robots that Balance)是足式机器人平衡控制领域的经典专著,由麻省理工学院学者Marc H. Raibert撰写,系统阐述腿足式机器人动态稳定行走与奔跑的核心问题,适合机器人研究者、算法工程师及自动化专业学生深入研读。压缩包内是完整的PDF电子书,共1个文件,大小约7.13MB,内容涵盖主动平衡、运动控制、动力学建模、传感器融合与反馈控制等关键技术,并配有作者在Leg实验室的真实实验说明。书中从1974年的步行探索讲起,梳理了从弹跳杆原型到三维空间多腿机器人的研发历程,指出肌肉和肌腱的弹性在动物肢体运动控制中的关键作用;目录划分为简介、动力学与平衡性提高机动性、腿式机械研究史、主动平衡研究史、奔跑机器人简介、三维空间运动、多腿机器人奔跑等章节,结构清晰,便于按需查阅。目前已有394人学习下载,对需要设计足式机器人平衡算法、开展运动控制仿真或撰写相关论文的读者,这份资料兼具理论深度与工程参考价值,可帮助快速建立足式机器人动态控制的知识框架。

1. 这本四十年前的足式机器人平衡算法书,为什么今天还要读

“Legged Robots that Balance”这本书在足式机器人圈子里的地位,有点像控制论里那本《Cybernetics》——人人都听说过,真正翻完的人却没想象中那么多。它是 Marc H. Raibert 在 1985 年出版的经典著作,里面记录的是他在 MIT、CMU 做的那些会跳跃的单腿机器人,以及他后来用“虚拟腿”概念让双足和四足跑起来的完整控制思路。你后来看到的不少足式机器人平衡算法、动态步行研究,甚至一些商业四足产品的控制架构,都能在这本书里找到原型。这份资源是把原书翻译整理成 doc 的中文资料,适合两类人看:一类是刚入行、想弄明白足式机器人平衡到底在平衡什么的学生;另一类是已经在写代码、却总在稳定性和调参上翻车的工程师。

2. 先搞清楚 Raibert 在解决什么问题:动态平衡不是“站稳”,而是“别摔倒”

2.1 为什么单腿机器人是研究平衡的最佳实验对象

这本书从头到尾的核心研究对象,不是双足人形机器人,而是一条腿。乍看反直觉,但这是理解全书方法论的门把手:一条腿在空中没有支撑面,落地时只有一个点接触地面,重心投影几乎不可能落在支撑点之内。这意味着“静平衡”这个概念在单腿机器人身上完全不成立。Raibert 想说明的恰恰是这一点——足式机器人在高速运动时靠的从来不是静平衡,而是动态平衡:在每一个瞬间都在“即将失衡”的边缘,靠下一次落足把失衡纠正回来。

单腿模型把这个问题压缩到最小:一个质量块加一条可伸缩的腿,没有第二对称腿来掩护,也没有上半身配重来降低控制难度。所有控制逻辑必须直面一个事实:身体在飞行阶段是一颗纯粹的抛物体,水平和垂直运动解耦,只有落地后的支撑相才有力和力矩可以施加。这个“最小系统”一旦能稳定跑起来,把同样的控制架构推广到双足、四足,就只是数学上的扩展,而不是原理上的改变。

2.2 三分解控制:高度、速度、姿态三个回路互不干扰

Raibert 对足式机器人平衡算法最大的理论贡献,是把原本纠缠在一起的控制问题拆成了三个互不耦合的回路。这个思路在书里反复出现,也是你在自己项目里最容易照搬的部分,分解关系如下表所示。

控制回路执行时机执行手段被控量
高度控制飞行相末期与支撑相初期腿部推力/弹簧压缩量垂直跳跃高度
前向速度控制支撑相(落足时)调整足端相对质心的水平偏移水平速度
姿态控制支撑相全程髋关节/身体与腿部之间的力矩机体俯仰角

这三个回路的关键设计原则是:把它们放在不同类型的执行机构上。高度控制靠腿的伸缩和推力,速度控制靠足端落点超前或滞后,姿态控制靠躯干相对腿的力矩。比如,你可以把腿部想象成一根带刚度的弹簧,落地后压缩、再释放,撑起身体的下一段飞行,这就是高度回路;而如果机器人飞得太慢,就让它把脚落在身体前方更远一点的位置,利用落地点相对质心的偏移来加速,这是速度回路;姿态回路则只管一件事——在整个支撑相这个很短暂的时间窗口里,通过髋部力矩把机身拉回水平。

这三种控制之所以能拆开,根本原因是时间尺度不同:高度回路的周期等于整个跳跃周期,速度回路只在支撑相开始的那一瞬间起作用,姿态回路则在支撑相内持续闭环。我在复现这套逻辑时体会最深的就是这一点——不能用一个 PID 把所有事情包了,必须让每个回路在它该起作用的时间窗口内单独工作。

2.3 把三分解控制写成可执行的状态机和策略

落到实现层面,Raibert 的控制逻辑非常适合用状态机描述。整个弹跳循环只包含两个状态:飞行相(Flight)和支撑相(Stance)。状态转移条件在书中的实验里有明确界定:飞行相以“脚接触地面”为结束信号,支撑相以“脚离地”为结束信号。关键点在于,两个状态下的控制目标完全不同,飞行相内所有执行器基本都是自由状态或只做摆腿准备,支撑相才真正执行高度补偿和姿态纠正。

# 单腿弹跳控制状态机,逻辑参照 Raibert 三分解控制 state = "FLIGHT" # 初始状态:飞行相 while running: if state == "FLIGHT": # 飞行相:不做姿态纠正,只规划落地足端位置 foot_pos = compute_foot_landing_position( vx_current, vx_desired, flight_time_left, k_landing ) # 如果检测到脚底接触力大于阈值,切入支撑相 if contact_force > CONTACT_THRESHOLD: state = "STANCE" elif state == "STANCE": # 支撑相:做两件事——垂直推力补偿高度、髋部力矩补偿姿态 thrust = compute_thrust( vy_current, vy_desired, leg_compression, k_thrust ) hip_torque = compute_hip_torque( pitch_angle, pitch_rate, k_pitch, k_pitch_rate ) # 如果腿部伸展到位且接触力消失,回到飞行相 if contact_force < CONTACT_THRESHOLD and leg_extension > LEG_LENGTH_MAX: state = "FLIGHT"

这段状态机的重点不在代码本身,而在两个容易被忽略的细节。一个是接触力的判定阈值。真实机器人落地时,脚底传感器的信号会有大量噪声尖峰,如果你只在飞行相检测一次接触,一个误触发就会让整条腿提前进入支撑相,下一轮跳跃的高度和水平速度全部被打乱。一般我会做双重确认:接触力超过阈值且持续 2~3 个控制周期,才确认进入支撑相。

另一个细节是支撑相结束的判断不能只靠接触力消失,要叠加“腿部已伸展到接近原长”这个条件。原因是离地瞬间腿可能还在压缩回弹的中途,过早切回飞行相,姿态控制会提前释放,机身带着俯仰角飞出去。书里虽然没有讨论这些工程细节,但状态机的框架是完全一致的:两个状态、四个转移条件、三个控制量各管各的窗口。

参数方面,高度回路里最重要的增益是推力系数 k_thrust,它决定了一个周期内补充多少垂直能量。取值太大,机器人会越跳越高直到腿完全伸直后翻倒;太小,则每周期掉一点高度,最终贴地。一般做法是先用仿真跑一个“零速度原地弹跳”,把垂直速度误差收敛作为调参目标。速度回路的 k_landing 则决定足端落点偏移对水平速度误差的响应强度,实际调试时对这个系数最敏感,后面避坑章会专门展开。

3. 从单腿到四足:虚拟腿是这本书里被引用最多的概念

3.1 双足奔跑:两条腿合成一条“虚拟腿”

如果只有单腿机器人能稳定跑,那这本书还不会成为经典。Raibert 的多腿扩展思路非常优雅:与其为每条腿单独设计平衡控制器,不如把多足机器人的腿分组,每组腿在控制层面“合并”成一条虚拟腿。双足机器人在支撑相时,两条腿同时着地,它们的合力等同于一条虚拟腿的力;在飞行相时两条腿摆动,也可以看作虚拟腿在摆动。这样一来,双足奔跑的控制问题就退化成了单腿奔跑的控制问题——你只需要控制一条虚拟腿。

实现虚拟腿合成时,核心是求两条真实腿对机身的合力等效点。书中的做法是把两条腿的足端位置取中点,把两条腿的推力矢量相加,在计算时用这个等效力替代两条腿各自的力。这非常像机械臂运动学里的腕点等价变换,但注意这里不是简单平均——两条腿的刚度不同、压缩量不同时,等效点会偏向刚度更大那条腿。仿真里用好,实机上要对两条腿的液压缸或电机出力做实时测量,否则虚拟腿的等效点计算会失真。

3.2 四足奔跑的控制架构:前腿一组、后腿一组

四足机器人的处理方式在书中更加直接。四条腿被分成前后两组:前腿组和后腿组各自合成为一条虚拟腿,于是四足机器人被抽象为“两条虚拟腿”的动态系统。步态方面,Raibert 在书中讨论过多种对称跑法,最典型的是跳跃步态和弹跳步态:四条腿同时离地、同时落地,前虚拟腿与后虚拟腿的相位差为 0 或 180 度,分别对应四足腾空的马式奔跑和前后交替的奔跑步态。

采用虚拟腿模型后,四足机器人的运动控制就被拆成了这样的层级关系:最底层是单腿的力控制和位置控制,中间层是虚拟腿的合成与分解,最上层是 Raibert 三分解控制。

层级控制对象输入信号输出
最高层质心运动与姿态期望前向速度、期望高度虚拟腿的落足点偏移、推力、髋部力矩
中间层虚拟腿分组虚拟腿控制指令分解到每条真实腿的关节空间
最底层关节执行器各腿关节力矩/位置指令实际电机电流或液压阀开度

这个分层结构今天看可能觉得是理所当然的,但在 1985 年提出是很有前瞻性的:控制器不必在意“这条腿此刻单独在做什么”,它只管虚拟腿的行为,真实腿之间的协调由几何分解去完成。这种抽象最大的实际收益是:你在仿真里调四足跑,可以先调“两条虚拟腿”的参数,调稳定后再做真实腿的映射,调试维度少了一半。

3.3 虚拟腿概念落地的几个操作细节

做虚拟腿组装时,位置插值不是唯一的步骤。写入你代码里的其实是一组齐次变换,要注意:虚拟腿的足端位置要用世界坐标系表示,不能用机体坐标系表示。因为我们真正关心的等效落足点,是相对地面的,机体坐标下的足端位置在机身姿态变化时会发生旋转,直接平均会产生严重的误导。

姿态补偿也要在合成前完成。书中的控制顺序是:先对单腿做姿态控制,再组虚拟腿。换句话说,姿态误差在每条真实腿的髋部关节处就已经经过力矩分配,再去做整体合力计算,顺序反了会让两条腿的控制目标互相冲突。

如果做的是带弹性元件的气动/液动腿,虚拟腿的刚度合成必须按“力等效”而不是“位置等效”。两条腿并联时,整体等效刚度是两个刚度之和;如果前腿刚度是后腿的 3 倍,虚拟腿等效点会明显前移,这时再按几何中点做落足点计算,实际跑起来会发现机器人低头。

4. 落地避坑:复现平衡算法时最容易翻车的四个环节

4.1 仿真里稳如泰山,实机一上电就侧翻

现象:同一套控制器和参数,在仿真环境里跑得笔直,搬到真实机器人上,前几步就开始往侧面倾倒,甚至直接一步就翻。

原因:仿真模型默认了理想传感器——接触检测无延迟、关节力矩零摩擦、腿部刚度线性不变。真实机器人的每条腿都有弹性形变、关节间隙、作动器响应延迟,尤其是足端落地瞬间的冲击力会让接触传感器产生多次触发。Raibert 的控制架构里,飞行相到支撑相的转换依赖接触信号,这个信号一旦在前几步里被抖动干扰,高度回路和姿态回路就会在不该介入的时间窗介入。

解决:接触检测必须做滤波和滞后判断。我的习惯是在足端传感器数值上做一个 2ms 窗口的滑动平均,同时让状态机采用“迟滞切换”——接触力超过阈值 5N 且保持 3 个控制周期才置为支撑相,掉到阈值以下 3N 且保持 3 个周期才置为飞行相。这套逻辑能在不改动控制算法的前提下,把仿真到实机的迁移成功率大幅提升。

4.2 姿态回路一加反馈就开始震荡

现象:单独跑高度和速度回路,机器人虽然跳得不够优雅,但能稳定循环;只要把姿态闭环的俯仰角反馈加进来,机身开始前后摇摆,越摆幅度越大。

原因:姿态回路和速度回路之间存在耦合——你通过髋部力矩调整机身姿态,物理上会改变足端相对质心的水平位置,而足端位置恰恰是速度回路的核心控制量。两个回路都在支撑相工作,带宽相近时就会打架,这是三分解控制最微妙的边界。Raibert 的书里没有展开讲回路解耦的具体调法,但实验章节里暗示了一个经验:姿态回路的带宽要比速度回路高一个量级。

解决:姿态控制在每个支撑相内做的第一件事,就是快速把机身在几十到一百毫秒内拉回头部角度目标,速度回路则在这种瞬态完成之后才根据剩余支撑时间调整。实际操作时,我把姿态回路的 P 增益调得足够大,但只在支撑相开启后前 30% 的时间窗内全力工作,后面阶段逐渐退让给速度回路。这个时间窗的划分是每台机器都要重新调的,不能直接照抄。

4.3 跳跃高度周期性衰减,三个周期后贴地

现象:机器人起跳正常,但每个周期的跳跃高度都在降低,大约三个周期后腿的伸展量完全不足以离地。

原因:高度回路只在前一个周期结束时计算一次能量补偿量。真实系统里,每条腿的作动器都有响应延迟和能量损耗,实际补偿量达不到计算值,每个周期都在欠补偿。这是典型的“计算模型完美、执行系统残缺”问题。

解决:在高度回路中引入垂直速度误差的积分项,而不是只看当前周期的瞬时误差。具体做法是记录最近四个周期顶点处的垂直速度,算出平均值与期望值的偏差,把偏差的积分值叠加到本周期推力指令上。这个积分项等价于一个自适应补偿器,能自动补上作动器损耗的坑。但要注意积分项需要限幅,否则一旦出现传感器异常尖峰,积分器会把推力指令推到危险值。

4.4 计算机里跑飞了:控制频率不足导致支撑相采样点太少

现象:把控制频率从 1000Hz 降到 500Hz 后,跳跃开始出现周期性的“跛行”,有时提前离地,有时支撑相里姿态纠正幅度不够。

原因:支撑相在快速奔跑时持续时间只有 100~150ms。500Hz 下,整个支撑相只有 50~75 个控制周期;而姿态回路需要的响应时间约 30ms,这意味着它只有 15 次左右的调整机会,完全不够用。

解决:把高速控制和低速规划分开。Raibert 的三分解控制里,支撑相内的关节力矩要跑实时闭环,至少 1000Hz;而“下一步落脚到哪里、推力多大”这类规划信息,在飞行相内以 50~200Hz 的低频预先算好即可。这个分层在仿真里不容易看出问题,实机上却直接影响稳定性。

5. 奔跑中的对称性:用物理学给控制算法做校验

5.1 书里说的对称性到底是什么

第六章到第五章之间,Raibert 花了一整章的篇幅讨论对称性。这部分初看像是对动物运动规律的理论观察,实际上它是一个用于校验控制算法的数学工具。这里的对称性不是指外形左右对称,而是指运动轨迹的时间对称:一个跳跃周期被飞行相的顶点分成前后两半,如果后半段飞行轨迹是前半段的时间镜像——上升段和下降段速度曲线关于峰值时刻对称,那么这个系统的能量结构就是自洽的。换句话说,控制律没有偷偷消耗或引入额外能量。

在实际调试里,对称性是一个“免费”的诊断手段。你的机器人飞起来后,记录质心垂直速度曲线:理想情况下,它应该像一条对称的抛物线。如果上升段比下降段陡,说明高度回路推力过大,多余的垂直能量被憋在系统里;如果下降段更快,说明腿部刚度和推力补偿不足。我一般在仿真里做免费弹跳时,会顺手打印质心垂直速度的对称误差指标,大于 5% 就说明能量管理还不够干净。

5.2 剪切对称与非对称步态控制的换算关系

书中除了时间对称,还引入了剪切对称——把支撑相的腿部轨迹做横向剪切变换,可以让原本对称的步态变成转向运动。这个概念在实现层面的意义非常实用:三维空间中的转弯,不需要单独设计一套“转向控制器”,只需要在原本的对称步态上,给足端落点叠加一个很小的横向偏移量,偏移量的大小正比于期望的转向角速度。这样转弯就变成了对称奔跑的一个参数调制,而不是控制架构的更换。

我在做四足转向调试时用到了这个思路。具体做法是给每条虚拟腿的落足点方程增加一个横向分量,这个横向分量等于转向率乘以一个超前时间常数。注意这个叠加要在虚拟腿分解到真实腿之前完成,否则两条腿会各偏各的,转弯姿态扭曲。

5.3 对后来足式机器人速度控制的影响

这本书出版后,动态足式机器人研究在很长一段时间内都在用“对称性”来约束设计。它回答了一个当时很关键的问题:飞行阶段人无法干预,支撑段时间又极其短暂,控制律到底该把计算资源花在哪里?答案是花在让运动保持对称性上——因为它意味着每个周期的能量收支平衡,姿态和高度不会累计误差。今天很多高速跑动机器人的控制策略,你往回对照,都能在“保持对称性”这个原则上找到思想的影子。

如果看完整本书再回头看自己的代码,你会发现:稳定跑起来的关键不一定是更复杂的控制律,而是让简单控制律在各个维度上保持对称性,尽量让不必要的瞬态误差消失在空中。这本书提供的不是一个可以直接套用的算法库,而是一套怎么判断你的算法是否走偏了的物理直觉。这恰恰是很多现代足式机器人项目中缺失的部分——代码越来越复杂,物理校验却缺席了。

6. 把这本书读薄:我复现时固定下来的调试顺序和习惯

6.1 调试顺序决定你一天调完还是一周调完

拿到这本书后最容易犯的错误,是直接从四足虚拟腿开始搭建控制器,最后四个回路一起互相干扰,根本没法定位问题。我复现时用了很长时间才摸出合理的调试顺序:先确认单一跳跃高度闭环稳定,再锁死高度、加姿态回路让机身不乱转,最后才加水平速度控制让它真正“跑”起来。

如果你在仿真里从零搭建,建议按以下参数表来初始化一个虚拟的“平面单腿机器人”。这套参数是最常用的初始起点,数值取自书中实验描述与后续常见的复现设置:

参数含义常用初始值调参方向
机身质量质心之上的等效质量8.0 kg质量越大,高度回路推力增益要同步加大
腿部刚度支撑相腿部等效弹簧刚度2400 N/m刚度太小撑不起跌落冲击
腿部原长飞行相腿完全伸展时的长度0.6 m长度变化会影响髋部力矩臂
控制频率支撑相内关节闭环频率1000 Hz低于 500Hz 时姿态回路会失效
首次落足偏移速度回路的初始落足点偏差0.05 m过小会原地踏步,过大会栽跟头

6.2 一个值得养成的检查习惯:每个周期打印对称误差

现在无论我是在仿真里复现足式机器人平衡算法,还是在实际机器人上换了一个新的腿部结构,都会强制让机器人先跑一个“原地弹跳测试”,然后打印三样东西:质心垂直速度的对称误差、机身俯仰角在支撑相内的均方根误差、相邻两个周期跳跃高度的差值。这三项指标,分别对应高度回路、姿态回路和速度回路的健康度。只要这三项都落在各自阈值的 5%~10% 以内,我才会继续把期望速度从 0 慢慢往上加。

从那以后,我调试足式机器人平衡算法时,再也没有一上来就满怀期待地推期望速度的推杆。理解这本书最核心的收获,不是记住某一个控制律,而是在动手之前先建立“这个系统在物理上应该怎么运动”的图景——剩下的事情,就是用代码去逼近那个图景。希望这份阅读和调试路径能帮你少走一些我当年走过的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询