尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
足式机器人动态平衡:三分解控制与虚拟腿实践
简介《Legged Robots that Balance》是 Marc H. Raibert 所著的足式机器人平衡控制经典文献面向机器人、人工智能、自动控制与机械电子方向的学习者和研究者帮助建立弹跳机器人、主动平衡与动态腿部系统的整体认识。内容从主动平衡、运动控制分解、动力学建模、传感器融合和反馈闭环等关键技术切入结合 Leg 实验室的机器原型、跑步机实验与计算机模拟梳理单腿弹跳、奔跑机器人、三维空间运动、多腿协调及机器人—动物对称性等研究脉络并保留前言与章节目录便于按主题查阅、复现实验思路和开展课题调研。压缩包为 7.13MB含 1 个 PDF 文件阅读与携带都较方便。已有 395 人学习可作为足式机器人平衡算法入门、课程拓展与论文选题的参考资料。1. 平衡不是站得稳足式机器人为什么必须学会“计划摔倒”一台能跑起来的腿式机器人在任意时刻都处在“快要摔倒”的状态。它的稳定不来自把重心压进支撑多边形而来自不断把落足点放到会让自己“摔回来”的位置——这套逻辑就是足式机器人平衡算法的核心。静平衡机器人像一张桌子动态平衡机器人像骑车的人前者怕倒后者靠倒。这份资料的价值在于它把“摔倒”拆成了三个可以分别计算的量——跳跃高度、前向速度、机体姿态并给出足部落点、推力、髋力矩三种执行手段。搞懂这套分解你才能明白为什么后来的四足、双足奔跑控制几乎都在它的阴影里打转。2. 三分解控制器奔跑为什么能拆成高度、速度、姿态三个独立闭环2.1 从固定连杆到状态机开环步态为什么注定翻车早期的步行机器走的是另一条路用连杆机构生成固定的足端轨迹。曲柄转一圈足端画出一个封闭曲线落地、支撑、抬起全靠机械结构保证计算机只需要解运动学、协调十几个电机的相位。这类机器在平地上能走一旦地形变化就废了——它的“步态”是焊死在几何里的没有反馈的余地。真正的转折不在算力而在对“控制对象”的重新定义。奔跑不是一个连续轨迹跟踪问题而是一个周期事件序列问题。腿的每个周期只有几个关键时刻触地、最大压缩、离地、飞行中点。控制器的任务是识别这些事件、在事件之间维持近似解耦的三个闭环。于是结构变成状态机# 单腿跳跃的状态机骨架简化自经典的 hopping 控制结构 # 状态STANCE 支撑相 / FLIGHT 飞行相 state FLIGHT t_touchdown None def tick(leg_len, leg_vel, pitch, pitch_rate, v_forward, dt): global state, t_touchdown if state FLIGHT and leg_len TOUCHDOWN_LEN: state STANCE t_touchdown now() elif state STANCE and leg_len LIFTOFF_LEN: state FLIGHT if state STANCE: # 支撑相只做三件事——补能量、定落点、修姿态 thrust hop_height_control(leg_len) # 垂直闭环 hip_tau attitude_control(pitch, pitch_rate) # 姿态闭环 return thrust, hip_tau, None else: # 飞行相腿摆到下一落点落点由速度闭环给出 foot_target foot_placement(v_forward) return 0.0, 0.0, foot_target关键点是支撑相和飞行相执行的动作完全不同却共用同一个“周期”节拍。高度控制只在支撑相有力可施落点选择只在飞行相有意义姿态控制横跨两相。这三个闭环能拆开是因为它们作用在不同的物理量上而且时间尺度差得足够远——高度环的周期是一个跳跃周期速度环是几个周期姿态环则必须快于半步频。常见的实现思路是先用仿真确认三者互不激发再谈参数整定如果一上来就把三个环耦合调基本等于在黑匣子里摸。2.2 垂直方向把弹跳当谐振每个周期补一次能量垂直方向最容易踩的坑是把它当成位置伺服给定一个高度让腿伸长到那个高度。这条路在动态系统里走不通因为身体在飞行相是抛体支撑相是弹簧位置根本追不上。正确的看法是这是一个储能-释能的谐振系统。一个周期里能量换了好几次形态身体下落重力势能变动能触地压缩动能变弹性势能腿伸展弹性势能又变回动能和势能。系统本身有阻尼腿的滞回、触地损耗所以每个周期都必须补一点能量否则振幅衰减跳着跳着就趴下。补能量的最佳时机是支撑相的中后段腿从最大压缩开始伸展的时候——这时候加法向力做正功效率最高。在飞行相怎么推都没用腿悬空没有反作用面。控制律通常长这样把期望跳跃高度换算成期望的离地速度用当前腿长和腿的伸缩速度估计离地瞬间的速度误差乘以增益作为附加推力。也有实现直接用飞行时间反推高度——飞行时间只取决于离地竖直速度物理关系干净不受腿长测量误差影响。def hop_height_control(leg_len, leg_vel, v_liftoff_meas, h_desired): # 期望离地速度由能量关系反推m*g*h 0.5*m*v^2 v sqrt(2*g*h) v_des (2 * G * h_desired) ** 0.5 err v_des - v_liftoff_meas # 只在腿伸展阶段注入能量压缩阶段推力置零避免吃掉弹性储能 if leg_vel 0: return K_THRUST * err return 0.0参数上K_THRUST太大会让每个周期补多、振幅发散表现为越跳越高然后失稳太小则衰减到停。工程上一般从“刚好补偿一个周期的能量损耗”起调观察连续十几个周期的峰值高度是否漂移。注意这里的“高度”指的是质心在飞行相中点的峰值不是腿长两者差一个机身几何量混用会让整定结果偏一个常数。2.3 水平方向让足部落点替速度控制干活水平速度控制最反直觉的一点支撑相里几乎不需要额外的水平力速度是靠“把脚放在哪”调出来的。腿在支撑相相当于一根撑杆脚固定在地面身体绕落点转。落点在质心前方撑杆把人往后顶减速落点在后方撑杆把人往前送加速。这个效应在一步之内就能改变速度比加水平推力更直接而且不消耗额外的能量。这就引出了整套方法里最漂亮的一个概念——中性点一个特定的落点位置脚放在那里支撑期结束时速度恰好等于触地时的速度一个周期净变化为零。中性点的位置不是质心正下方而是偏向运动方向因为支撑期内身体还要前进半个支撑期。落点相对中性点前后偏移就得到加速或减速。第 3 章会把这个几何关系展开这里先记住结论速度闭环的输出不是力是位置。2.4 姿态第三个闭环为何必须独立腿给身体的力线一般不过质心所以每次触地都会往躯干上灌一个力矩。如果不管躯干会越摆越大最后腿够不着地面。姿态环的作用是让躯干俯仰角回到期望值执行手段是髋关节力矩——腿的落点由速度环决定身体姿态由髋力矩修正两个自由度被分给了两个执行器。它能和另外两个环解耦原因有两个。一是力系正交竖直推力主要影响高度落点主要影响水平速度髋力矩主要影响角动量交叉耦合项在步频不太高时可以当扰动。二是带宽分层姿态环必须比步频快通常要求它的闭环带宽至少是步频的两到三倍否则每一步的扰动还没修完下一步就来了。很多“跑起来像喝醉”的样机问题不在姿态增益而在于姿态环带宽被机械柔性拖到了步频以下。注意三个环的采样率不该一样。姿态环用最高的控制频率高度环按事件触发速度环甚至可以每两三个周期更新一次。全部塞进同一个低频循环等于人为把三个环绑成一个慢环。3. 足部落点算法中性点为什么能决定加速还是减速3.1 中性点的几何定义一个周期内不改变速度的落点把支撑相近似成“质心绕足端转动”就能推出中性点。触地瞬间质心在髋部位置水平速度 v支撑期时长 T脚要在支撑期结束时刚好位于髋部正下方附近才不产生净的加速或减速。脚相对髋部的前向偏移近似为 v·T/2。这就是中性点它随速度线性移动速度越快脚要放得越靠前。完整的落点律在此基础上加一个反馈项def foot_placement(v_meas, v_des, T_stance, k_v): # 中性点支撑期结束时机体刚好走到脚正上方 x_neutral v_meas * T_stance / 2.0 # 误差项想加速就把脚放得比中性点靠后负偏移 x_offset k_v * (v_des - v_meas) return x_neutral x_offsetk_v的量纲是时间物理意义接近“用多少个周期的速度误差换一个落点偏移”。它决定了速度环的收敛速度也决定了超调。取太大速度会在目标值两侧振荡表现为忽快忽慢取太小收敛慢到几个周期都拉不回来机器人像在冰面上滑。常见做法是让它和支撑期时长同量级再用实验往小调因为落点偏移过大还会顺带改变姿态扰动把姿态环拖下水。这个公式里最容易被忽略的是T_stance必须是实测的支撑时长不是设定值。腿在软地面上下陷、触地检测有延迟都会让实际支撑期比设计值长中性点算小了系统就会持续轻微加速。这类偏差单步看不出来几十步之后就是撞墙。3.2 落点偏移的符号约定与增益选择符号搞反是新手最常见的翻车方式而且症状很迷惑机器人确实在调速但越调越远最后撞上边界。判断方法很简单——手动给一个恒定的落点偏置看速度是收敛到新值还是发散。收敛说明符号对、增益在稳定域内发散说明符号反了。还有一层容易被忽略落点偏移同时改变了支撑期的力矩臂。脚放得越靠后腿的力线相对质心的倾角越大躯干被顶得越厉害。所以速度环的增益上限实际上受姿态环能力约束。姿态环修不过来的时候你会看到速度收敛了但身体在前后点头这时候该降的是速度环增益不是加姿态增益硬扛。3.3 对称步态为什么反弹的镜像能消掉一阶扰动单腿连续跳的时候两次落地之间没有左右之分。但双足、四足一旦有两条以上的腿就出现了“这一步和上一步是否镜像”的问题。对称步态的定义是左右腿的支撑时长、腿长轨迹、落点相对中性点的偏移完全镜像。这样左右两步产生的一阶扰动符号相反在一个完整步态周期里互相抵消剩下的只有二阶小量。这个性质的价值在于把控制问题降维。如果步态是对称的你只需要为“一条腿的周期”设计控制器另一条腿照抄镜像即可横向的扰动会自动抵消不需要额外的横向稳定环。四足的 trot 就是典型对角两条腿同时支撑、同时摆动两对腿交替整体等效于一条虚拟腿在跳。资料里对对称性的处理不止于此——它把对称结构力学、时间反演对称、以及非对称步态比如前后腿不同步的 bound放在一起讨论说明哪些对称性是可以主动打破来换取机动性的。值得注意的是对称步态的抵消只对一阶扰动成立。如果左右腿的实际支撑时长因为触地检测差异而不一致镜像就被破坏扰动不再抵消会以一个低频拍频的形式累积表现为机器人周期性左右晃。诊断方法是记录左右腿的实测支撑时长序列看两条曲线的均值差是否稳定——稳定的小偏差可以补偿随机抖动就得先解决传感问题。3.4 姿态控制与角动量髋力矩如何把躯干拉回来姿态控制的执行器是髋关节。腿在支撑相时髋力矩的反作用一头推躯干、一头推腿因为腿被地面约束住净效果是躯干被转动。这里有个物理约束绕不开角动量守恒。躯干转腿就得反向转除非地面提供足够的摩擦矩。所以在低摩擦地面上姿态环的权限会被削弱这是硬限制加增益救不了。常见的实现是一个 PD 环加一点前馈补偿触地瞬间的力矩冲击def attitude_control(pitch, pitch_rate, pitch_des, kp, kd, tau_ff): err pitch_des - pitch # 髋力矩比例项修角度微分项抑制摆动前馈抵消触地冲击 return kp * err - kd * pitch_rate tau_ffkp决定“拉回来的力度”kd决定“别拉过头”。姿态环的整定顺序和速度环相反先把速度环断开让机器人原地跳把姿态环调到躯干在触地冲击下两三个周期内收敛再接速度环。反过来做的话速度环的落点变化会不断给姿态环灌扰动你根本分不清是谁在振。4. 虚拟腿四足为什么能跑成“一条腿”4.1 从支撑腿到虚拟腿力合成与等效四足跑起来的时候如果每次只有对角两条腿同时着地那这两条腿加在一起对机身的作用可以等效成一条从虚拟髋到虚拟足端的“腿”。等效的条件有三个两条腿的合力方向沿着虚拟腿的轴线、合力大小等于需要的支撑力、两腿各自产生的力矩在虚拟腿坐标系下相互抵消或可分配。这个等效不是数学游戏它直接决定了控制器能不能复用。一旦把对角双腿看成一条虚拟腿单腿跳跃那套三分解控制器原封不动搬过来虚拟腿的长度对应跳跃高度虚拟足端的落点对应速度虚拟髋的力矩对应姿态。四足的控制问题就被压回了单腿问题。这也是为什么资料里反复强调“单腿简化模型”——它不是为了偷懒而是因为它是一个可以严格成立的降维。等效的代价在力分配。虚拟腿给出的是合力和合力矩怎么分到两条实体腿上有无穷多组解。常见做法是按腿的几何关系做线性分配让两条腿的竖直力相等或按比例水平力按力臂反比分配。分配矩阵写错虚拟腿的力矩就抵消不掉机身会出现绕虚拟腿轴线的滚转这个滚转不在三分解的控制范围内只能靠额外的横向环修。def virtual_leg_force_split(F_total, r_left, r_right): # F_total: 虚拟腿需要的合力 (fx, fz) # r_left/r_right: 两条腿足端相对虚拟髋的水平位置 # 竖直力按力臂反比分配保证合力矩为零 w abs(r_left) / (abs(r_left) abs(r_right) 1e-9) fz_left F_total[1] * w fz_right F_total[1] * (1 - w) # 水平力按同样比例分配避免产生额外的偏航力矩 fx_left F_total[0] * w fx_right F_total[0] * (1 - w) return (fx_left, fz_left), (fx_right, fz_right)分配比例w会随步态相位变化。对角步态下两条腿的足端位置基本对称w接近 0.5一旦某条腿触地提前或滞后w就会偏力矩不再抵消。这也是四足比单腿难调的地方单腿只有一个落点要管四足有四个任何一个的时序偏差都会破坏虚拟腿的等效性。4.2 虚拟腿的力平衡与腿间分配虚拟腿的力平衡要写全三项竖直方向平衡重力加惯性力水平方向提供加减速所需的力绕虚拟髋的力矩平衡躯干姿态所需的力矩。前两项决定腿伸多长、蹬多狠第三项决定两条腿的力差。资料里把力平衡单独放在附录说明它是整套方法的地基——力平衡不成立前面所有的分解都是空中楼阁。实际操作中力平衡的误差主要来自两处一是腿的质量没算进模型高速摆动时惯性力可观二是触地瞬间的冲击力远超静态值分配矩阵按静态几何算的冲击一来就失配。处理方式通常是给竖直力加一个饱和限幅宁可短暂违背力平衡也不让关节吃过载。4.3 三维空间速度估计与圆形奔跑的偏航控制从平面跳到三维最直接的变化是速度不再只有一个分量。前向速度可以从足端着地时的水平位置和飞行时间反推脚在飞行相摆到某个前向位置触地后支撑期把身体送过去位移除以时间就是速度。这个估计的噪声比直接积分加速度计小得多因为它锚在地面上。横向速度和偏航角速度没有这么好用的锚通常要用惯性单元融合或者靠左右腿落点的不对称来间接控制。圆形奔跑是个很好的验证场景给定一个转弯半径机器人要同时维持速度、高度、姿态和向心加速度。偏航力矩从哪来一种办法是让外侧腿的落点比内侧腿更靠外支撑期产生一个指向圆心的水平力分量另一种是让虚拟腿的落点整体偏向圆心靠撑杆的侧向分力提供向心力。两种办法都会破坏左右对称姿态环要额外承担偏航方向的扰动。跑圆能跑稳说明三分解控制器在耦合项上还有余量跑不了圆往往是偏航通道根本没闭环只是靠对称步态的抵消在硬撑。5. 避坑与排查这些现象不是玄学是三个闭环在打架5.1 现象与根因对照现象一速度持续漂移越跑越快或越跑越慢。原因通常是中性点计算漏了支撑时长的一半或者用了设定支撑期而非实测值。落点系统性偏前会导致持续减速偏后则持续加速。解决方式是打印每步的落点偏移量看它的均值是否为零不为零就先补偿这个常值再谈增益整定。这类偏差有个血泪经验它在十步之内看不出来一百步之后就是撞墙。现象二跳跃高度周期性下沉几个周期后趴下。原因是能量注入的时机错了比如在腿压缩阶段还在加法向力把本该储存的弹性势能抵消掉了。表现是每个周期的峰值高度递减且递减量和推力增益正相关——增益越大衰减越快这个反直觉的现象就是时机错误的指纹。解决方式是只在腿伸展阶段施加推力压缩阶段推力置零重新标定离地速度的估计点。现象三躯干低频摇摆频率约为步频的一半。这是典型的采样混叠姿态环带宽低于步频的一半每一步的扰动被欠采样重构出一个低频包络。加大增益没用甚至会激发更高频的振荡。解决办法是把姿态环的控制频率提上去或者降低步频让两个时间尺度重新拉开。判断依据是摇摆频率与步频的比值接近 0.5 就基本可以确诊。现象四四足 trot 时侧向翻倒前后方向却很正常。虚拟腿的力分配没做力矩平衡两条支撑腿的竖直力不匹配产生了绕前进轴的滚转力矩。这个力矩不在三分解的任何一环里所以前后、高度都正常只有横向失稳。解决方式是检查分配矩阵的力臂项确认两条腿的足端位置用的是同一坐标系并给竖直力加限幅防止冲击时过载。现象五仿真里稳如泰山实机上第一次触地就翻。触地检测延迟是最常见的元凶。仿真里腿长一到阈值立刻切状态实机上传感器有滤波、有通信延迟等状态机反应过来腿已经多伸了几毫秒等效于落点整体偏移。另一个来源是腿的质量被忽略高速摆动时腿本身的动量在触地瞬间灌进机身。解决方式是给触地检测加预测补偿并在模型里补上腿的等效质量。5.2 参数整定与复现验证排查顺序应该是固定的先断速度环原地跳确认高度环和姿态环各自收敛再接速度环用恒定目标速度看是否收敛到常值最后才上转向和变速。每一步都要记录三个量——峰值高度、平均速度、姿态角标准差——这三个量的时间序列比任何单点指标都能说明问题。参数表建议按下面这样组织方便回溯参数作用环调整方向典型症状推力增益高度从刚好补偿损耗起调过大则振幅发散落点增益速度与支撑期同量级后往小调过大则速度振荡姿态比例增益姿态先于微分项整定过大则高频抖振姿态微分增益姿态抑制触地冲击过大则响应迟钝力分配力臂虚拟腿按几何实测标定偏差则侧向滚转6. 对称性与表格控制解析模型走到头之后怎么办跑到一定阶段解析控制律会撞上两堵墙。第一堵是耦合三分解的近似在低速、大步长时还能成立一旦接近极限工况高度环和姿态环的交叉项就大到不能忽略再推公式只会越推越复杂。第二堵是计算实时控制器要在毫秒级里解出力分配和落点复杂模型的求解时间不可控。对称性提供了一条侧门。如果系统的结构和运动关于某个平面是对称的那控制律也应当是对称的这意味着你只需要解一半的状态空间另一半由镜像给出更进一步某些运动在时间反演下也对称前后两个半步可以共用一套参数。对称性分析的价值不在于省计算而在于它告诉你哪些量是本质自由度、哪些是被结构约束掉的冗余。资料里把对称步态、非对称步态、剪切对称分开讨论实际上是在给“哪些对称可以打破”划边界——打破对称能换来机动性但也会引入原来不存在的耦合通道得有对应的闭环接住。另一条路是查表。把状态空间离散成网格对每个格子离线算好最优动作在线只做查表和插值。它的好处是把复杂的优化问题挪到离线在线延迟确定且极低代价是表的维数随状态数指数增长而且插值误差在边界附近会放大。常见的工程折中是先用解析控制律跑出数据再用低阶多项式拟合控制曲面理由是控制律本身光滑多项式逼近的残差可控而且求值只要几次乘加。需要注意的是拟合残差要按控制环分别评估——姿态环对残差最敏感高度环最不敏感用同一个误差阈值卡所有环等于给姿态环埋雷。我自己的习惯是任何一次从解析律切到查表或拟合都先做一遍“同状态对比”——把同一批状态点分别喂给解析律和查表逐点比输出差差值超过姿态环可容忍扰动的点单独标出来看它们是否集中在工况边界。这一步不做等到实机上才发现某段速度区间的控制量整体偏了半个身位那就要重新标定整张表。从那以后我每次改控制律的结构都强制走一遍同状态对比哪怕只是换了个插值方式。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

