简介:这份资源是Marc H. Raibert所著《Legged Robots that Balance》的PDF文档,面向足式机器人、动态平衡控制与人工智能方向的研究生、工程师及科研人员,系统讲解腿足式机器人如何通过主动平衡、运动控制与动力学建模实现稳定行走与奔跑。内容从1974年步行运动研究起源讲起,涵盖弹跳杆机器人原型、Leg实验室的机器研发历程,并深入剖析主动平衡、运动控制分解、动力学模型、传感器融合与反馈控制等关键技术,还涉及三维空间运动与多腿机器人奔跑等进阶议题。资源包共1个PDF文件,大小约7.13MB,便于在电脑或平板上直接阅读与检索。目前已有394人学习,适合希望理解动态腿部系统控制原理、借鉴经典算法思路并拓展研究视野的读者参考。
1. 足式机器人平衡算法:为什么“会摔”反而比“站稳”更难?
很多人第一次接触足式机器人,都会下意识觉得:让它站稳,不就是把重心投影到支撑多边形里吗?这个直觉在静态步行里成立,但一旦机器人跑起来,这套逻辑立刻翻车。因为奔跑时,机器人大部分时间只有一条腿触地,甚至存在腾空相,重心投影根本不在支撑域内。如果还按“重心必须在支撑域内”去控制,机器人要么原地不敢动,要么直接扑倒。
真正让足式机器人跑起来的,是主动平衡:允许机身短暂倾倒,再用落足点、腿部推力和姿态调整把倾倒“拉回来”。这套思路最早被系统化地写进一份经典技术文档里,它把跳跃、奔跑、平衡拆成可计算的三部分,并用单腿、双腿、四足机器人的实验反复验证。搞懂这套机制,你才能理解为什么波士顿动力那类机器人能跳能跑,而不是只会慢慢挪。
2. 三部分分解:奔跑控制为什么能拆成“高度、速度、姿态”三个独立问题?
2.1 跳跃循环的状态机:为什么不能连续控制?
足式机器人奔跑时,腿的运动是周期性的:触地、压缩、伸展、腾空、再触地。如果试图用一条连续轨迹去跟踪,控制器会陷入“每个瞬间都要精确计算”的泥潭。经典做法是把一个跳跃周期离散成几个状态,用状态机来切换控制目标。
常见的实现思路是:触地相只控制腿部推力,让机身获得向上的加速度;腾空相只控制腿的摆动,让脚落到下一个目标点。每个状态只关心一个主要变量,控制器复杂度大幅下降。这就像弹跳杆,你不需要每毫秒都调整姿态,只需要在触地时给一个合适的推力,剩下的交给弹簧和重力。
# 伪代码:跳跃循环状态机 state = "FLIGHT" while True: if state == "FLIGHT": # 腾空相:控制腿摆动到目标落足点 leg_swing_to(target_foot_position) if foot_contact_detected(): state = "STANCE" elif state == "STANCE": # 触地相:控制腿部推力,调节跳跃高度 thrust = compute_thrust(desired_height, current_height) apply_leg_force(thrust) if leg_fully_extended(): state = "FLIGHT"这段状态机的关键参数是desired_height和target_foot_position。高度控制通过触地相的推力大小来调节,速度控制通过落足点相对于机身的位置来调节。姿态控制则通过髋关节力矩来维持机身俯仰角。三者解耦后,每个控制器只需要处理一个主要变量,调试时也能单独排查。
2.2 对称与不对称:为什么落足点要偏离机身中心?
如果机器人每次落足都在机身正下方,它会原地弹跳,无法前进。要产生前向速度,落足点必须偏离机身中心。但偏离多少、往哪个方向偏,直接决定了机器人是加速、减速还是翻倒。
经典算法里,前向速度控制通过调整落足点相对于机身质心的水平偏移量来实现。如果当前速度低于目标速度,落足点就往前放一点,让地面反作用力产生向前的分量;如果速度过高,落足点就往后收,产生向后的制动力。这个偏移量与速度误差成正比,本质上是一个比例控制器。
# 前向速度控制:落足点偏移量计算 def compute_foot_offset(current_speed, desired_speed, kp=0.1): # 速度误差越大,落足点偏移越大 speed_error = desired_speed - current_speed foot_offset = kp * speed_error # 限制最大偏移,防止机器人翻倒 foot_offset = clamp(foot_offset, -max_offset, max_offset) return foot_offset参数kp决定了速度跟踪的响应快慢。kp太大,机器人会剧烈前后晃动;kp太小,速度跟踪迟缓。max_offset则受限于腿长和关节力矩,超过这个范围,机器人无法在触地相把速度拉回来。实际调试时,这两个参数需要根据机器人质量和腿长反复调整。
2.3 姿态控制:为什么机身俯仰角不能靠落足点来调?
落足点可以调速度,但调不了机身俯仰角。如果机器人触地时身体前倾,落足点再准,机身也会继续往前栽。姿态控制必须靠髋关节力矩:当机身前倾时,髋关节施加一个反向力矩,把机身“拉”回来。
常见的实现思路是:用陀螺仪测量机身俯仰角速度,用关节编码器估算俯仰角,然后通过 PD 控制器计算髋关节力矩。这个力矩不需要很大,因为触地时间很短,只要在几个周期内把姿态误差收敛到零即可。
# 姿态控制:髋关节力矩计算 def compute_hip_torque(pitch_angle, pitch_rate, kp=50, kd=5): # PD控制:角度误差 + 角速度阻尼 torque = kp * pitch_angle + kd * pitch_rate return clamp(torque, -max_torque, max_torque)kp和kd的选取需要权衡:kp太大,机器人会高频抖动;kd太大,姿态恢复变慢。实际系统中,这两个参数通常通过实验整定,而不是纯理论计算。因为腿部的弹性、地面刚度、触地时间都会影响姿态动力学。
3. 三维空间中的平衡:为什么平面控制算法直接搬到 3D 会翻车?
3.1 从平面到三维:多了哪些自由度?
平面跳跃机器人只有前后和上下两个方向,控制问题相对简单。一旦进入三维空间,机器人多了侧向移动和偏航旋转。如果直接把平面算法分别套到前后和左右两个方向,机器人会在侧向失去平衡。因为侧向落足点调整会改变偏航力矩,偏航又会反过来影响前后速度。
经典做法是:把三维平衡分解成前后、左右、偏航三个通道,但每个通道的控制器要互相补偿。例如,侧向落足点偏移不仅产生侧向力,还会产生偏航力矩,所以偏航控制器需要提前补偿这个力矩。这种解耦加补偿的思路,在工程上比直接解算完整动力学方程更实用。
3.2 虚拟腿:四足机器人为什么能像单腿一样控制?
四足机器人有四个腿,如果每个腿独立控制,控制器会变得非常复杂。经典方法引入虚拟腿概念:把对角的两条腿看作一条虚拟腿,虚拟腿的落足点是两条实际腿落足点的中点,虚拟腿的推力是两条实际腿推力的合力。
这样,四足机器人的奔跑控制就可以复用单腿的控制算法。虚拟腿负责高度、速度和姿态,实际腿只需要跟踪虚拟腿的落足点和推力分配。常见的实现思路是:对角腿的相位差固定为半个周期,这样虚拟腿的触地相和腾空相与单腿一致。
# 虚拟腿:对角腿合力与落足点计算 def compute_virtual_leg(leg1_state, leg2_state): # 虚拟腿落足点 = 两条实际腿落足点的中点 virtual_foot = (leg1_state.foot_position + leg2_state.foot_position) / 2 # 虚拟腿推力 = 两条实际腿推力的合力 virtual_force = leg1_state.force + leg2_state.force # 虚拟腿高度 = 两条实际腿高度的平均值 virtual_height = (leg1_state.height + leg2_state.height) / 2 return virtual_foot, virtual_force, virtual_height这个虚拟腿模型的前提是两条实际腿的动力学特性相近,且地面接触条件相似。如果一条腿打滑或踩空,虚拟腿模型会失效,机器人需要切换到恢复模式。实际系统中,通常会监测每条腿的接触力和关节力矩,一旦异常就触发恢复策略。
3.3 对称性:为什么奔跑机器人总是左右对称?
动物奔跑时,左右腿的运动是对称的,相位差半个周期。这种对称性不仅节省能量,还简化控制。经典分析表明,对称步态下,机器人的偏航力矩和侧向力可以相互抵消,机身只需要处理前后方向的动力学。
如果机器人采用非对称步态,比如一条腿触地时间比另一条长,机身会产生持续的偏航力矩,控制器需要额外补偿。常见的实现思路是:在步态规划阶段就强制对称,左右腿的触地时间、腾空时间、落足点偏移量都镜像对称。这样,控制器只需要处理前后通道,侧向和偏航通道的扰动可以忽略。
4. 避坑与排查:足式机器人平衡控制中常见的五个翻车现场
4.1 现象:机器人原地弹跳,无法前进
原因:落足点偏移量计算错误,或者速度反馈符号反了。如果落足点始终在机身正下方,地面反作用力没有水平分量,机器人自然无法前进。如果速度反馈符号反了,机器人会越跑越后退。
解决:检查落足点偏移公式,确认速度误差的符号与落足点偏移方向一致。用示波器或日志记录落足点位置和实际速度,观察两者是否同向变化。
4.2 现象:机器人跑起来后剧烈前后晃动
原因:速度控制器的比例增益kp太大,或者落足点偏移量没有限幅。增益太大时,机器人会对微小速度误差做出过度反应,导致前后振荡。没有限幅时,落足点可能偏移到腿长之外,机器人直接翻倒。
解决:降低kp,增加max_offset限幅。从较小的kp开始,逐步增大,直到速度跟踪响应满足要求但不振荡。
4.3 现象:机器人触地时机身俯仰角持续增大,最终前栽
原因:姿态控制器增益不足,或者髋关节力矩饱和。如果kp太小,姿态误差收敛太慢;如果max_torque太小,力矩不足以在触地时间内把机身拉回来。
解决:增大kp和max_torque,但要注意高频抖动。如果增大后出现抖动,说明kd也需要相应增大,用角速度阻尼抑制振荡。
4.4 现象:四足机器人虚拟腿模型失效,机器人突然摔倒
原因:一条腿打滑或踩空,虚拟腿的合力与落足点计算错误。如果一条腿的接触力突然降为零,虚拟腿推力会突变,控制器误以为机器人高度骤降,做出错误反应。
解决:监测每条腿的接触力,一旦某条腿接触力低于阈值,立即切换到恢复模式。恢复模式下,虚拟腿模型暂停,机器人用剩余腿维持平衡,直到打滑腿重新触地。
4.5 现象:机器人侧向漂移,无法保持直线奔跑
原因:左右腿的落足点不对称,或者偏航控制器没有补偿侧向力。如果左右腿的触地时间或落足点偏移量不一致,机器人会产生持续的侧向力,导致漂移。
解决:检查左右腿的步态参数是否镜像对称,确认偏航控制器是否在侧向落足点调整时提前补偿了偏航力矩。用陀螺仪记录偏航角速度,观察是否在触地相出现周期性波动。
5. 从表格控制到动物实验:这套平衡算法到底能走多远?
经典文档里还提到一种更激进的思路:表格控制。它不依赖在线计算,而是离线计算好一张“状态-控制量”查找表,机器人根据当前状态直接查表得到控制量。这种方法的优点是实时性极好,缺点是表格数据量随状态维度指数增长,三维空间下几乎不可行。常见的实现思路是:用多项式逼近表格数据,把查找表压缩成一组系数,在线计算多项式即可。这样既保留了表格控制的快速响应,又避免了存储爆炸。
另一个值得深挖的方向是动物实验。经典文档里对比了机器人和动物的奔跑对称性,发现动物在高速奔跑时也采用对称步态,左右腿相位差半个周期。这说明对称性不是工程妥协,而是动力学上的最优解。如果机器人要像动物一样高效奔跑,对称步态是绕不开的。
不过,这套算法也有明显的设计取舍。三部分分解假设高度、速度、姿态可以解耦,但在极端情况下,比如机器人从高处跳下,触地时间极短,三个通道的耦合会变得很强,解耦控制可能失效。虚拟腿模型假设对角腿动力学相近,但在湿滑或松软地面上,这个假设不成立。表格控制虽然快,但泛化能力差,换个机器人就要重新算表。
我一般会这么理解:这套算法的价值不在于它解决了所有问题,而在于它把足式机器人平衡这个看似混沌的问题,拆成了可计算、可验证、可迭代的模块。你可以先让机器人原地弹跳,再让它前后移动,再让它侧向移动,最后让它跑起来。每一步都有明确的控制目标和调试指标。从那以后我每次调试新的足式机器人,都会强制走一遍“高度→速度→姿态→侧向→偏航”的流程,先确保每个通道单独稳定,再逐步耦合。希望帮到你。
本文还有配套的精品资源,点击获取