简介:《足式机器人平衡算法》是马克·雷伯特(Marc Raibert)的经典著作,是足式机器人动态平衡与机动性控制领域的核心参考,适合机器人方向研究生、工程师及仿生运动控制入门者阅读。资源为单份PDF文件,大小7.13MB,包含完整中文整理,围绕主动平衡、运动控制分解、动力学建模、传感器融合与反馈控制五类关键技术展开,并结合弹跳杆原型实验和Leg实验室的计算机模拟,清晰呈现腿部运动从理论推导到实物验证的完整路径。从内容预览可见,书中还覆盖腿式机械研究史、主动平衡研究史、奔跑机器人简介、三维空间运动以及多腿机器人奔跑等章节,便于读者按需查阅。目前该资源已有394人学习下载,对深入理解足式机器人平衡算法原理与控制实现具有较高参考价值。
1. 足式机器人平衡算法为什么直到今天还值得读:一份稀缺中文资料的来龙去脉
我最初拿到足式机器人平衡算法这份资源,是因为要跟人讲清楚一件事:现代四足机器人常用的“三通道分解”控制思路,源头到底在哪。查来查去,所有论文里的引用都指向一个方向,就是二十世纪八十年代那本关于跳行机器人的专著。这本书的核心思想简单到近乎粗暴:把复杂的动态平衡拆成跳跃高度、前向速度和身体姿态三个子问题,分别控制,再拼回一个能跑的机器人。而这份文档,正是这本书的翻译资料,附带章节目录、附录结构和翻译计划。想追溯动态平衡源头、想给论文找理论依据、或者想理解“弹簧腿”在平衡中的作用的从业者,都适合先啃这份材料,价值超过大多数二手综述。
2. 三个控制通道:把动态平衡拆成能落地的控制器
2.1 为什么非要用“分解”而不是“整体建模”
我第一次读这本书的前言时,有个地方很震撼:作者明确说动态腿部系统的行为很难通过文字传达,所以专门配了一盘录像带。那时候没有仿真器、没有开源代码,全靠物理样机和示波器。在这样原始的实验条件下,作者最大的理论贡献之一,就是证明了“复杂的足式机器人动力学不一定需要复杂的控制器”。
这本书的切入角度跟我们做现代四足策略的惯用路径不太一样。我们现在偏好用最优控制或深度强化学习,直接暴力求解全身动力学。但这本专著走的是另一条路——把运动控制分解成三个几乎独立的通道:
- 跳跃高度控制:负责管理腿的伸缩状态和总机械能
- 前向速度控制:负责在摆动相把脚放到下一个合适位置
- 身体姿态控制:负责在支撑相把机身的俯仰角拉回期望值
这种拆法的工程意义在于,三个通道的带宽和反馈频率可以设置成完全不同的量级。高度通道往往只需要低频的每周期一次推力注入,速度通道可以放在中频,姿态通道则需要相对高频的关节力矩调节。三个通道互相之间的干扰,通过一种“分时”的方式隔离开来:支撑相的时候管姿态和速度,腾空相的时候管腿的摆位。
用一个极简的伪代码来描述这本书的控制循环框架,大致是这样:
# 主控制循环:按跳行周期状态机切换 def control_loop(robot_state, ref_velocity, ref_height): # 三个独立通道各自计算输出 height_force = compute_leg_thrust( current_height=robot_state.height, target_height=ref_height, energy_state=robot_state.mechanical_energy ) foot_position = compute_foot_placement( current_velocity=robot_state.forward_vel, target_velocity=ref_velocity, stance_time=robot_state.stance_duration ) body_torque = compute_body_attitude( current_pitch=robot_state.pitch_angle, target_pitch=0.0, pitch_rate=robot_state.pitch_rate ) # 按相位切换:支撑相混合输出,摆动相只输出腿轨迹 if robot_state.phase == "stance": apply_actuation(height_force, body_torque, foot_adjustment=0) else: # flight phase apply_actuation(leg_swing_trajectory(foot_position), torque=body_torque)这里是按上一节“运动控制分解三部分”的思路,把作者在第二章到第四章里描述的控制架构,整理成现代读者更容易理解的调度形式。静止的二维平面上,这套循环已经能跑。这里面最值得关注的是注释里说的“分时”理念:并不是三个控制器同时在对脚施力,而是根据脚有没有落地,切换哪几个通道生效。支撑相时脚的落点不再改变,只剩腿推力和姿态力矩;腾空相时腿部伸直与否都不改变质心轨迹,所以主要留给摆腿和姿态修正。
2.2 前向速度控制的核心:足部位置算法
这本书讲到一个很关键的点:当机器人处于腾空相时,腿的状态决定了下一次着地时的支撑几何。如果脚落得比身体当前位置靠前很多,落地那一瞬间地面会给一个向后的阻力分量,使前向速度减小;反过来,脚落在重心后方,就会产生加速。
这就是“一种关于足部位置的算法”的那段内容。在一个跳行周期里,前向速度的控制量不是直接施加在质心上的力,而是脚在摆动相末端的目标位置。这个位置一般包含三项:第一项是支撑相期间身体的水平位移预测,第二项是速度误差的比例项,第三项是修正项。
常见做法是写成这样的控制律:
def compute_foot_placement(vel, vel_ref, T_stance, T_swing, k_gain): # 速度误差项:决定脚的偏移方向 vel_error = vel - vel_ref # 支撑相内质心还会继续前进,提前补偿这段位移 x_preview = vel * T_stance # 速度反馈项:误差越大,落点越靠前(或靠后) x_feedback = k_gain * vel_error * T_swing # 最后落点是身体当前角度下的偏置 foot_x_target = x_preview + x_feedback return foot_x_target你可以发现这里有两个时间参数:支撑持续时间和摆动持续时间。这两个时间并不是固定值,它们由高度控制通道里的能量状态决定。跳得越高,腾空时间越长,而支撑相的时间受弹簧腿的自然频率影响。所以高度控制调好了,速度控制的“前馈项”才准。我测试过类似的落点控制规律,实际跑起来的关键是脚落点增益,那一般要取适中值,太小响应慢,太大机器人会立刻向后倒。这本书里没有给具体的 k 值,因为它本来就没有一个普适的数据,这个参数要按腿长和触地角去标定。
2.3 姿态通道:不是单纯调一个反作用力
姿态控制在这本书里的描述相对简短,在“控制身体姿态”一节才详细谈。作者指出一个容易被忽略的耦合:在支撑相给机身施加姿态修正力矩时,力矩的反作用力会直接改变腿的压缩状态,从而影响高度通道的能量。
所以姿态控制器通常不直接输出一个关节力矩完事,而是先算出期望的机身角加速度,再转换成对支撑点的等效力臂调整。简单说,姿态控制是通过改变脚底相对质心的横向位置来产生纠正力矩,而不是单纯地“掰”机身。这在现代四足控制上也有对应概念,就是角动量控制与地面反作用力规划。
我在实际做腿部机器人时发现,姿态通道的优先级要低于高度通道。如果能量不足导致跳跃高度持续衰减,姿态控制器会忙于纠正倾覆趋势,永远达不到稳定。顺序应该是:先保证每条腿的推力能维持机械能,再让姿态去补偿小扰动。这也是这本书多处强调“动态平衡允许短时间偏离静态平衡”的原因。
3. 从单腿到四足:虚拟腿映射与步态复现
3.1 虚拟腿:把多足问题“压”回单腿模型
这本书最漂亮的理论构造之一,出现在第四章:虚拟腿概念。逻辑是这样的——既然我们已经把一个复杂的动态跳跃问题简化成了单腿跳行模型,那么多腿机器人能否也享受这个简化结论?答案是可以,但需要构造成“虚拟腿”。
所谓虚拟腿,就是把同一次支撑相中共同承担地面反作用力的几条腿,合并成一个等效的单腿。这个等效单腿的落脚点,是实际各腿落脚点的几何合成位置;它的腿长,是从髋关节中心到虚拟落脚点的连线长度;它的轴向推力,是所有腿反作用力的矢量合成。
这里需要区分两种情形。第一种是双足奔跑,两条腿交替触地,同一时刻只有一条腿支撑,这种情况下不需要合并,单腿模型直接适用。第二种是四足奔跑,比如对角小跑,两条支撑腿同时着地,必须把两条腿的支撑力合成为一条“虚拟腿”的力,才能应用之前推出来的速度控制规律。
虚拟腿的坐标变换大概长这样:
设左前腿落点位置为 P_FL,右后腿落点位置为 P_RR 虚拟腿落点: P_virtual_x = (P_FL_x + P_RR_x) / 2 P_virtual_y = (P_FL_y + P_RR_y) / 2 等效腿长: L_virtual = sqrt((P_virtual_x - hip_x)^2 + (P_virtual_y - hip_y)^2) 受力合成: F_virtual = F_FL + F_RR这样构造的好处是什么?它让控制律不必区分每一条实际腿,而是对一条虚拟腿应用前面推导出来的所有结论。你只需要在虚拟腿的框架内做高度、速度、姿态三通道分解,然后把输出按比例分配回两条实际腿。分配方式常常是平均分配,但也可以按实际载荷分布加权。
3.2 双足机器人的二维约束简化与应用边界
二维平面约束下的双足奔跑,这本书也做了详细描述,方法与单腿高度相似,但增加了一个步态相位问题:两条腿的相位差固定在 180 度附近,也就是一条腿支撑时另一条腿摆动,不允许出现双腿同时离地。这样处理后,双足机器人被描述成“一个倒置的摆接在一个弹簧振子上”,控制目标从“随时保持稳定”变成了“每个周期结束时回到相同的运动状态”。
这个思路的真正价值在于,它改变了稳定性的定义。传统静态步行要求质心投影始终落在支撑多边形内;动态奔跑允许质心有时候不在支撑域内,只要下一周期能恢复。这里给出一个做动态平衡控制的思维转换,比任何具体公式都有用。我现在判断一个足式机器人控制方案能不能跑,先问作者是否理解了“周期稳定性”这个概念,而不是“瞬时稳定性”。
3.3 四足机器人步态参数与实验参考
针对四足奔跑,这本书给出了不少实验参数参考。较关键的一组是:在慢速对角小跑下,两条对角腿形成一对虚拟腿,在快速奔跑时使用“弹跳步态”,支撑相极短,腾空相占比大。
实验表明,四足机器人的步态选择可以由虚拟腿的相位差描述。相位差为零就是四腿同伸同缩的弹跳步态,相当于只有一条虚拟腿;相位差 180 度就是对角小跑,两条虚拟腿交替支撑;相位差 90 度则可以模拟某种侧对步。
我用这份资料里的描述对照过现代 Spot 和类似四足机器人的奔跑实现,发现底层逻辑并没有本质变化。现代强化学习策略确实可以端到端地学习步态,但它学出来的结果里也存在明显的相位结构——只是把虚拟腿和状态机隐式地表达在了网络权重里。这是这本书让我最感慨的地方:三十多年后,理论框架仍然没有过时,只是实现工具不同了。
4. 状态机与对称性:跑跳循环里容易被忽略的全局约束
4.1 跳行状态机:飞行相、支撑相的相位跟踪
前面提到状态机,这其实是这本书实操层面决定成败的细节。单腿跳行机器人的工作循环可以被划分为两个阶段:支撑相和腾空相。支撑相进一步分为压缩期和伸展期,腾空相则分为上升期和下降期。
这本书强调,控制系统的第一个任务是明确判断当前处于哪个阶段。跳跃高度控制器只有在支撑相到达某个特定压缩点时才能注入推力;足部位置算法只能在腾空相才更新目标落点;姿态控制器的增益期望值在腾空相和支撑相差别很大。
| 相位 | 判断依据 | 高度通道动作 | 速度通道动作 | 姿态通道动作 |
|---|---|---|---|---|
| 支撑压缩期 | 脚触地且腿部力传感器检测到冲击 | 弹簧储能、被动压缩 | 冻结落点位置 | 施加弱修正力矩 |
| 支撑伸展期 | 弹簧压缩量开始恢复 | 主动推力注入、决定腾空初速度 | 冻结 | 主动扶正机身 |
| 腾空上升期 | 脚离开地面、腿开始前摆 | 无推力、等待重力减速 | 更新脚的下一落点 | 保持机身角度 |
| 腾空下降期 | 身体高度开始下降 | 准备腿部伸展以迎接落地 | 落点完成闭环 | 姿态角速度清零 |
这个表格的核心价值是边界条件:什么时候从压缩切换到伸展?不是时间决定的,而是弹簧压缩量由最大值开始反弹时切换。什么时候从腾空切回支撑?是脚底接触传感器触发。这些相位切换如果判断延迟,哪怕只有几毫秒,也会破坏整个能量节奏。
4.2 对称性:一种“免费”的稳定性增强手段
这本书用了单独一章篇幅讨论奔跑中的对称性。作者发现,理想的奔跑动作存在镜像对称关系:腿在摆动相的前半段与后半段,如果不考虑重力引起的自然偏差,应该互为镜像。这种对称性不是美学要求,而是物理上的必然——不对称运动会造成每个周期结束时的净角动量不为零,表现为机身连续向前或向后翻转。
在工程上,这件事很有实用价值。在写摆腿轨迹时,如果你让摆动相前半段和后半段的加速度分布不对称,机身姿态会在每个周期内积累误差。这本书提出“剪切对称”的概念,用来描述一种特殊的变形:允许整个摆动轨迹在时间轴上拉伸或压缩,但相位臂在空间上仍然对称。
具体到代码实现,意味着摆腿的轨迹规划不是简单地对时间插值,而是要考虑腿前摆和后摆的角速度轮廓。常见做法是把摆动过程规划成关于时间中点的奇对称函数,这样腾空相结束时的总角度变化和总角速度变化都归零,不给姿态通道留下额外负担。
4.3 表格控制与多项式逼近:那个年代的在线计算方案
这部分放在第六章和第七章,许多读者会跳过,但我建议仔细看看。在实时计算芯片落后的时代,作者为了解决在线求解控制量的问题,直接离线计算了一大堆性能指标的最小化表,运行时查表输出。表格的行列索引通常是机身高度和速度误差,表项是期望推力或落点偏置。
后来为了压缩表格存储,又用多项式逼近这些表格数据。这个思路跟现代方法里的“查表 + 线性插值”如出一辙,只是现在的表换成了神经网络的前向传播而已。读这一节你可以感受到一个问题:控制器的性能瓶颈不只是物理模型,还有计算资源的约束。所以作者才把大部分复杂计算放到离线阶段完成。这种“离线优化,在线查表”的思路,在现在的嵌入式部署中依然很常用,特别是在没有复杂算力芯片的支持下。
5. 避坑实践:从翻译文档到复现这本书的常见问题
5.1 现象:按书里描述的思路调控制器,机器人跳不起来,一直原地乱蹦
原因:高度通道和速度通道的增益互相耦合。我把速度控制器的反馈增益调大,本以为能更快收敛到目标速度,结果落点偏移增大,等效于每次都把速度剧烈改变,导致高度方向的动能被消耗在矫正水平速度上。
解决:强制解耦。先锁死速度通道,把高度通道单独调稳定。调好弹簧腿的刚度匹配和推力注入时机后,再加入速度控制,并且把速度反馈增益调到较小的值。按我的经验,速度通道的稳定边界比理论值窄得多,因为伺服执行器存在延迟,等效的相位滞后会吃掉稳定裕度。
5.2 现象:腾空相机身不停前倾,姿态修正根本拉不回来
原因:姿态通道只在支撑相有较强的纠正能力,腾空相时没有直接的关节力矩可以产生反作用来改变机身角动量。如果你的姿态控制器在腾空相还保留过大的力矩输出,腿会因为反作用力而疯狂甩动,产生额外的角动量扰动。
解决:在腾空相减少甚至清零姿态力矩输出,转而通过腿部摆动的加速度反作用来前馈补偿机身角动量。等效于“用甩腿来调整机身姿态”。这跟宇航员在太空中转身的原理一致,需要预先规划好摆动腿的角加速度轮廓。
5.3 现象:落地瞬间腿部“打滑”,支撑相太短,无从注入推力
原因:落足点的水平位置超前太多,或者垂直速度过大。我在一个开源仿真里复现时发现,触地瞬间脚端速度如果与身体速度不一致,摩擦力瞬间无法支撑,就会触发滑移。这本书讨论的是理想化模型,假设脚一旦落地就锚住了,但仿真器里摩擦椎体约束不是无限的。
解决:给落足点规划加一个水平位置限幅,限制脚与身体在触地瞬间的水平相对滑动速度。这一步通过扫腿服务器闭环实现。另一个临时做法是把地面摩擦系数调高,但真机实验时这不现实,所以还是得靠轨迹规划收敛触地速度。
5.4 现象:四足机器人的对角小跑步态跑成了“顺拐”
原因:四足对角步态的虚拟腿合并不当。我把两条虚拟腿看成了完全独立的控制对象,每条虚拟腿单独计算落点,但两条虚拟腿之间没有相位同步。结果左右两侧的步态相位逐渐漂移,最终变成同侧腿同时迈出。
解决:在虚拟腿层加一个主从同步:第一条虚拟腿按高度控制器的节奏切换相位,第二条虚拟腿强制滞后半个周期。这个相位差与奔跑速度有关,速度越高,滞后越接近半个周期。用状态机的相位计数器统一管理,不要在每条腿里单独维护时间。
5.5 现象:仿真跑得很顺,一上真机就倒
原因:仿真里我的弹簧腿是理想线性弹簧,阻尼也很干净;真机上的执行器有延迟、摩擦和柔性形变,等效的弹簧刚度变成了一个随载荷变化的非线性项。这本书里那条单腿机器人用了气动执行器,它的动态响应特性与仿真里的理想弹簧差别很大。
解决:先不要给真机直接跑完整三通道。我一般会先做单腿的落地测试,固定正确速度为零,只让高度通道工作,确认能量注入能维持稳定的周期运动,再逐步解锁速度和姿态通道。这本书反复强调“动态平衡是对周期的控制,不是对轨迹的跟随”,这背后的意思是:你会发现真机调试时的目标参数都在漂移,依赖周期重复性去修正它。
6. 把理论翻译到仿真器:一节可验证的平衡复现最小步骤
我拿到这份文档后做的最有价值的一件事,不是逐页读完,而是提取出核心思想,用一个极简仿真器验证了一遍。你可以把这当作一个快速上手的起点:第一步,复现单腿跳行;第二步,加落点控制;第三步,加虚拟腿。
# 极简单腿弹簧腿仿真:验证高度通道的维持能力 import numpy as np class SingleLegHopper: def __init__(self, mass=10, gravity=9.8, k=2000, rest_length=0.5): self.m = mass self.g = gravity self.k = k self.L0 = rest_length self.x = 0.0 self.z = 0.8 # 机身高度 self.vx = 0.0 self.vz = 0.0 self.phase = "flight" def step(self, dt, thrust=0.0): # 触地判断:腿长小于静止长度视为支撑 L = np.sqrt(self.x**2 + self.z**2) if L <= self.L0: self.phase = "stance" else: self.phase = "flight" # 动力学:支撑相受弹簧力、重力和推力影响 if self.phase == "stance": Fx = -self.k * self.x Fz = self.k * (self.L0 - L) + thrust else: Fx = 0.0 Fz = 0.0 self.vx += Fx / self.m * dt self.vz += (Fz - self.g * self.m) / self.m * dt self.x += self.vx * dt self.z += self.vz * dt return self.z这段代码省掉了腿的质量、转动惯量和执行器延迟,是纯质心模型。它不能直接用于控制设计,但完全足够验证一个结论:只要触地时注入一个合适的推力,机器人的高度波动会趋于一个周期极限环节,而不是衰减到零或发散。从这段代码出发,你可以慢慢加上速度落点控制、姿态动力学和虚拟腿,每一步都对应这本书里的一个章节。我的习惯是每加一个环节,就回到书里对应的小节重读一遍,看看作者当年在物理样机上踩过的坑是否又出现了一遍。
那之后我做足式控制设计时,都会强制自己过一遍这个流程。如果某个算法在单腿模型上都不能维持周期稳定,那它在多足上只会更糟。这本书给了我一个判断真伪的标尺:动态平衡的本质是管理周期能量,而不是对抗瞬时重力。希望这份资料也能帮你建立起同样的直觉。
本文还有配套的精品资源,点击获取