OpenMontage:开源自动化蒙太奇剪辑工具,让素材整理与卡点编排更高效

OpenMontage:开源自动化蒙太奇剪辑工具,让素材整理与卡点编排更高效

1. 项目概述:OpenMontage 到底在解决什么问题 1.1 一句话搞懂它是什么 OpenMontage 是一个开源的自动化蒙太奇剪辑工具,核心能力是把你手头那一堆杂乱无章的视频片段、照片、录音素材,自动分析、筛选、排序,最终合成一段有节奏感…

📅 2026/10/27 13:55:33
不完全去重技术:平衡存储效率与数据完整性的实践

不完全去重技术:平衡存储效率与数据完整性的实践

1. 不完全去重技术解析 在数据处理领域,不完全去重(Partial Deduplication)是一种平衡存储效率与数据完整性的关键技术。与传统的完全去重不同,它允许系统保留部分重复数据,这在某些特定场景下反而能带来更好的整体性能…

📅 2026/10/27 13:55:33
Bid2X:基于基础模型的广告竞价环境建模与优化

Bid2X:基于基础模型的广告竞价环境建模与优化

1. 项目概述:Bid2X与广告竞价环境建模 在数字广告生态中,竞价环境建模一直是核心挑战。传统方法往往局限于特定场景或简化假设,而Bid2X首次将基础模型(Foundation Model)视角引入该领域,通过KDD25论文披露的…

📅 2026/10/27 13:55:33
MORE NEWS

更多资讯

📰

可解释性安全强化学习:原理、技术与应用

1. 项目概述:可解释性安全强化学习的前沿探索"2025_NIPS_Explainably Safe Reinforcement Learning"这个标题直指AI安全领域最紧迫的挑战之一——如何在保持强化学习(RL)系统高性能的同时,确保其决策过程对人类透明且行…

📰

AI认知革命:从深度学习到人机协同的未来

1. 智能觉醒与认知革命:我们正在经历什么? 当AlphaGo击败李世石的那一刻,人类第一次真切感受到机器智能的威胁与魅力。七年过去,这场由深度学习掀起的AI浪潮已经彻底改变了我们的认知方式和社会结构。作为一名长期观察技术演进的从…

📰

端到端测试从入门到稳定:Playwright框架与profile配置实战

“e2e”三个字母,在测试工程师的键盘上敲下去的瞬间,往往意味着一条完整的用户旅程即将被自动化接管。做了这么多年测试,我从最早用Selenium写脆弱的回归脚本,到后来用Playwright搭出覆盖支付全链路的e2e体系,最大的感…

📰

重建用户信任的marketingskills实战方法论

1. 这不是“学营销”,而是重建你和用户之间的信任通道“marketingskills”——这个词最近在招聘平台、自由职业接单页、甚至咖啡馆里创业者闲聊时高频出现,但它绝不是PPT里那几张“4P理论”“AIDA模型”的幻灯片,更不是朋友圈刷屏的“三天速成…

📰

MFC DataGrid控件实战:ADO绑定、列格式与排序避坑

简介:面向VC/MFC开发者的DataGrid控件实战讲解文档,聚焦在对话框程序中借助Microsoft DataGrid OLEDB 6.0控件完成数据网格展示的常见需求,适合具备C与MFC基础、希望在既有工程中快速接入表格控件的初中级开发者参考。内容围绕查询结果显示、…

📰

MySQL状态统计的高效实现与优化技巧

1. MySQL状态统计的核心场景与实现逻辑 在数据库日常运维和业务分析中,状态统计是最基础也最高频的操作之一。订单状态(待支付/已发货/已完成)、用户活跃度(新用户/活跃用户/流失用户)、设备在线状态等业务场景&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