本文档属于 Robotics Tutorial 项目,作者:Pengfei Guo,达妙科技。采用 CC BY 4.0 协议,转载请注明出处。
专题 5 · 混合动力系统与 Saltation 矩阵:接触事件的离散跳跃及其灵敏度¶
本章定位:本专题与专题 3(李群)/专题 4(Contact-Implicit 优化)构成"接触建模光谱"的两端——专题 3/4 把接触"抹平"成约束或互补条件,本专题则**显式建模**接触为 guard 触发的 reset。核心工具是 混合自动机 / 混合包含(hybrid automaton / hybrid inclusion)(描述框架)与 Saltation 矩阵 \(\Xi\)(跳跃矩阵)(一阶灵敏度跳跃律);四大落脚点是 HZD 步态综合、Salted Kalman Filter 状态估计、HiLQR-MPC 反向传播、Impact-Invariant Tracking 控制。学完本专题,你才能理解 Cassie/Digit 为何不是"给 ZMP 糊一层 MPC"。
前置依赖:第零批线性代数(特征值、Jacobian、矩阵指数)、实分析(ODE 存在唯一性、隐函数定理);专题 1-4(互补问题、摩擦锥、时步法、可微接触仿真);控制理论专题 3.5(LQR/Riccati,HiLQR 复用其反向传播)。
关键文献:Aizerman-Gantmakher 1958(\(\Xi\) 原始出处)、Goebel-Sanfelice-Teel 2012(混合系统圣经)、Westervelt-Grizzle 等 2007(HZD 唯一权威教科书)、Kong-Payne-Zhu-Johnson 2024 Proc. IEEE(本专题首选入口教程)、Burden-Sastry-Koditschek-Revzen 2016 SIADS(\(\Xi\) = B-导数)。
前置自测¶
📋 前置自测(答不出 ≥ 2 题 → 先回对应前置章节复习)
-
[实分析] 常微分方程初值问题 \(\dot x = f(x),\ x(0)=x_0\) 的解对初值 \(x_0\) 的导数 \(\partial x(t)/\partial x_0\) 满足什么矩阵微分方程?(提示:变分方程 / 状态转移矩阵)这个矩阵在 \(f\) 光滑时为什么处处存在?
-
[线性代数] 给定一个标量函数 \(g:\mathbb R^n\to\mathbb R\) 与一个向量场 \(F\in\mathbb R^n\),表达式 \(\nabla g^\top F\) 的几何含义是什么?什么时候它等于零?(提示:方向导数 / 水平集的切空间)
-
[实分析] 隐函数定理的陈述是什么?给定 \(G(x,t)=0\),在什么条件下可以局部把 \(t\) 解为 \(x\) 的光滑函数 \(t=\tau(x)\),并写出 \(\partial \tau/\partial x\) 的表达式?
-
[专题 1-2] 刚体接触的 Signorini 条件 \(0\le \lambda_n\perp \phi(q)\ge 0\) 是什么意思?法向接触力 \(\lambda_n\) 与间隙函数 \(\phi\) 为何互补?冲击(impact)与持续接触(sustained contact)在数学上的区别是什么?
-
[控制理论] 线性时变系统 \(\dot x = A(t)x\) 的状态转移矩阵 \(\Phi(t,t_0)\) 满足 \(\dot\Phi = A(t)\Phi,\ \Phi(t_0,t_0)=I\)。周期系统的 Floquet 理论说什么?单值矩阵(monodromy matrix)的特征值(Floquet 乘子)如何决定周期轨稳定性?
自测答案要点(先自己想,再对照):(1) 变分方程 \(\dot\Phi = \tfrac{\partial f}{\partial x}\Phi,\ \Phi(0)=I\),\(f\in C^1\) 时 Picard-Lindelöf 保证解光滑存在。(2) \(\nabla g^\top F\) 是 \(g\) 沿 \(F\) 方向的变化率(李导数 \(L_F g\));当 \(F\) 与 \(g\) 的水平集相切时为零。(3) \(\partial_t G\neq 0\) 时可解,\(\partial\tau/\partial x = -(\partial_t G)^{-1}\partial_x G\)。(4) \(\lambda_n\phi=0\) 表示"要么有接触力(\(\phi=0\)),要么有间隙(\(\lambda_n=0\))";冲击是有限冲量在零时间内改变速度,持续接触是有限力在有限时间内作用。(5) Floquet:周期系统的解可写成周期函数乘指数;\(|\lambda_i(M)|<1\) 对所有 \(i\) ⟺ 周期轨指数稳定。
本章目标¶
学完本章后,你应当能够:
- **形式化**混合动力系统:用 GST 混合包含、混合自动机、脉冲效应系统(system with impulse effects)三套语言写出同一个足式步态模型,并解释为什么不同分析任务偏好不同框架。
- 推导 Saltation 矩阵 \(\Xi\) 的三步几何推导(扰动切换时刻 → pre-flow 推进 → reset + post-flow 拉回),并解释它为什么**不等于** reset Jacobian \(D\Delta\)——多出的那一项是"时间错位的一阶补偿"。
- **构造**混合系统的变分方程与单值矩阵分解 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\),用 Floquet 乘子判定周期步态的轨道稳定性。
- 设计 HZD 虚拟约束与零动力学流形,理解 impact invariance 条件 \(\Delta(\mathcal S\cap\mathcal Z)\subset\mathcal Z\) 为何让欠驱动双足的稳定性可解析判断(标量 LTI 返回映射)。
- 应用 \(\Xi\) 到三个工程场景:Salted Kalman Filter 的协方差跳跃律 \(P^+=\Xi P^-\Xi^\top+Q_\Xi\)、HiLQR 在事件处的值函数反传 \(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\)、Impact-Invariant 跟踪控制让误差落入 \(\ker(I-D\Delta)\)。
- 诊断 Saltation 理论的失效边界:横截性 \(\nabla g^\top F^-\neq 0\) 破坏时的 grazing 分岔(擦切分岔)、多接触同时触发的 codim-2 退化、Zeno 现象对数值积分器的要求。
- **桥接**本专题与足式控制实践:把抽象的 \(\Xi\) 落到 SLIP/倒立摆/Cassie 的具体 reset 与 guard 上,理解它与专题 4(接触隐式优化)、05 足式简化模型(LIPM/SRBD)的分工与互补。
本章知识导航¶
在深入推导之前,先用一张全景图建立本章的知识结构。本章的逻辑主线是一个**层层递进的灵敏度问题**:
混合动力系统与 Saltation 矩阵
│
├── 第 0 层:为什么需要"混合"这个抽象(§5.0)⭐
│ 连续 ODE 不够用 → 接触是离散事件 → 需要"流 + 跳变"的统一语言
│
├── 第 1 层:混合系统的形式化(§5.1)⭐⭐
│ ├── GST 混合包含 H=(C,F,D,G):流集/流映射/跳集/跳映射
│ ├── 混合自动机 H=(Q,X,f,Init,Inv,E,G,R):离散模态 + 连续状态
│ └── 脉冲效应系统:HZD 学派的单接触简化形式
│
├── 第 2 层:guard 与 reset(§5.2)⭐⭐
│ ├── Guard(切换面):g(x)=0 的水平集 + 横截性方向条件
│ ├── Reset(跳变映射):刚性冲击的速度投影公式
│ └── 恢复系数分类:弹性 e=1 / 部分弹性 / 塑性 e=0
│
├── 第 3 层:穿越时刻灵敏度(§5.3)⭐⭐⭐(Saltation 推导第一步)
│ ├── 问题:扰动什么时候穿过切换面?
│ ├── 隐函数定理推 δt = -∇gᵀδx⁻ / ∇gᵀF⁻
│ └── 横截性是 δt 良定义的地基
│
├── 第 4 层:Saltation 矩阵 ⭐⭐⭐(本章核心,§5.4)
│ ├── 三步推导:pre-flow → reset → post-flow
│ ├── Ξ = DΔ + (F⁺ - DΔ·F⁻)∇gᵀ / (∇gᵀF⁻ + ∂ₜg)
│ ├── 几何直觉:reset Jacobian + 时间错位补偿
│ └── Ξ 即 Bouligand 导数(B-导数)
│
├── 第 5 层:变分方程与稳定性(§5.5)⭐⭐⭐
│ ├── 混合变分方程:光滑段 Φ̇=AΦ,跨 guard Φ⁺=ΞΦ⁻
│ ├── 单值矩阵 M = Φₙ Ξₙ ⋯ Ξ₁ Φ₀
│ ├── Floquet 乘子 → 周期步态稳定性
│ └── 常秩降维定理 → 模板模型合法性
│
├── 第 6 层:横截性失效与 Zeno(§5.6)⭐⭐⭐
│ ├── Grazing:∇gᵀF⁻→0 ⇒ ‖Ξ‖→∞
│ ├── 多接触 codim-2:Ξ₂Ξ₁ ≠ 联合推导(B-导数)
│ └── Zeno:有限时间无穷次跳变
│
├── 第 7 层:HZD 混合零动力学(§5.7)⭐⭐⭐
│ ├── 虚拟约束 y=h(q)-h_d(θ(q))
│ ├── 零动力学流形 Z={y=0, ẏ=0}
│ ├── Impact invariance: Δ(S∩Z)⊂Z
│ └── 标量 LTI 返回映射 → 解析稳定性
│
├── 第 8 层:Saltation 的工程应用(§5.8)⭐⭐⭐
│ ├── Salted Kalman Filter: P⁺=ΞP⁻Ξᵀ+Q_Ξ
│ ├── HiLQR-MPC: V_x←ΞᵀV_x, V_xx←ΞᵀV_xxΞ
│ └── Impact-Invariant Tracking: ker(I-DΔ)
│
├── 第 9 层:数值实现与陷阱(§5.9)⭐⭐⭐
│ ├── 事件驱动积分 + 根查找精确定位穿越
│ └── 抖动 / grazing / Zeno / 协方差秩亏 / mode 误设
│
└── 第 10 层:桥接(§5.10)⭐⭐
├── ← 专题 3(李群):Lie 群上的 reset 与 adjoint
├── ← 专题 4(CI 优化):mode 已知 vs 求解器选
├── → 05 足式简化模型:Ξ 落到 SLIP/LIPM/Cassie
└── → 专题 6(Model-Based RL):梯度穿越接触事件
推荐阅读路径:
- 第一遍(建立框架,约 4 h):§5.0 → §5.1 → §5.2 → §5.3 → §5.4(三步推导)。这条路径让你掌握"混合系统是什么 + \(\Xi\) 怎么来的",足以读懂大部分论文的记号。
- 第二遍(稳定性理论,约 5 h):§5.5(变分方程与 Floquet)→ §5.7(HZD)。这两节是足式步态稳定性的数学核心,需要 Floquet 理论与 Poincaré 映射的配合。
- 第三遍(工程落地,约 5 h):§5.6(失效边界)→ §5.8(三大应用)→ §5.9(数值实现)→ §5.10(桥接)。这条路径回答"理论在什么时候崩,以及怎么用在真机上"。
三条线索的关系:本章可以看成三条线索交织——(A)描述线(§5.0-5.2,怎么写下一个混合系统)、(B)灵敏度线(§5.3-5.6,扰动怎么传播、何时失效)、(C)应用线(§5.7-5.10,稳定性证明、控制/估计落地与数值实现)。三条线在 \(\Xi\) 这个对象上汇合:描述线给出 \(\Xi\) 所需的全部材料(\(F^\pm,\Delta,g\)),灵敏度线推导并分析 \(\Xi\),应用线把 \(\Xi\) 嵌入 Kalman/iLQR/Floquet。
注意:知识导航只展示**结构**,不展开具体内容。看不懂上面的某个符号是正常的——它们会在对应小节从动机讲起。
前置知识桥接¶
本章站在三个前置支柱上。这里用 2-3 行重新激活每个支柱的核心要点,这样你不必翻回去也能跟上。
桥接 1 · 来自实分析的变分方程(状态转移矩阵)。 回顾:对光滑 ODE \(\dot x=f(x)\),初值 \(x_0\) 的微小扰动 \(\delta x_0\) 沿轨迹传播,满足线性化方程 \(\dot{(\delta x)}=A(t)\,\delta x\),其中 \(A(t)=\partial f/\partial x|_{x(t)}\) 是沿标称轨迹的 Jacobian。解记为 \(\delta x(t)=\Phi(t,t_0)\,\delta x_0\),\(\Phi\) 称为**状态转移矩阵**,满足 \(\dot\Phi=A(t)\Phi,\ \Phi(t_0,t_0)=I\)。在那里我们用 \(\Phi\) 分析平衡点的局部稳定性。现在我们要处理的新问题是:当轨迹中途撞上一个切换面、速度突然跳变时,\(\Phi\) 在那一刻该怎么"接上"?答案就是本章核心的 \(\Xi\)——它是连接 \(\Phi(t^-)\) 与 \(\Phi(t^+)\) 的跳跃律。
桥接 2 · 来自专题 1-2 的接触模型(Signorini 与冲击)。 回顾:专题 1 把法向接触写成互补条件 \(0\le\lambda_n\perp\phi(q)\ge0\)——间隙 \(\phi\) 与法向力 \(\lambda_n\) 不能同时为正。当物体高速撞击地面,\(\phi\) 在零时间内从正变零,需要一个**有限冲量** \(\Lambda=\int\lambda_n\,dt\) 把法向速度从 \(\dot\phi^-<0\) 拉回到 \(\dot\phi^+\ge0\)。这个"零时间内的速度跳变"正是本章 reset 映射 \(\Delta\) 的物理来源。在那里我们关心的是"如何求解接触力",现在我们关心的是:这个速度跳变对初值扰动的导数(reset Jacobian \(D\Delta\))是什么,以及它如何嵌入更大的灵敏度 \(\Xi\)。
桥接 3 · 来自控制理论 3.5 的 Riccati 反向传播。 回顾:LQR 的离散反向传播是 \(V_{x,k}=\ell_x+f_x^\top V_{x,k+1}\)、\(V_{xx,k}=\ell_{xx}+f_x^\top V_{xx,k+1}f_x\),其中 \(f_x\) 是单步动力学的 Jacobian。iLQR(专题 3.5.C)在轨迹附近反复线性化、把 LQR 当子程序。在那里 \(f_x\) 是光滑的。现在的新问题是:当 backward pass 跨越一个接触事件(guard)时,\(f_x\) 不再是普通 Jacobian,而必须替换成 \(\Xi\)——这就是 §5.7 的 HiLQR。理解这个替换是把 LQR 推广到含接触系统的关键一步。
如果跳过本章会怎样¶
下面两个具体场景说明不学本章的后果:
-
场景一:你给 Cassie 写了一个 EKF,机器人一落地协方差就"发疯"。 你用标准 EKF,在触地瞬间把状态用 reset 映射 \(\Delta\) 更新、协方差用 \(D\Delta\) 传播:\(P^+=D\Delta\,P^-\,D\Delta^\top\)。结果落地后位置估计的方差小得离谱(过度自信),滤波器开始拒绝合理的观测,状态发散。根因:你漏掉了 \(\Xi\) 中"位置不确定性通过触地时刻不确定性耦合进速度"的那一项(Kong 2021 Automatica 的核心信息)。不学 §5.3 和 §5.7,你永远不知道少了什么。
-
场景二:你想用 iLQR 优化一个含跳跃的运动,求解器在接触切换处疯狂震荡、永不收敛。 你"直接对
if分支 autodiff",让自动微分穿过接触判断。在 grazing(擦触)附近,梯度方差爆炸,cost 不降反升。根因:穿越混合事件的合法梯度是 \(\Xi\)(piecewise flow 的 B-导数,Burden 2016),不是朴素 autodiff,更不是 reset Jacobian。不学 §5.3-5.5,你会把这归咎于"iLQR 不适合接触"——而真相是你用错了灵敏度。
这两个场景不是假想——它们正是 Kong/Johnson 和 Yang/Posa 等人 2020-2023 一系列论文的直接动机。本章就是这些论文背后那"一行 \(\Xi P^-\Xi^\top\) 从哪里来"的完整数学。
预计阅读时间¶
| 阅读方式 | 时间 | 适合谁 |
|---|---|---|
| 精读(含推导与练习手算) | 16-20 h | 要做足式控制/估计研究、需要自己推 \(\Xi\) 的读者 |
| 速读(跳过 Floquet 与 Zeno 细节) | 6-8 h | 已有混合系统基础、只想补 \(\Xi\) 与 HZD 的读者 |
| 速查(只看公式块、表格、速查卡) | 40 min | 读论文时回来查 \(\Xi\) 公式、guard 写法、术语翻译 |
§5.0 为什么混合动力系统是独立的数学难题 ⭐¶
这一节解决什么问题:我们已经有了光滑 ODE 理论(专题 3 的 SE(3) 流)和把接触嵌入连续优化的互补理论(专题 4),为什么还需要"混合"这第三套语言?这一节先不给任何定义,而是从一个最朴素的物理场景出发,让你**感受到**连续 ODE 的天花板,从而理解混合系统不是数学家的洁癖,而是被现实逼出来的。
动机:一只脚踩到地面,连续 ODE 算不清¶
整个第七批接触力学的主轴是一个问题:"一只脚踩到地面这件事,到底怎么让计算机算清楚?"专题 1-2 回答了"接触力是什么"(互补条件 + 摩擦锥),专题 3-4 回答了"怎么数值求解、怎么取梯度"。但有一个问题前面几个专题都**刻意绕开了**:当脚触地的那**一瞬间**,到底发生了什么?
设想一个最简单的双足机器人摆动腿落地。落地前,摆动腿的脚以法向速度 \(v_n^-<0\) 接近地面(向下)。落地后的下一瞬间,如果是塑性碰撞(脚不弹起),法向速度必须变成 \(v_n^+=0\)。问题来了:
如果你坚持用连续 ODE 描述,答案是"在某个有限的小时间 \(\Delta t\) 内,地面给一个巨大的力把速度刹住"。但当接触刚度趋于无穷(刚性地面)时,这个时间 \(\Delta t\to 0\),而力 \(\to\infty\),力对时间的积分(冲量)却保持有限。这正是专题 4 §2.1 提到的"法向冲量的 Dirac measure 结构"——硬接触极限下 \(F_n\to\Lambda\,\delta(t-t_c)\)。
连续 ODE \(\dot x=f(x)\) 的右端 \(f\) 必须是(至少局部可积的)函数。一个 Dirac \(\delta\) 不是函数,它是分布(测度)。所以严格地说,刚性冲击下的运动方程**根本不是一个经典 ODE**。这就是第一道坎:经典 Picard-Lindelöf 存在唯一性定理的前提(\(f\) Lipschitz)被彻底破坏。
本质洞察:刚性接触在数学上制造了一个"时间奇点"——状态在零测度的时间集合上发生有限的跳变。连续 ODE 的世界里没有"零时间内的有限变化"这种东西(那需要无穷大的导数)。混合动力系统的全部技术含量,就是给这种"流动 + 瞬间跳变"的交替提供一套**严格而可计算**的语言,让我们既能写下方程,又能分析解的存在性、唯一性、稳定性和灵敏度。
反面:如果硬用纯连续 ODE 会怎样¶
假设我们拒绝引入"跳变"这个概念,坚持用纯连续 ODE 描述足式运动。有两条退路,我们逐一看它们在哪里碰壁:
退路一:用刚度很大的弹簧近似刚性接触(compliant contact)。 这正是专题 4 §2.3 的路线,也是 MuJoCo/Drake 默认做法。地面建模成一个刚度 \(k\) 极大的弹簧,脚陷入地面 \(\delta\) 时受力 \(k\delta\)。这样动力学确实是光滑 ODE,没有跳变。代价是什么?
- 刚性数值病态(stiffness):弹簧刚度 \(k\) 越大,系统的最快特征频率 \(\sqrt{k/m}\) 越高,显式积分器的稳定步长 \(\propto 1/\sqrt{k}\) 趋于零。为了不让接触"软绵绵",你被迫把 \(k\) 设到 \(10^6\sim10^8\) 量级,积分步长被逼到微秒级——这对 100 Hz 的 MPC 是灾难。
- 梯度被"抹平"扭曲:刚度大但有限,触地瞬间的速度变化发生在一个极薄但非零的时间窗里。对这个窗做灵敏度分析,得到的梯度强烈依赖 \(k\) 的具体取值——你优化出来的步态在 \(k=10^6\) 时最优,换到真机(实际 \(k\) 不同)就失效。
退路二:把整个步态写成一个分段定义的 ODE,但假装段与段之间是"连续接上"的。 即写 \(\dot x=f_i(x)\)(mode \(i\)),到了切换条件就换成 \(f_{i+1}\)。问题在于:状态本身在切换时是不连续的(速度跳变)。如果你假装状态连续,就等于假装冲击不存在——这只对 \(e=1\) 的完全弹性碰撞且无能量损失时勉强成立。对双足的塑性落地(\(e=0\),速度子空间秩亏),状态必然跳变,"连续接上"的假设直接错误。更糟的是,下一段 ODE 的初值依赖于跳变后的状态,而你没有跳变映射,根本写不出正确的初值。
对比性思维(不是 X 而是 Y):足式运动**不是**"一个复杂的连续 ODE",而是"若干段简单连续 ODE,由离散跳变事件缝合"。混淆这两者是初学者最常见的认知错误——它会让你在选数值积分器、写灵敏度、做稳定性分析时全盘用错工具。连续 ODE 的工具箱(RK45、变分方程、Lyapunov 函数)每一件都需要在跨越跳变时做特殊处理,这正是本章存在的理由。
历史:混合系统理论的三条源流¶
"混合动力系统(hybrid dynamical system)"这个名字和理论框架是 1990 年代才系统化的,但它的三个核心思想各有更老的源头,值得简短梳理——理解这段历史能帮你看懂为什么今天有三套并存的形式化语言(§5.1)。
-
冲击力学源流(impulsive dynamics,最古老)。带冲击的力学系统研究可追溯到 19 世纪的碰撞理论(Newton 的恢复系数、Poisson 的冲量假设)。20 世纪 Bainov-Simeonov 等把它发展成"脉冲微分方程(impulsive differential equations)"的严格理论。Saltation 矩阵本身就诞生在这条线上——Aizerman 与 Gantmakher 1958 年研究的是非线性自动控制系统在继电器切换面上的扰动传播,比"混合系统"这个词早了三十多年。
-
变结构控制 / 滑模源流(variable structure,控制工程)。1950-60 年代苏联学派(Emelyanov、Utkin)研究继电器控制系统,状态轨迹在切换面上"滑动"。这要求处理不连续右端的 ODE,催生了 Filippov 1960 年代的微分包含(differential inclusion)理论——把 \(\dot x=f(x)\) 推广到 \(\dot x\in F(x)\),其中 \(F\) 是集值映射(§3.1 进阶内容)。
-
计算机科学 / 形式化验证源流(hybrid automaton,最年轻)。1990 年代,为了验证嵌入式控制软件(恒温器、飞机防撞系统)的正确性,计算机科学家(Alur、Henzinger、Sastry 学派)把有限状态自动机与连续动力学结合,提出"混合自动机(hybrid automaton)"。Lygeros-Johansson-Simić-Zhang-Sastry 2003 的 TAC 论文是这条线在控制理论中的奠基性工作。
这三条源流在 21 世纪初汇流。Goebel-Sanfelice-Teel(GST)2012 年的专著《Hybrid Dynamical Systems》用"混合时间域(hybrid time domain)"统一了流动与跳变,成为今天最通用的形式化框架。而机器人/足式领域则更偏爱 Grizzle 学派从冲击力学源流发展出的"脉冲效应系统(system with impulse effects)"——因为单接触周期步态用它写起来最简洁。
多视角理解(数学视角 vs 工程视角):从**数学视角**,混合系统是"流(flow)与跳(jump)在混合时间域上的交替",关注解的存在唯一性、Zeno、well-posedness。从**工程视角**,混合系统是"机器人在不同接触模式之间切换",每个模式是一段动力学,切换点是物理事件(触地、离地、锁膝)。这两个视角描述同一个对象,但侧重点不同——本章会反复在两者间切换,因为只有数学视角能保证严格,只有工程视角能保证你知道每个符号对应真机的什么部件。
本专题在路线图中的位置:接触建模光谱¶
为了让你明确本专题与相邻专题的分工,下表把第七批的"接触建模光谱"摆开。核心区别在于:接触模式序列是先验给定,还是让求解器从松弛中选出来。
| 专题 | 接触如何进入数学 | mode 序列 | 灵敏度难点 | 代表范式 |
|---|---|---|---|---|
| 专题 1-2(互补/摩擦锥) | 互补条件 \(0\le\lambda\perp\phi\ge0\) | 隐含在 LCP 解里 | 激活集切换的 B-子微分 | Stewart-Trinkle LCP |
| 专题 3(时步法) | 测度微分包含,按时间步推进 | 求解器隐式决定 | MDI 解的存在性 | Moreau-Jean、SAP |
| 专题 4(可微接触) | 凸松弛 + 隐函数定理 | 求解器隐式决定 | Clarke Jacobian、参数 VI | OptNet 风格反传 |
| 专题 5(本专题) | 显式 guard + reset | 先验已知(hybrid mode) | 跨 guard 的 Saltation \(\Xi\) | 混合自动机、HZD |
| 专题 6(CI-TO/MPC) | 接触隐式优化 | 求解器从 LCP 松弛中选 | 非凸非光滑 TO 收敛 | iLQR、Contact-Implicit MPC |
读这张表的关键:专题 5 与专题 4/6 是对偶的两种哲学。专题 4/6 说"我不预先知道脚什么时候落地,让优化器自己从互补松弛里发现接触序列";专题 5 说"我已经知道这是一个'摆动→触地→支撑→离地'的周期,接触序列是先验结构,我只需要在每个已知的切换点正确处理跳变"。Posa-Kuindersma-Tedrake 2016 WAFR 证明了两者在局部等价;Kong-Johnson 2023 进一步展示:当 mode 序列已知时,显式 hybrid 建模(用 \(\Xi\))比纯接触隐式优化收敛更快、数值更稳。这就是为什么 Cassie/Digit 这类有明确步态结构的机器人,工业界更偏爱本专题的方法。
理论-工程桥接:正因为足式步态有清晰的、可重复的接触序列(左脚支撑→双支撑→右脚支撑→…),本专题的"mode 序列先验已知"假设在足式上几乎总是成立。这不是数学上的简化偷懒,而是**利用了步态的物理结构**——就像 LQR 利用了"线性+二次"结构换来闭式解一样,HZD/Saltation 利用了"周期接触序列"结构换来可解析的稳定性判据。反过来,对接触序列高度不确定的任务(如杂乱环境中的多接触操作),专题 4/6 的"让求解器选"才是更合适的工具。
经典 ODE 的四个保证,混合系统坏了几个¶
为了精确定位"混合系统难在哪",把光滑 ODE 理论给我们的四个保证逐一拿来对照——看混合系统破坏了哪些。这张对照表是理解后续全部技术的"问题清单"。
| 经典 ODE(\(f\) Lipschitz)的保证 | 混合系统的状况 | 本章如何应对 |
|---|---|---|
| 解存在唯一(Picard-Lindelöf) | 刚性冲击的右端是 Dirac \(\delta\)(非函数),经典定理前提被破坏 | §5.1 用 GST well-posedness 在弱正则性下重建存在唯一 |
| 解对初值连续/光滑依赖(变分方程 \(\Phi\) 处处存在) | 跨 guard 时左右导数不同,经典 \(\Phi\) 在事件处断裂 | §5.3-5.4 用 \(\Xi\) 缝合 \(\Phi\) 的左右极限 |
| 解可无限延拓(不会有限时间"爆掉") | Zeno 现象:有限时间无穷次跳变,解在 \(T_Z\) 处"卡住" | §5.6 用混合时间 \((t,j)\) 刻画,工程上切约束模式 |
| 梯度处处可微(autodiff 直接可用) | piecewise flow 只 B-可微,朴素 autodiff 在事件处错误 | §5.4 末用 Bouligand 导数(= \(\Xi\))替代 |
读这张表的方式:混合系统把光滑 ODE 的四个支柱全部动摇了,而本章的每一节,本质上都是在某个被动摇的支柱下重建一套"严格而可计算"的替代理论。\(\Xi\) 是其中最核心的一块——它同时修复了"光滑依赖"(缝合 \(\Phi\))和"梯度可微"(B-导数)两根支柱。
本质洞察:混合系统不是"光滑系统 + 一点小麻烦",而是**一个需要从存在性、唯一性、连续依赖、可微性逐条重建的新数学对象**。这解释了为什么它值得一个独立专题——你不能把光滑系统的工具箱原样搬过来用,每一件工具(积分器、变分方程、Lyapunov、autodiff)都需要在跨越跳变时做专门的改造。本章就是这套"改造手册",而 \(\Xi\) 是手册里被引用最多的那一页。
与专题 6(Model-Based RL)的关系预告¶
最后预告一个下游:专题 6 做闭环学习,需要对 hybrid 事件取可微梯度(让策略梯度穿过接触)。这里我们先记住一个结论:\(\Xi\) 正是把混合系统变成 piecewise-differentiable flow(分段可微流,Burden-Sastry-Koditschek-Revzen 2016 SIADS)的唯一合法手段——它背后的 B-导数理论将在 §5.3 末尾展开,现在只需要知道:"想让梯度穿过触地事件,绕不开 \(\Xi\);绕过它的'直接 autodiff through impact'在擦切附近一定发散。"这是本章为下游埋下的钩子。
§5.1 混合系统的三大形式化框架 ⭐⭐¶
这一节解决什么问题:§5.0 让我们相信"必须把流动和跳变分开写"。但具体怎么写?历史留下了三套语言(§5.0 的三条源流各结出一个果实)。这一节给出三套语言的精确定义,并解释它们的互译关系,以及——更重要的——为什么不同任务要选不同语言。
动机:同一个步态,三种写法¶
考虑一个最简单的平面单腿跳跃机器人(hopper),它在两个模式间循环:飞行相(flight)——脚离地,整体做抛物线运动;支撑相(stance)——脚触地,腿像弹簧一样压缩反弹。切换事件有两个:触地(touchdown)和离地(liftoff)。
这个系统该怎么用数学写下来?你会发现至少有三种风格,它们强调的东西不同:
- 如果你关心"解在长时间下的行为、会不会 Zeno、鲁棒性",你想要一套强调**解的拓扑性质**的语言 → GST 混合包含。
- 如果你关心"这是个有限状态机,每个状态一段动力学,状态间有带 guard 的边",你想要一套强调**离散-连续结构**的语言 → 混合自动机。
- 如果你关心"就一个连续系统,偶尔被冲击踢一下",你想要一套**尽量贴近经典 ODE**的语言 → 脉冲效应系统。
下面逐一给出。三套语言描述同一个 hopper,但记号、强调、适用分析完全不同。
理论 1:GST 混合包含 \(\mathcal H=(C,F,D,G)\)¶
Goebel-Sanfelice-Teel(GST)框架**是当今最通用、最数学化的混合系统形式化。它的核心洞察是:混合系统的解不应该只用时间 \(t\) 参数化,而要用**混合时间(hybrid time) \((t,j)\) 参数化——\(t\) 是连续流逝的时间,\(j\) 是已经发生的跳变次数。
一个 GST 混合系统由**四个对象**定义:
| 对象 | 名称 | 含义 | hopper 例子 |
|---|---|---|---|
| \(C\subseteq\mathbb R^n\) | 流集(flow set) | 状态在此集合内时,按 \(F\) 连续演化 | 脚在地面之上(\(p_z>0\)),或脚在地面且法向力 \(>0\) |
| \(F:\mathbb R^n\rightrightarrows\mathbb R^n\) | 流映射(flow map) | 流动的(可能集值的)向量场 \(\dot x\in F(x)\) | 飞行相重力 + 支撑相弹簧力 |
| \(D\subseteq\mathbb R^n\) | 跳集(jump set) | 状态在此集合内时,发生瞬间跳变 | 脚刚触地(\(p_z=0,\dot p_z<0\))或刚离地(\(\lambda_n=0\)) |
| \(G:\mathbb R^n\rightrightarrows\mathbb R^n\) | 跳映射(jump map) | 跳变后的(可能集值的)新状态 \(x^+\in G(x)\) | 触地的速度冲击映射、离地的恒等映射 |
解的定义(混合弧)。GST 的解 \(x(t,j)\) 定义在一个**混合时间域(hybrid time domain)** \(E\subseteq\mathbb R_{\ge0}\times\mathbb N\) 上。\(E\) 由若干"区间 × 整数"的片段拼成:\(E=\bigcup_j([t_j,t_{j+1}]\times\{j\})\)。在每个片段 \([t_j,t_{j+1}]\times\{j\}\) 上,\(t\mapsto x(t,j)\) 是 \(\dot x\in F(x)\) 的解(流动),且 \(x(t,j)\in C\);在端点 \(t_{j+1}\) 处发生跳变,\(x(t_{j+1},j+1)\in G(x(t_{j+1},j))\),且 \(x(t_{j+1},j)\in D\)。
这个双指标 \((t,j)\) 看似累赘,实则解决了一个真实困难:两次跳变可能发生在同一物理时刻(瞬时连续跳变,instantaneous jumps)。例如双足两脚同时触地,或者一个冲击触发了另一个约束的激活。普通时间 \(t\) 无法区分"同一时刻的第一次跳和第二次跳",而 \((t,j)\) 可以——\(j\) 从 \(k\) 跳到 \(k+1\) 而 \(t\) 不变。这也是分析 Zeno 现象(§5.5)的天然语言:Zeno 就是"\(j\to\infty\) 而 \(t\) 保持有界"。
为什么 \(F,G\) 是集值映射(\(\rightrightarrows\))?这是 GST 框架相比朴素写法的关键推广。集值(用双箭头 \(\rightrightarrows\) 表示,返回的是集合而非单点)允许两件事:(i) 流映射 \(F\) 集值,对应 Filippov 意义下的滑模解(切换面上向量场不唯一,取凸包,见 §3.1);(ii) 跳映射 \(G\) 集值,对应"从一个状态可能跳到多个状态"的非确定性。在足式机器人里我们通常用单值的 \(F,G\)(确定性动力学),但 GST 保留集值是为了让框架覆盖滑模、非确定切换等更一般情形,并使 well-posedness 定理(解的存在性、对扰动的鲁棒性)能在弱正则性下成立。
GST 的 well-posedness 条件(混合基本条件,hybrid basic conditions)。GST 框架的威力在于:只要 \((C,F,D,G)\) 满足一组温和的正则条件——\(C,D\) 闭、\(F\) 在 \(C\) 上外半连续且凸值且局部有界、\(G\) 在 \(D\) 上外半连续且局部有界——就能保证解对初值和扰动**鲁棒**(小扰动只产生解的小变化,在适当的图距离意义下)。这是 GST 相对混合自动机的最大优势:它把"解的良态性"建立在可检验的集合/映射条件上,而不依赖具体的切换逻辑。这套理论的完整展开见 GST 2012 第 6-7 章,是研究 Zeno 与鲁棒性的标准参考。
理论 2:混合自动机 \(H=(\mathcal Q,\mathcal X,f,\text{Init},\text{Inv},E,G,R)\)¶
**混合自动机(hybrid automaton)**来自计算机科学源流(§5.0),强调"有限状态机 + 每个状态配一段连续动力学"的结构。Lygeros-Johansson-Simić-Zhang-Sastry 2003 TAC 给出了它在控制理论中的标准形式。一个混合自动机由**八元组**定义:
| 元素 | 名称 | 含义 | hopper 例子 |
|---|---|---|---|
| \(\mathcal Q=\{q_1,\dots,q_m\}\) | 离散模态集 | 有限个离散状态(模式) | \(\{\)flight, stance\(\}\) |
| \(\mathcal X\subseteq\mathbb R^n\) | 连续状态空间 | 每个模态内的连续状态 | \((x,z,\dot x,\dot z)\) 或 \((r,\theta,\dot r,\dot\theta)\) |
| \(f:\mathcal Q\times\mathcal X\to\mathbb R^n\) | 向量场族 | 每个模态 \(q\) 一个 ODE \(\dot x=f(q,x)\) | flight 重力场 / stance 弹簧场 |
| \(\text{Init}\) | 初始条件集 | 允许的初始 \((q,x)\) | 从飞行相某高度释放 |
| \(\text{Inv}:\mathcal Q\to 2^{\mathcal X}\) | 不变集(invariant / domain) | 模态 \(q\) 中状态必须停留的区域 | flight: \(p_z\ge0\);stance: 弹簧未完全伸长 |
| \(E\subseteq\mathcal Q\times\mathcal Q\) | 离散转移边 | 允许的模态切换 | flight→stance, stance→flight |
| \(G:E\to 2^{\mathcal X}\) | guard(守卫/切换面) | 边 \(e\) 上触发切换的连续状态集 | flight→stance: \(\{p_z=0,\dot p_z<0\}\) |
| \(R:E\times\mathcal X\to 2^{\mathcal X}\) | reset(重置/跳变映射) | 沿边 \(e\) 切换时连续状态如何重置 | 触地冲击映射;离地恒等 |
执行(execution)。混合自动机的解叫"执行":从 \(\text{Init}\) 出发,在当前模态 \(q\) 内按 \(\dot x=f(q,x)\) 流动,只要 \(x\) 还在 \(\text{Inv}(q)\) 内;一旦 \(x\) 落入某条出边 \(e=(q,q')\) 的 guard \(G(e)\),就触发切换——离散状态变成 \(q'\),连续状态按 reset 重置为 \(x'\in R(e,x)\),然后在新模态 \(q'\) 内继续流动。
混合自动机与 GST 的对应关系:\(\text{Inv}(q)\) 对应 GST 的流集 \(C\)(按模态分块),\(G(e)\) 对应跳集 \(D\),\(R(e,\cdot)\) 对应跳映射 \(G\)(注意符号冲突——自动机用 \(G\) 表 guard,GST 用 \(G\) 表 jump map,这是文献的历史包袱,读论文时务必看清上下文)。
多视角理解(两套框架的侧重,像在哪、不像在哪):混合自动机和 GST 混合包含**像**在都描述"流 + 跳";不像**在:(1) 自动机把"离散模态 \(q\)"显式提到状态里(\((q,x)\)),GST 把模态信息**编码进 \(C/D\) 的几何结构(同一个 \(x\) 在 \(C\) 里就流、在 \(D\) 里就跳,不显式标模态);(2) 自动机强调切换逻辑(哪条边、什么 guard),适合"画状态转移图"和形式化验证;GST 强调解的拓扑性质(混合时间域、图收敛),适合证 Zeno 和鲁棒性定理。不要把这个类比延伸到"两者完全可互换"——对带集值滑模解的系统,GST 更自然;对带复杂离散逻辑(多模态、嵌套切换)的系统,自动机更清晰。
理论 3:脉冲效应系统(HZD 学派的简化形式)¶
Grizzle 学派**在双足步态分析中用一套更精简的语言——**带脉冲效应的系统(system with impulse effects)。它放弃了显式的离散模态集,因为单接触周期步态本质上只有"一个连续相 + 一个瞬时冲击"在周期性重复,没必要动用完整的自动机机器。其形式为:
其中: - \(x=(q,\dot q)\in T\mathcal Q\) 是机器人状态(配置 + 广义速度); - \(f(x)+g(x)u\) 是控制仿射的连续动力学(单支撑相的浮动基座动力学); - \(\mathcal S=\{x:H(x)=0\}\) 是**切换面(switching surface),由一个标量函数 \(H\) 定义——通常 \(H(q)=\) 摆动脚到地面的高度,\(H=0\) 即"脚触地";它在几何上是一个 Poincaré 截面; - \(\Delta:\mathcal S\to T\mathcal Q\) 是**冲击映射(impact map),把触地前状态 \(x^-\) 映到触地后状态 \(x^+\),并伴随支撑腿与摆动腿的角色互换(relabeling)。
这套语言的好处是**贴近经典 ODE**:大部分时间系统就是个普通的控制仿射系统,只在 \(x\) 碰到 \(\mathcal S\) 时被 \(\Delta\)"踢"一下。它对应 GST 框架在"单接触周期轨"下的简化——流集 \(C=\{H(x)\ge0\}\),跳集 \(D=\mathcal S=\{H=0\}\)(带方向条件),跳映射 \(G=\Delta\)。
为什么 Zeno 分析用 GST 最自然,而 HZD 分析用脉冲效应最简洁?这是本节最该记住的"选语言"原则。Zeno 现象(无穷次跳变)本质是混合时间域 \((t,j)\) 上 \(j\to\infty,\,t\to T_Z\) 的行为——GST 的双指标参数化是为它量身定做的,而脉冲效应系统连 \(j\) 这个指标都没有,分析 Zeno 很别扭。反过来,HZD 步态稳定性是"一个连续相 + 一个冲击"的周期轨问题——脉冲效应系统的极简记号(一个 \(f\)、一个 \(\Delta\)、一个 \(\mathcal S\))让 Poincaré 返回映射的推导(§5.6)干净利落,而 GST 的 \(C/F/D/G\) 四件套在这里反而是冗余的负担。框架不是越通用越好,而是越贴合任务结构越好。
算例:把 hopper 用三套语言具体写下来¶
光看抽象定义容易忘,把 §5.1 动机里的平面单腿跳跃机器人(hopper)真的用三套语言写一遍,三套框架的异同立刻清晰(这也是练习 5.1.1 的解答骨架)。取飞行相状态 \(x=(p_x,p_z,\dot p_x,\dot p_z)\)(质心位置与速度)。
写法一:GST 混合包含 \((C,F,D,G)\)。
- 流集 \(C=\{p_z\ge0\}\)(脚在地面之上,含飞行相)∪ {支撑相状态}。简化起见聚焦飞行相:飞行时 \(C_{\text{flight}}=\{p_z>0\}\)。
- 流映射 \(F\):飞行相 \(\dot x=(\dot p_x,\dot p_z,0,-G)\)(抛物线);支撑相为弹簧 + 重力场。
- 跳集 \(D=\{p_z=0,\ \dot p_z<0\}\)(脚正在向下触地)∪ {离地条件}。注意方向条件 \(\dot p_z<0\)。
- 跳映射 \(G\):触地 \(G_{\text{td}}\) 是速度冲击映射(质心速度按腿方向投影),离地 \(G_{\text{lo}}\) 是恒等映射。
写法二:混合自动机(核心五元素)。
- 模态集 \(\mathcal Q=\{\text{flight},\text{stance}\}\)。
- 向量场 \(f(\text{flight},x)=(\dot p_x,\dot p_z,0,-G)\);\(f(\text{stance},x)=\) 弹簧 + 重力。
- 不变集 \(\text{Inv}(\text{flight})=\{p_z\ge0\}\);\(\text{Inv}(\text{stance})=\{\text{腿未完全伸展}\}\)。
- guard \(G(\text{flight}\to\text{stance})=\{p_z=0,\dot p_z<0\}\);\(G(\text{stance}\to\text{flight})=\{\text{腿伸长到自然长度}\}\)。
- reset \(R(\text{flight}\to\text{stance})=\) 触地冲击;\(R(\text{stance}\to\text{flight})=\) 恒等。
写法三:脉冲效应系统。
此时切换面 \(\mathcal S=\{H(x)=0\}\),\(H(x)=p_z\)(脚高度)——这是把"何时跳"压缩成一个标量函数 \(H\)。\(\Delta\) 是触地冲击。注意:脉冲效应系统天然只描述"一个连续相 + 一个冲击"的循环,要表达"飞行 + 支撑"两个不同连续相和两次切换(触地 + 离地),它略显勉强——这恰好暴露了它的适用边界(单接触周期),印证了"框架要贴合结构"。
三套写法对比的教学价值:同一个 hopper,GST 把模态信息**编码进 \(C/D\) 的几何**(不显式标 flight/stance),自动机**显式列出两个模态 \(\mathcal Q\),脉冲效应**把切换压缩成单个 \(H\)。问"如果腿一直弹不起来会不会 Zeno"——这是无穷次跳变问题,GST 的 \((t,j)\) 双指标最适合(练习 5.1.1 的设问答案)。
三框架互译表¶
把三套语言放在一起对照,是本节的核心产出。读论文时遇到任意一套,都应能在脑中翻译成另外两套:
| 概念 | GST 混合包含 | 混合自动机 | 脉冲效应系统 |
|---|---|---|---|
| 连续演化区域 | 流集 \(C\) | 不变集 \(\text{Inv}(q)\) | \(\{H(x)\ge0\}\) |
| 连续动力学 | 流映射 \(F(x)\)(集值) | \(f(q,x)\)(按模态) | \(f(x)+g(x)u\) |
| 触发跳变的集合 | 跳集 \(D\) | guard \(G(e)\) | 切换面 \(\mathcal S=\{H=0\}\) |
| 跳变规则 | 跳映射 \(G(x)\)(集值) | reset \(R(e,x)\) | 冲击映射 \(\Delta(x)\) |
| 离散状态 | 隐含在 \(C/D\) 几何中 | 显式模态 \(q\in\mathcal Q\) | 隐含(单/双支撑由相位决定) |
| 时间参数化 | 混合时间 \((t,j)\) | 执行序列 | 普通时间 \(t\) + 跳变时刻 |
| 最适合的分析 | Zeno、鲁棒性、well-posedness | 形式化验证、多模态逻辑 | 单周期步态稳定性(Poincaré) |
| 代表文献 | Goebel-Sanfelice-Teel 2012 | Lygeros et al. 2003 TAC | Grizzle 学派;Westervelt et al. 2007 |
还有一套值得一提的语言——Branicky 切换系统 + 多 Lyapunov 函数(Branicky 1998 TAC):用模态索引 \(i(t)\) + 分段 ODE \(\dot x=f_{i}(x)\) 描述,配多 Lyapunov 函数分析稳定性(每次重入模态 \(i\) 时 \(V_i\) 序列单调不增 ⇒ 稳定,即定理 T10)。它在"步态之间切换"(如从 trot 切到 bound)的稳定性分析中很有用——这种切换没有冲击,纯粹是离散逻辑切换,多 Lyapunov 是对的工具。
本质洞察:四套语言(GST、自动机、脉冲效应、Branicky 切换)不是竞争关系,而是**同一数学对象在不同"分辨率"和"视角"下的投影**。GST 是最高分辨率的母框架(能表达滑模、Zeno、瞬时连续跳变);自动机牺牲一点拓扑严格性换来离散逻辑的清晰;脉冲效应牺牲多模态表达力换来单周期分析的简洁;Branicky 牺牲冲击表达力换来切换稳定性的 Lyapunov 工具。选哪套语言,取决于你要证什么定理——这是成熟研究者与初学者的分水岭。
⚠️ 常见陷阱¶
💡 概念误区:以为"混合系统"就是"分段函数" 新手想法:"不就是 \(f\) 分几段定义吗?\(\dot x=f_1(x)\) 或 \(f_2(x)\),按条件选,这有什么难的?" 实际上:分段**右端**(向量场分段)只是混合系统的一半。真正的难点在**状态本身的跳变**——触地瞬间 \(\dot q^-\to\dot q^+\) 是不连续的,这不是 \(f\) 分段能描述的(\(f\) 分段时状态仍连续)。混合系统 = 分段流动 + 状态跳变,两者缺一不可。 为什么重要:如果你以为只是分段 \(f\),你会用普通 ODE 积分器跑它,结果在切换点状态不跳变(错),或跳变了但灵敏度算成普通 Jacobian(错得更隐蔽)。理解"跳变是状态级而非右端级"是整章的认知地基。 延伸思考:什么时候混合系统**退化**为纯分段 ODE(状态连续)?答:当所有 reset 都是恒等映射 \(\Delta=\text{id}\) 时(如离地事件、纯逻辑切换)。这时只有向量场切换,没有状态跳变。
💡 概念误区:把 GST 的 \(G\)(jump map)和自动机的 \(G\)(guard)混为一谈 新手想法:"两个框架都有个 \(G\),应该是一回事。" 实际上:纯粹的符号撞车。GST 的 \(G\) 是**跳映射**(跳变后去哪),对应自动机的 reset \(R\);自动机的 \(G\) 是**guard**(什么时候跳),对应 GST 的跳集 \(D\)。两个 \(G\) 含义正好"错位"。 为什么重要:读跨框架的论文时,一个符号搞反,整个推导的因果关系就颠倒了。 正确做法:读任何论文先确认它用哪套框架、每个符号的定义,不要凭符号长相猜含义。本章后续统一用 \(g\)(小写)表 guard 函数、\(\Delta\) 表 reset,避免歧义。
🧠 思维陷阱:认为框架越通用(GST)就越应该总是用它 新手想法:"GST 是最严格最通用的,那我所有问题都用 GST 写不就最保险吗?" 实际上:通用性是有代价的——GST 的集值映射、混合时间域、图收敛等机器,对一个简单的单周期步态稳定性分析是巨大的过度杀伤(overkill)。用 GST 推 HZD 的 Poincaré 映射,你会被四件套 \(C/F/D/G\) 和 \((t,j)\) 双指标淹没,看不清"标量返回映射"这个简单结论。 正确思维:选框架的三个问题——(1) 我要证的定理涉及无穷次跳变/滑模吗?(是 → GST)(2) 涉及复杂离散逻辑/多模态切换吗?(是 → 自动机)(3) 就是单/双周期接触序列的稳定性吗?(是 → 脉冲效应系统)。用最小够用的框架。
练习¶
5.1.1(推导题,在草稿纸上完成) 把 §5.1 动机中的平面单腿跳跃机器人(hopper)用**三套语言**分别写下来。状态取 \(x=(p_x,p_z,\dot p_x,\dot p_z)\)(质心位置与速度,飞行相)。要求:(a) 写出 GST 的 \((C,F,D,G)\) 四件套,明确触地 guard 与离地 guard 的几何条件;(b) 写出混合自动机的八元组(至少 \(\mathcal Q,f,\text{Inv},G,R\) 五个核心元素);(c) 写出脉冲效应系统形式,并指出此时 \(H(x)\) 是什么。比较三种写法,说出哪种最适合分析"如果腿一直弹不起来会不会 Zeno"。
5.1.2(开放思考题) GST 框架要求流映射 \(F\) 在流集 \(C\) 上**外半连续、凸值、局部有界**才能保证 well-posedness。考虑库仑摩擦的 stick-slip 切换:在 \(\dot q_t=0\)(切向速度为零)处,摩擦力方向不唯一(可取整个摩擦锥)。请论证:为什么这里必须用**集值** \(F\)(Filippov 凸包)而不能用单值 \(F\)?如果硬用单值(强行选一个摩擦方向),会破坏 well-posedness 条件中的哪一条?(提示:回顾专题 4 §2.1 的 Clarke 广义梯度;外半连续 + 凸值的几何含义。)
5.1.3(证明题) 证明:脉冲效应系统是 GST 混合包含在以下假设下的特例——(i) 流集 \(C=\{x:H(x)\ge0\}\),跳集 \(D=\mathcal S=\{x:H(x)=0,\ L_f H(x)<0\}\)(\(L_fH=\nabla H^\top f\) 为李导数,方向条件保证只在"向下穿越"时跳);(ii) 流映射、跳映射均单值。要求:写出从脉冲效应系统的 \((f,\Delta,\mathcal S)\) 构造 GST 的 \((C,F,D,G)\) 的精确映射,并验证这样构造的 \(C,D\) 满足 GST 要求的"闭集"条件需要 \(H\) 满足什么正则性。
§5.2 Guard 条件、Reset 映射与接触事件 ⭐⭐¶
这一节解决什么问题:§5.1 给出了三套框架,每套都有"切换面"(guard)和"跳变规则"(reset)。但它们到底长什么样?这一节把抽象的 \(D,G,\mathcal S,\Delta\) 落到具体的机器人接触上——足端触地、足端离地、膝盖锁死——并推导塑性冲击的速度投影公式。这是 §5.3 推导 \(\Xi\) 的"原料准备":\(\Xi\) 的公式里出现的每一个对象(\(g,\nabla g,\Delta,D\Delta,F^\pm\))都在这一节备齐。
动机:从"碰到面"到"怎么跳",两个独立的问题¶
一个混合事件由两个逻辑上独立的部分组成,初学者常把它们混在一起:
- 何时跳(when)——由 guard 决定。Guard 是一个条件,状态满足它时触发跳变。例如"脚底高度等于零"。
- 怎么跳(how)——由 reset 决定。Reset 是一个映射,规定跳变前的状态如何变成跳变后的状态。例如"法向速度被冲击吸收归零"。
为什么强调"独立"?因为同一个 guard 可以配不同的 reset(同样是"脚触地",弹性球反弹 vs 塑性脚刹停,reset 截然不同),同一个 reset 也可以由不同 guard 触发。把它们分开建模,才能在 §5.3 看清 \(\Xi\) 的结构——你会发现 \(\Xi\) 恰好由"reset 的导数 \(D\Delta\)"加上"guard 的几何 \(\nabla g\)"两部分拼成,正对应这两个独立问题。
理论:Guard(切换面)与横截性¶
Guard 的定义。Guard 由一个标量函数 \(g:\mathcal X\to\mathbb R\) 的零水平集给出,但还要加一个方向条件:
第一个条件 \(g(x)=0\) 给出一张 \(n-1\) 维的超曲面(切换面)。第二个条件 \(\nabla g^\top F^-<0\) 是关键,它叫**横截方向条件**:要求标称(pre-event)向量场 \(F^-\) 在切换面上指向 \(g\) 减小的方向,即轨迹是"穿过"切换面而不是"擦过"或"离开"。
为什么需要方向条件?因为零水平集 \(g=0\) 是一张"双面"曲面,轨迹可能从两侧逼近。只有"正在向 \(g<0\) 一侧穿越"时才触发跳变。以足端触地为例,\(g=p_{\text{foot},z}\)(脚底到地面的高度),\(\nabla g^\top F^-=\dot p_{\text{foot},z}\) 是脚底的垂直速度。\(\dot p_{\text{foot},z}<0\) 表示脚正在向下接近地面——这才是触地;如果 \(\dot p_{\text{foot},z}>0\)(脚在向上离开),即使瞬间 \(p_z=0\) 也不该触发触地冲击。
本质洞察:横截性 \(\nabla g^\top F^-\neq 0\) 是整个 Saltation 理论的"护城河"。它保证轨迹**干净地穿过**切换面,从而"穿越时刻"对扰动是良定义的、可微的。一旦 \(\nabla g^\top F^-\to 0\)(轨迹与切换面相切,即 grazing/擦切),穿越时刻对扰动的导数发散——\(\Xi\) 的分母趋零,整个一阶理论崩溃(§5.5 详述)。记住这个量 \(\nabla g^\top F^-\):它既是 guard 的方向条件,又是 \(\Xi\) 公式的分母,还是横截性的度量,三位一体。
典型 guard 写法。足式机器人常见的三类 guard:
| 事件 | guard 函数 \(g\) | 物理含义 | 横截量 \(\nabla g^\top F^-\) |
|---|---|---|---|
| 足端触地(touchdown) | \(g=p_{\text{foot},z}(q)\) | 脚底到地面的 \(z\) 高度 | \(\dot p_{\text{foot},z}<0\)(脚向下穿越) |
| 足端抬起(liftoff) | \(g=\lambda_n(q,\dot q,\tau)\) | 法向接触力归零 | 由约束 KKT 系统反解力的变化率 |
| 膝盖锁死(knee lock) | \(g=\theta_{\text{knee}}-\theta_{\max}\) | 膝关节到达机械限位 | \(\dot\theta_{\text{knee}}>0\)(膝在伸展) |
注意触地与离地的 guard 性质很不同。触地 guard 是**运动学的**(脚的位置),干净直接。离地 guard 是**动力学的**(法向力 \(\lambda_n\)),需要从当前约束动力学的 KKT 系统反解出 \(\lambda_n\) 作为状态与控制的函数,再判其归零——这要用到专题 1 的约束力求解。一个常见的工程做法是:在支撑相,约束 \(\dot q\) 满足接触约束 \(J\dot q=0\)(脚不滑),由此解出维持约束所需的法向力 \(\lambda_n\);当 \(\lambda_n\) 降到零(地面"拉不住"脚了,物理上地面只能推不能拉),就触发离地。
带时变 guard 的推广。有时 guard 显式依赖时间,\(g=g(x,t)\)(例如移动平台、时变地形)。这时横截量要加上 \(\partial_t g\):穿越条件变成 \(\nabla_x g^\top F^- + \partial_t g\neq 0\),这正是 §5.3 中 \(\Xi\) 公式分母里出现 \(+\partial_t g\) 的原因。对静止地形(绝大多数足式场景),\(\partial_t g=0\),分母简化为 \(\nabla g^\top F^-\)。
理论:Reset 映射与刚性冲击的速度投影¶
现在处理"怎么跳"。对足式机器人,最重要的 reset 是**塑性刚性冲击(plastic rigid impact)**——脚落地瞬间,配置 \(q\) 不变(脚的位置不会瞬移),但广义速度 \(\dot q\) 跳变(落地的冲量改变速度)。
冲击映射的推导。设冲击前速度 \(\dot q^-\),冲击后 \(\dot q^+\)。冲击在零时间内完成,期间作用一个法向冲量 \(\hat\Lambda=\int\lambda\,dt\)(有限值)。由动量定理(对零时间区间积分动力学方程),惯性项积分给出动量变化,而有限力项(重力、科氏力、控制)的时间积分趋零:
其中 \(M(q)\) 是质量矩阵,\(J=\partial p_{\text{foot}}/\partial q\) 是接触点的 Jacobian,\(\hat\Lambda\) 是待定的冲量。这是一个方程,两个未知(\(\dot q^+\) 和 \(\hat\Lambda\)),需要补充**碰撞后约束**来闭合。
对**完全塑性碰撞(\(e=0\),双足标准)**,碰撞后脚不反弹也不穿透,即接触点速度的法向(实际上对刚性全约束是整个接触点速度)为零:
联立这两个方程消去 \(\hat\Lambda\)。从第一式解出 \(\dot q^+=\dot q^- + M^{-1}J^\top\hat\Lambda\),代入第二式:
回代得到**冲击映射的闭式**(Hurmuzlu-Marghitu 1994 IJRR):
记 \(P_\Delta=I-M^{-1}J^\top(JM^{-1}J^\top)^{-1}J\),它就是塑性冲击的"速度投影矩阵"。
多视角理解(代数视角 vs 几何视角):\(P_\Delta\) 从**代数视角**是一个投影(可验证 \(P_\Delta\) 在 \(M\)-内积下幂等:\(P_\Delta^2=P_\Delta\));从**几何视角**,它把冲击前速度 \(\dot q^-\) 投影到"满足接触约束 \(J\dot q=0\) 的速度子空间"上,且投影是沿 \(M^{-1}J^\top\) 张成的方向(动力学一致方向)进行的。这与专题 1 中"约束流形的切空间"以及最小二乘的正交投影是同一套数学——只是这里的"正交"是相对动能度量 \(M\) 而非欧氏度量。**像**最小二乘投影;**不像**之处在于度量是 \(M\) 加权的,且投影到的是速度约束子空间的核,不是行空间。
冲击的能量损失。塑性冲击耗散动能。冲击前后动能差为 \(\Delta T=\tfrac12\dot q^{-\top}M\dot q^- - \tfrac12\dot q^{+\top}M\dot q^+\ge0\)。这个耗散正是双足"被动行走"能量平衡的关键——每步落地损失的能量,由重力做功(下坡)或驱动补充。这也解释了 §5.2 末尾恢复系数分类的物理意义。
Reset 的 Jacobian \(D\Delta\)。\(\Xi\) 需要 reset 对状态的导数。对上面的塑性冲击,状态 \(x=(q,\dot q)\),reset 是 \(\Delta(q,\dot q)=(q,\ P_\Delta(q)\dot q)\)。它的 Jacobian:
左上块是 \(I\)(配置不变),右下块是 \(P_\Delta\)(速度的投影),左下块是 \(P_\Delta\) 依赖 \(q\)(通过 \(M(q),J(q)\))带来的耦合项——这一项常被忽略但在精确灵敏度里不可省。注意 \(D\Delta\neq\Xi\):\(D\Delta\) 只是 reset 自身的导数,\(\Xi\) 还要加上 guard 几何带来的时间错位项,这是 §5.3 的核心。
算例:两自由度的冲击映射手算¶
把 \(P_\Delta=I-M^{-1}J^\top(JM^{-1}J^\top)^{-1}J\) 这个公式落到具体数字,让"速度投影"不再抽象。考虑一个极简的两自由度模型(如一个二连杆,或抽象成两个广义坐标 \(q=(q_1,q_2)\))。
设定。取质量矩阵和接触 Jacobian(单接触约束,\(J\in\mathbb R^{1\times2}\)):
(\(M\) 对角是为手算清晰;\(J=[1\ 1]\) 表示接触约束是"两个坐标速度之和为零",即 \(\dot q_1+\dot q_2=0\)。)
第一步:算 \(M^{-1}J^\top\)。 \(M^{-1}=\mathrm{diag}(1/2,1)\),故
第二步:算标量 \(JM^{-1}J^\top\)。
第三步:组装 \(P_\Delta\)。
第四步:验证三条性质。
- 幂等(\(P_\Delta^2=P_\Delta\)):直接算 \(P_\Delta^2\),\(\begin{bmatrix}2/3&-1/3\\-2/3&1/3\end{bmatrix}^2=\begin{bmatrix}4/9+2/9&-2/9-1/9\\-4/9-2/9&2/9+1/9\end{bmatrix}=\begin{bmatrix}2/3&-1/3\\-2/3&1/3\end{bmatrix}=P_\Delta\)。✓ 它是投影。
- 非对称(\(P_\Delta\neq P_\Delta^\top\)):\(P_{\Delta,12}=-1/3\neq-2/3=P_{\Delta,21}\)。✓ 故**不是**欧氏正交投影(印证 §5.2 陷阱二)。
- 冲击后满足约束(\(JP_\Delta\dot q^-=0\)):\(JP_\Delta=\begin{bmatrix}1&1\end{bmatrix}\begin{bmatrix}2/3&-1/3\\-2/3&1/3\end{bmatrix}=\begin{bmatrix}0&0\end{bmatrix}\)。✓ 任何冲击前速度,投影后都满足 \(\dot q_1^++\dot q_2^+=0\)。
第五步:算一个具体的冲击。 设冲击前 \(\dot q^-=(1,0)^\top\)(违反约束,\(1+0=1\neq0\))。冲击后:
验证 \(\dot q_1^++\dot q_2^+=2/3-2/3=0\) ✓。动能损失 \(\Delta T=\tfrac12\dot q^{-\top}M\dot q^--\tfrac12\dot q^{+\top}M\dot q^+=\tfrac12(2\cdot1+0)-\tfrac12(2\cdot\tfrac49+\tfrac49)=1-\tfrac12\cdot\tfrac{12}{9}=1-\tfrac23=\tfrac13>0\) ✓(耗散)。
本质洞察:这个手算清楚地展示了"\(M\)-投影 vs 欧氏投影"的实质差别。如果用欧氏正交投影到 \(\dot q_1+\dot q_2=0\),会得到对称矩阵 \(\tfrac12\begin{bmatrix}1&-1\\-1&1\end{bmatrix}\),给出 \(\dot q^+=(1/2,-1/2)\)——与正确的 \((2/3,-2/3)\) 不同!差别正源于度量:物理(动量守恒)要求冲量沿 \(M^{-1}J^\top\propto(1/2,1)\) 方向作用,而非沿 \(J^\top=(1,1)\) 方向。质量大的坐标(\(q_1\) 质量 2)"更难被冲量改变",所以它保留了更多原速度。用错度量 = 算错冲击后速度 = 后续 \(\Xi\)、协方差、稳定性全错。
理论:恢复系数与冲击分类¶
冲击的"弹性程度"由**恢复系数(coefficient of restitution)** \(e\) 刻画,它决定碰撞后法向速度与碰撞前的比例。Brogliato 2016《Nonsmooth Mechanics》(3rd ed.) 给出系统分类:
| \(e\) | 类型 | 物理 | reset Jacobian \(D\Delta\) 的结构性质 |
|---|---|---|---|
| \(e=1\) | 完全弹性 | 无能量损失(理想弹跳球) | 辛(symplectic)、保相空间体积 |
| \(0<e<1\) | 部分弹性 | 部分能量损失 | 法向方向特征值 \(<1\)(收缩) |
| \(e=0\) | 完全塑性(双足标准) | 最大能量损失,碰后不反弹 | 法向速度子空间**秩亏**(投影掉一维) |
塑性情形(\(e=0\))的秩亏是 Burden-Revzen-Sastry 2015 "常秩降维假设"的物理来源——每次塑性冲击把状态投影到低维子流形,反复冲击使周期轨邻域**有限时间**收缩到一个光滑低维子流形(定理 T5,§5.5 详述)。这就解释了为什么 SLIP/RHex 这类"模板模型(template)"能精确捕捉高维机器人(anchor)的周期行为——不是近似,而是冲击投影的数学必然。
理论-工程桥接:恢复系数 \(e\) 的选择直接影响 reset 的辛性质,进而影响 \(\Xi\) 的谱(特征值分布),最终决定步态稳定性。这不是抽象的——bouncing ball 的 \(\Xi\) 谱半径恰好等于 \(e\)(练习 5.3.2 / 大纲 Q2)。工程上,足式机器人几乎总取 \(e=0\)(塑性),因为:(1) 真实脚-地接触高度耗散,弹跳极小;(2) 塑性冲击的秩亏带来的降维让稳定性分析可解析(HZD 的标量返回映射依赖这个)。取 \(e=0\) 不是为了简化,而是真实物理 + 数学便利的双重选择。
Reset 在李群上的复杂化(专题 3 遗留问题)¶
当机器人状态含旋转(浮动基座姿态在 \(SO(3)\) 或 \(SE(3)\) 上),reset 映射不能简单地写成向量空间的线性投影。回顾专题 3:旋转不是向量,速度(角速度)活在李代数 \(\mathfrak{so}(3)\) 中。这时 reset 的 Jacobian \(D\Delta\) 要用 adjoint 表示,速度跳变写成左平凡化(left-trivialized)形式:
其中 \(\xi\) 是体坐标系下的广义速度(旋量),\(\mathrm{Ad}\) 是伴随算子。更隐蔽的陷阱来自**四元数双覆盖**:\(\mathrm{Spin}(3)\) 上 \(q\) 与 \(-q\) 代表同一旋转,但 \(D\Delta\) 在两个分支上相差符号;做灵敏度分析时若不固定一致的分支,\(\Xi\) 的谱结构会错乱(§5.9 故障排查与 §5.10 桥接会再强调)。这是专题 3 遗留给本专题的一个"接口陷阱"——现在只需记住:"含旋转的 reset,\(D\Delta\) 要走 adjoint,且小心四元数符号",完整处理见专题 3 的 \(SE(3)\) 灵敏度部分。
⚠️ 常见陷阱¶
💡 概念误区:以为触地 guard 和离地 guard 是对称的(都用脚的位置) 新手想法:"触地是脚到地面 \(p_z=0\),那离地就是脚离开地面 \(p_z>0\) 呗,对称的。" 实际上:触地 guard 是**运动学**的(\(g=p_z\),看位置),离地 guard 是**动力学**的(\(g=\lambda_n\),看力)。原因:在支撑相,脚一直贴着地面 \(p_z\equiv0\),位置不再提供"何时离地"的信息——决定离地的是法向力降到零(地面只能推不能拉)。 为什么重要:如果你用 \(p_z>0\) 当离地条件,机器人在支撑相 \(p_z\) 恒为零,永远不会"离地",步态卡死。 正确做法:离地 guard 必须从约束动力学反解 \(\lambda_n(q,\dot q,\tau)\),判其归零。这要用专题 1 的约束力 KKT 系统。
💡 概念误区:把 reset 的速度投影 \(P_\Delta\) 当成欧氏正交投影 新手想法:"\(P_\Delta=I-M^{-1}J^\top(JM^{-1}J^\top)^{-1}J\) 看着像投影,应该是把速度正交投影到 \(J\dot q=0\) 上。" 实际上:它是**关于动能度量 \(M\) 的投影**,不是欧氏正交投影。验证:\(P_\Delta\) 满足 \(P_\Delta^2=P_\Delta\)(幂等),但 \(P_\Delta\neq P_\Delta^\top\)(非对称,故非欧氏正交);它满足 \(M P_\Delta=(MP_\Delta)^\top\)(\(M\)-自伴)。 为什么重要:用错度量会让你算错冲击后速度、算错能量损失、算错 \(D\Delta\)。在 SE(3) 浮动基座上,\(M\) 远非单位阵,这个区别是实质性的。 延伸思考:为什么是 \(M\)-投影而非欧氏投影?因为冲击冲量沿 \(M^{-1}J^\top\) 方向作用(动力学决定方向),不是沿 \(J^\top\) 方向。物理(动量守恒)选定了度量。
🧠 思维陷阱:忽略 \(P_\Delta\) 对 \(q\) 的依赖,把 \(D\Delta\) 当成常数块对角阵 新手想法:"\(D\Delta=\mathrm{diag}(I,P_\Delta)\),反正配置不变速度投影,分块对角就行。" 实际上:\(P_\Delta=P_\Delta(q)\) 通过 \(M(q),J(q)\) 依赖配置,所以 \(D\Delta\) 有左下角的耦合块 \(\partial(P_\Delta\dot q)/\partial q\neq0\)。在 bouncing ball 这种 \(P_\Delta\) 为常数的玩具例子里这项确实为零,但对真实机器人非零。 为什么重要:漏掉这一项会让 \(\Xi\) 算错,进而 HiLQR 的反传梯度有偏、SKF 的协方差传播有偏。Kong 2024 Proc. IEEE 明确指出这是实现中常见错误。 正确做法:对真实多体系统,\(D\Delta\) 必须含配置耦合块;只有在 \(M,J\) 不依赖 \(q\) 的特殊坐标或玩具模型里才可略去。
💡 概念误区:认为恢复系数 \(e\) 只是个"调参旋钮",对理论结构无影响 新手想法:"\(e\) 不就是碰撞弹多高的系数嘛,调大调小都行。" 实际上:\(e\) 决定 reset 的**辛性质与秩**。\(e=1\) 时 \(D\Delta\) 辛(保体积),\(e=0\) 时秩亏(投影降维)。这直接改变 \(\Xi\) 的谱结构和整个稳定性分析框架。 为什么重要:HZD 的标量 LTI 返回映射(§5.6)依赖 \(e=0\) 的秩亏降维;如果你设 \(e=0.5\),零动力学不再塌缩到一维,稳定性判据完全不同。 正确做法:\(e\) 是建模决策,不是事后调的参。先想清楚物理(脚弹不弹),再选 \(e\),再展开对应的理论。
练习¶
5.2.1(推导题,在草稿纸上完成) 对平面双足的单点足端塑性冲击,设 \(q=(x,z,\phi,\theta_1,\theta_2)\)(浮动基座位置姿态 + 两个关节角),摆动脚位置 \(p_{\text{foot}}(q)\in\mathbb R^2\),Jacobian \(J=\partial p_{\text{foot}}/\partial q\in\mathbb R^{2\times5}\)。(a) 写出冲击映射 \(\dot q^+=P_\Delta\dot q^-\) 的完整表达式;(b) 证明 \(P_\Delta\) 关于 \(M\)-内积幂等(\(P_\Delta^2=P_\Delta\));(c) 证明冲击耗散动能 \(\Delta T\ge0\),并指出 \(\Delta T=0\) 当且仅当 \(\dot q^-\) 已经满足 \(J\dot q^-=0\)(即冲击前脚已无穿透速度)。
5.2.2(开放思考题) 离地 guard \(g=\lambda_n\) 需要从约束动力学反解法向力。考虑支撑相动力学 \(M\ddot q+h=S^\top\tau+J^\top\lambda\) 与接触约束 \(J\ddot q+\dot J\dot q=0\)(加速度级约束)。(a) 联立这两式,解出 \(\lambda\) 作为 \((q,\dot q,\tau)\) 的显式函数(提示:用 \(JM^{-1}\) 左乘动力学方程消 \(\ddot q\))。(b) 离地条件 \(\lambda_n=0\) 实际是 \(\lambda\) 的法向分量归零;讨论:为什么 \(\lambda_n\) 还依赖控制 \(\tau\)?这对"离地时刻可控"意味着什么(控制器能否主动决定何时离地)?
5.2.3(证明题) 横截性 \(\nabla g^\top F^-\neq0\) 保证穿越时刻良定义。用隐函数定理严格证明:设标称轨迹 \(\bar x(t)\) 在 \(t^*\) 穿越 guard \(g(x)=0\),且 \(\nabla g(\bar x(t^*))^\top F^-(\bar x(t^*))\neq0\)。则对充分小的初值扰动 \(\delta x_0\),存在唯一的扰动穿越时刻 \(t^*+\delta t\),且 \(\delta t=-\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}+o(\|\delta x^-\|)\),其中 \(\delta x^-\) 是扰动轨迹在标称穿越时刻 \(t^*\) 处相对标称的偏差。(这正是 §5.3 第一步,提前推一遍能让你在读 §5.3 时游刃有余。)
§5.3 横截性与穿越时刻灵敏度:Saltation 推导的第一步 ⭐⭐⭐¶
这一节解决什么问题:§5.2 备齐了所有原料(\(g,\nabla g,\Delta,D\Delta,F^\pm\)),并在练习 5.2.3 抛出一个关键命题——扰动穿越时刻 \(\delta t\) 的公式。这一节给出该命题的**完整解答级推导**:用隐函数定理严格证明 \(\delta t\) 的存在唯一性与一阶公式。这一步是 Saltation 矩阵 \(\Xi\) 的"地基中的地基"——\(\Xi\) 公式里那个让无数初学者困惑的分母 \(\nabla g^\top F^-\),正是从这里来的。理解了 \(\delta t\),§5.4 推 \(\Xi\) 就只是"把 \(\delta t\) 代回去"的机械步骤。
动机:为什么"扰动什么时候撞面"是个真问题¶
回到 §5.0 那个落地的摆动腿。标称轨迹 \(\bar x(t)\) 在精确时刻 \(t^*\) 触地(脚底高度 \(g(\bar x(t^*))=0\))。现在给初值一个微小扰动 \(\delta x_0\)——也许是传感器噪声,也许是控制误差,也许是优化器在试探梯度。扰动后的轨迹 \(x(t)=\bar x(t)+\delta x(t)\) 会在一个**稍微不同**的时刻 \(t^*+\delta t\) 触地。
为什么这个 \(\delta t\) 如此重要?因为**触地的那一瞬间,两条轨迹经历的物理是不同的**。考虑标称时刻 \(t^*\):
- 标称轨迹此刻**正在触地**,速度即将被冲击 \(\Delta\) 拉回。
- 扰动轨迹此刻**还没触地**(若 \(\delta t>0\))或**已经触地**(若 \(\delta t<0\))——它和标称轨迹处在混合系统的不同"相"里。
这就是混合系统灵敏度的核心困难,用一句话概括:
本质洞察:在光滑 ODE 里,"两条邻近轨迹在同一时刻的状态差"是一个良定义的、连续演化的量(就是 \(\Phi(t,t_0)\delta x_0\))。但在混合系统里,存在一个时间窗 \([\,t^*,\,t^*+\delta t\,]\),在这个窗内两条轨迹一条已跳变、一条未跳变——它们服从不同的动力学。如果你天真地比较"同一时刻 \(t^*+\delta t/2\) 的两个状态",你比较的是一个已经被 \(\Delta\) 投影过的速度和一个还没被投影的速度,差出来的不是灵敏度,而是冲击本身的大小(\(O(1)\) 而非 \(O(\delta x)\))。\(\Xi\) 的全部技术,就是正确地"对齐"这两条轨迹的跳变事件,把这个时间错位的影响一阶地补偿掉。
所以第一步必须是:精确刻画 \(\delta t\) 如何依赖 \(\delta x\)。这不是 \(\Xi\) 推导的辅助引理,而是 \(\Xi\) 的灵魂——\(\Xi\) 比 reset Jacobian \(D\Delta\) 多出来的那个秩-1 项,整项都是 \(\delta t\) 的贡献。
反面:如果假装 \(\delta t=0\)(在同一时刻比较)会怎样¶
在严格推导前,先看看"不考虑 \(\delta t\)"的错误做法会错成什么样,这能让你理解为什么后面要费这么大劲。
假设我们偷懒,认为"扰动很小,触地时刻的变化可以忽略,就当两条轨迹都在 \(t^*\) 触地"。于是我们把灵敏度算成:在 \(t^*\) 之前用 pre-event 的状态转移矩阵 \(\Phi^-\) 传播,在 \(t^*\) 处两条轨迹都过 reset(导数为 \(D\Delta\)),\(t^*\) 之后用 post-event 的 \(\Phi^+\) 传播。整段灵敏度就是 \(\Phi^+ D\Delta\,\Phi^-\)。
这个结果在一种情形下恰好正确:当 \(F^+=D\Delta\,F^-\),即"跳变后的标称速度恰好等于跳变前速度过 reset 导数的像"。这种巧合一般不成立。我们来看它一般情况下错在哪:
考虑一个具体的反面例子——竖直下落的弹性球(\(e=1\)),状态 \(x=(p,v)\)(高度、速度),guard \(g=p=0\)(落地),reset \(\Delta(p,v)=(p,-v)\)(速度反向)。标称球在 \(t^*\) 以 \(v^-<0\) 落地,反弹为 \(v^+=-v^-=|v^-|>0\)。现在:
- pre-event 向量场 \(F^-=(v^-,\ -G)\)(\(G\) 是重力加速度,速度向下,加速度向下)。
- post-event 向量场 \(F^+=(v^+,\ -G)=(-v^-,\ -G)\)。
- reset 导数 \(D\Delta=\mathrm{diag}(1,-1)\)。
- 检验那个巧合条件:\(D\Delta\,F^-=(1\cdot v^-,\ (-1)\cdot(-G))=(v^-,\ G)\),而 \(F^+=(-v^-,\ -G)\)。二者完全不同(位置分量差 \(2v^-\),速度分量差 \(2G\))。
所以"假装 \(\delta t=0\)"对弹跳球必然出错。错的根源很直观:位置扰动 \(\delta p\) 会让球早一点或晚一点落地,而落地时刻的差异,会通过重力使速度多积累/少积累一点,从而改变反弹后的速度。这个"位置不确定性耦合进速度"的通道,恰恰是 §5.0"如果跳过本章会怎样"里 Cassie EKF 发疯的根因——它整项就藏在 \(\delta t\) 里。漏掉 \(\delta t\),你就漏掉了这条耦合通道。
对比性思维(反事实):如果地面没有重力会怎样(\(G=0\))?那么 \(F^-=(v^-,0)\),\(F^+=(-v^-,0)\),\(D\Delta F^-=(v^-,0)\),巧合条件仍不满足(位置分量差 \(2v^-\))。但此时速度分量的耦合消失了——这说明 \(\delta t\) 项的"速度通道"由重力(更一般地,由 pre/post 加速度差)驱动,而"位置通道"由速度差驱动。\(\Xi\) 的秩-1 修正项把这两条通道统一编码进一个外积。理解了这个反事实,你就知道 \(\Xi\) 修正项里每个因子的物理来源。
历史:从 Aizerman-Gantmakher 到隐函数定理的现代语言¶
\(\delta t\) 公式的数学内核——隐函数定理保证"约束方程 \(g=0\) 局部可解出时间"——是 19 世纪就成熟的分析工具。但把它系统地用到"扰动如何穿过切换面"这个问题上,要归功于 §5.0 提到的 Aizerman 与 Gantmakher(1958)。他们研究继电器控制系统时,第一次写下了切换面上扰动传播的跳跃矩阵(即 Saltation 矩阵),其推导内核正是本节的 \(\delta t\) 加上一步速度对齐。
苏联学派的这套工具长期沉睡在控制理论的角落,直到 21 世纪被机器人学界"重新发现"。Burden-Sastry-Koditschek-Revzen 2016(SIADS)用现代非光滑分析的语言(Bouligand 导数)重新解释了它;Kong-Payne-Zhu-Johnson 2024(Proc. IEEE)则把它写成一篇面向机器人学家的、以"三步几何推导"为主线的权威教程——本章 §5.3-5.4 的推导组织正是沿用了 Kong 2024 的思路,只是展开得更细。一个有趣的历史细节:Saltation 这个词来自拉丁语 saltatio(跳跃、舞蹈),由 Filippov 学派引入,形象地刻画了扰动"跳过"切换面的动作。
理论:隐函数定理严格推导 \(\delta t\)(练习 5.2.3 完整解答)¶
现在给出严格推导。这一段是练习 5.2.3 的标准答案,也是后续一切的基石,请逐行跟住。
设定与符号。设标称轨迹 \(\bar x(t)\) 是 pre-event 动力学 \(\dot x=F^-(x)\) 的解,在时刻 \(t^*\) 精确命中 guard:
为记号简洁,记标称穿越点 \(\bar x^-:=\bar x(t^*)\),标称穿越速度 \(F^-:=F^-(\bar x^-)\),guard 梯度 \(\nabla g:=\nabla g(\bar x^-)\)(都在标称穿越点取值,是常向量/常数)。
扰动轨迹 \(x(t;\delta x_0)\) 从 \(\bar x(0)+\delta x_0\) 出发,同样服从 pre-event 动力学 \(\dot x=F^-(x)\)(注意:在它自己触地之前,扰动轨迹一直在 pre-event 相)。我们要找它命中 guard 的时刻 \(t^*+\delta t\),即求解关于 \((t,\delta x_0)\) 的方程:
第一步:验证隐函数定理的前提。在标称点 \((t,\delta x_0)=(t^*,0)\) 处:
- 方程成立:\(G(t^*,0)=g(x(t^*;0))=g(\bar x(t^*))=0\)。✓
- 对 \(t\) 的偏导非零(这是关键的可解条件):
这里第二个等号用了链式法则(\(g\) 沿轨迹的时间导数 = 梯度点乘轨迹切向量),第三个等号用了 \(\dot{\bar x}=F^-(\bar x)\)(标称轨迹服从 pre-event 动力学)。横截性条件恰好就是隐函数定理要求的 \(\partial G/\partial t\neq 0\)——这绝非巧合,而是横截性的全部意义所在:它保证"约束面 \(g=0\) 在时间方向上是可穿透的",从而触地时刻可以被唯一地解出来。
- 光滑性:\(g\in C^1\),\(F^-\in C^1\)(保证轨迹 \(x(t;\delta x_0)\) 对 \((t,\delta x_0)\) 联合 \(C^1\),由 ODE 解对初值的光滑依赖,即前置自测第 1 题的变分方程理论)。✓
三个前提齐备,隐函数定理适用。
第二步:隐函数定理给出穿越时刻的存在唯一性。由隐函数定理,存在 \((t^*,0)\) 的邻域和一个 \(C^1\) 函数 \(t=\tau(\delta x_0)\),满足 \(\tau(0)=t^*\) 且 \(G(\tau(\delta x_0),\delta x_0)\equiv 0\)。换言之:
对充分小的初值扰动 \(\delta x_0\),扰动轨迹存在唯一的穿越时刻 \(\tau(\delta x_0)=t^*+\delta t\),且 \(\delta t\) 是 \(\delta x_0\) 的光滑函数。 这就是练习 5.2.3 要求的"存在唯一性"部分。
第三步:求 \(\delta t\) 的一阶表达式。隐函数定理还直接给出 \(\tau\) 的导数。对恒等式 \(G(\tau(\delta x_0),\delta x_0)\equiv 0\) 两边关于 \(\delta x_0\) 求全导数(在 \(\delta x_0=0\) 处):
我们已经算了 \(\partial G/\partial t=\nabla g^\top F^-\)(标量)。还需 \(\partial G/\partial\delta x_0\):
其中 \(\Phi^-(t^*,0)\) 是 pre-event 动力学沿标称轨迹从 \(0\) 到 \(t^*\) 的状态转移矩阵(变分方程 \(\dot\Phi=A^-\Phi,\ \Phi(0,0)=I\) 的解,\(A^-=\partial F^-/\partial x\))。
代回:
第四步:用"标称穿越时刻处的偏差" \(\delta x^-\) 改写。上式是 \(\delta t\) 对初值 \(\delta x_0\) 的导数。但 \(\Xi\) 的推导更方便用一个局部量:扰动轨迹在标称穿越时刻 \(t^*\) 处相对标称的偏差 \(\delta x^-:=x(t^*;\delta x_0)-\bar x(t^*)\)。一阶下 \(\delta x^-=\Phi^-(t^*,0)\,\delta x_0\)。于是 \(\delta t\) 的一阶展开为:
这正是练习 5.2.3 要求证明的公式,证毕。
阶段小结:到这里我们完成了 \(\Xi\) 推导的**第一步**——用隐函数定理严格建立了 \(\delta t=-\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}\),并看清横截性条件 \(\nabla g^\top F^-\neq0\) 就是隐函数定理的可解性前提。接下来 §5.4 要做的是:把这个 \(\delta t\) 代进"对齐两条轨迹跳变事件"的几何里,导出完整的 \(\Xi\)。
几何直觉:\(\delta t\) 公式的三个观察¶
干推导容易让人只见树木。退一步,\(\delta t=-\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}\) 这个公式有三层值得反复回味的几何含义。
观察一:分子是"扰动在 guard 法向上的投影"。 \(\nabla g\) 是 guard 曲面 \(g=0\) 的法向量。\(\nabla g^\top\delta x^-\) 把状态扰动 \(\delta x^-\) 投影到这个法向上——它度量的是"扰动让我们离 guard 面更近还是更远了"。沿 guard 切向的扰动(\(\nabla g^\top\delta x^-=0\))不改变触地时刻(\(\delta t=0\))——这很合理,沿着面滑动不影响你什么时候撞上面。
观察二:分母是横截速度,它把"空间距离"换算成"时间提前量"。 \(\nabla g^\top F^-\) 是标称轨迹穿过 guard 的法向速度(\(g\) 沿轨迹的减小率)。负号加上它,整个公式做的是一次"距离 ÷ 速度 = 时间"的量纲换算:扰动让我们在法向上离面近了 \(\nabla g^\top\delta x^-\),而我们正以速度 \(\nabla g^\top F^-\) 逼近面,所以提前 \(\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}\) 撞上。这就是为什么横截速度出现在分母——它是"空间→时间"的兑换汇率。
观察三:横截速度越小,\(\delta t\) 越敏感——这是 grazing 灾难的种子。 当轨迹近乎与 guard 相切(\(\nabla g^\top F^-\to 0^-\)),同样大小的扰动会引起任意大的 \(\delta t\)。物理上:擦着地面飞过时,一点点高度扰动就决定了"碰到"还是"没碰到",触地时刻对扰动极度敏感。数学上:\(\delta t\to\infty\),一阶近似彻底失效。这就是 §5.5 要专门处理的 grazing 分岔的根源——它的病根,第一次清晰地暴露在这里的分母上。
理论-工程桥接:\(\delta t\) 公式在工程里直接对应一个可测、可监控的量——触地时刻的不确定性。在 Salted Kalman Filter(§5.7)里,状态协方差 \(P^-\) 经 \(\nabla g^\top\) 投影并除以横截速度,就给出触地时刻的方差 \(\mathrm{Var}(\delta t)\approx\dfrac{\nabla g^\top P^-\nabla g}{(\nabla g^\top F^-)^2}\)。当机器人接近 grazing(脚几乎平着擦地)时这个方差爆炸——这正是工程上"软着陆/擦地步态难估计"的数学解释。一个实用的健康监控指标就是实时计算 \(\nabla g^\top F^-\),当它接近零时发出"灵敏度退化"警告(Kong 2024 Proc. IEEE 建议的做法)。
⚠️ 常见陷阱¶
💡 概念误区:把 \(\delta x^-\) 理解成"扰动轨迹的触地点与标称触地点之差" 新手想法:"\(\delta x^-\) 不就是两条轨迹各自触地时状态的差吗?" 实际上:\(\delta x^-\) 是**两条轨迹在同一个标称时刻 \(t^*\) 的状态差**(\(x(t^*)-\bar x(t^*)\)),不是"各自触地点之差"。这个区别极关键:在 \(t^*\) 这个公共时刻,标称轨迹恰好在 guard 上,而扰动轨迹一般**不在** guard 上(它早或晚一点才到)。我们要的是这个"公共时刻的偏差",因为只有固定同一时刻,\(\Phi^-\) 才能把它和初值 \(\delta x_0\) 线性联系起来。 为什么重要:如果用"各自触地点之差",那个差已经隐含了 \(\delta t\) 的信息,会和后面 §5.4 的 \(\delta t\) 项重复计算,导出错误的 \(\Xi\)。 正确做法:始终在固定的标称穿越时刻 \(t^*\) 处定义偏差,把 \(\delta t\) 作为独立的、由 \(\delta x^-\) 显式决定的量分离出来。
💡 概念误区:以为横截性只是个"技术性假设",可有可无 新手想法:"\(\nabla g^\top F^-\neq0\) 看着像数学家为了让定理成立硬加的条件,工程上应该没那么重要。" 实际上:横截性是 \(\delta t\)(进而 \(\Xi\))**存在**的充要前提,不是装饰。它在三个层面同时是"红线":(1) 隐函数定理的可解性条件;(2) guard 方向条件(§5.2,保证是"穿越"而非"擦过");(3) \(\Xi\) 公式的分母。三者是同一个量。 为什么重要:违反横截性 = grazing = 一阶灵敏度理论崩溃(§5.5)。这在工程上是真实故障:擦地步态、刚好够到的踏脚、临界翻越——这些都是 \(\nabla g^\top F^-\approx0\) 的场景,是估计器/优化器最容易崩的地方。 正确做法:把 \(\nabla g^\top F^-\) 当作一个需要实时监控的"健康指标",而不是推导时一笔带过的假设。
🧠 思维陷阱:认为 \(\delta t\) 只是中间变量,最终 \(\Xi\) 里不会出现"时间" 新手想法:"\(\Xi\) 是状态扰动 \(\delta x^-\to\delta x^+\) 的矩阵,是纯空间的映射,时间 \(\delta t\) 应该在推导中途被消掉、不留痕迹。" 实际上:\(\delta t\) 确实会被代换消去(用 \(\delta t=-\nabla g^\top\delta x^-/\nabla g^\top F^-\)),但它**留下了一个永久的烙印**——\(\Xi\) 比 reset Jacobian \(D\Delta\) 多出来的整个秩-1 项 \(\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\),就是 \(\delta t\) 的"遗产"。说"时间被消掉了"是对的,说"时间不留痕迹"是错的。 为什么重要:很多人记 \(\Xi\) 公式只记住"是 \(D\Delta\)",漏掉秩-1 项,因为他们没理解这一项的来源是 \(\delta t\)。理解了"\(\delta t\) 的遗产",你就再也不会漏掉它。 正确思维:把 \(\Xi=D\Delta+(\text{时间错位补偿})\) 牢牢记成"reset 导数 + \(\delta t\) 的遗产"两部分。
练习¶
5.3.1(推导题,在草稿纸上完成) 对 §5.3 反面例子中的竖直弹性球(\(x=(p,v)\),\(g=p\),\(\Delta(p,v)=(p,-v)\),\(F^-=(v,-G)\)):(a) 在标称落地点(\(p=0,v=v^-<0\))算出 \(\nabla g=(1,0)^\top\) 和横截速度 \(\nabla g^\top F^-=v^-\);(b) 写出 \(\delta t=-\delta p^-/v^-\) 并解释符号——为什么 \(\delta p^->0\)(扰动让球更高一点)配 \(v^-<0\) 给出 \(\delta t>0\)(晚落地),这是否符合物理直觉?(c) 若把 guard 改成"球心到地面距离 = 半径 \(r\)",即 \(g=p-r\),\(\nabla g\) 和横截速度变不变?由此说明 \(\delta t\) 公式只依赖 guard 的**梯度**而非 guard 的具体水平值。
5.3.2(开放思考题) 考虑一个带时变地形的 guard \(g(x,t)=p_z(x)-h(t)\),其中 \(h(t)\) 是随时间起伏的地面高度(如机器人踩在晃动的平台上)。(a) 重新走一遍隐函数定理推导,证明此时 \(\delta t=-\dfrac{\nabla_x g^\top\delta x^-}{\nabla_x g^\top F^-+\partial_t g}\),分母多出 \(\partial_t g=-\dot h(t^*)\)。(b) 解释这个新项的物理含义:地面正在上升(\(\dot h>0\))会让触地"提前"还是"延后"?(c) 静止地形(\(\dot h=0\))时退化回 §5.3 的公式——验证你的推导自洽。
5.3.3(证明题) 证明 \(\delta t\) 公式的"切向不变性":设 \(\delta x^-\) 是 guard 曲面在标称穿越点的切向量(即 \(\nabla g^\top\delta x^-=0\))。证明 \(\delta t=o(\|\delta x^-\|)\)(一阶为零),并进一步讨论:这是否意味着"沿 guard 切向的扰动完全不影响后续轨迹"?(提示:\(\delta t=0\) 只说明触地**时刻**不变,但 \(\delta x^-\) 本身仍会通过 reset 和 post-flow 传播——这预告了 §5.4 中 \(\Xi\) 作用在切向扰动上仍可能非平凡。)
§5.4 Saltation 矩阵的完整推导:从 \(\delta x^-\) 到 \(\delta x^+\) ⭐⭐⭐¶
这一节解决什么问题:这是本章的**心脏**。§5.3 给了我们 \(\delta t\)。现在我们要回答终极问题——跳变前的状态扰动 \(\delta x^-\),经过这场"时间错位 + 冲击",变成跳变后的多少 \(\delta x^+\)? 这个一阶映射 \(\delta x^+=\Xi\,\delta x^-\) 的矩阵 \(\Xi\) 就是 Saltation 矩阵。我们将给出三步几何推导,逐项解释那个让人困惑的秩-1 修正项,并用三个类比把"为什么 \(\Xi\neq D\Delta\)"刻进直觉。学完这一节,你就握住了打开 §5.5-5.7 全部应用的钥匙。
动机:把两条"事件错位"的轨迹对齐¶
我们的目标用一张时间线就能说清。画出标称轨迹和扰动轨迹(设 \(\delta t>0\),扰动轨迹晚触地):
时刻: ... t*-δt t* t*+δt ...
标称轨迹: ───pre───●(触地,过Δ)───post────────► 在 t* 跳变
扰动轨迹: ───pre──────────────●(触地,过Δ)──post► 在 t*+δt 跳变
↑ ↑
标称已跳变 扰动才跳变
╰──错位窗 [t*, t*+δt]──╯
困难在那个"错位窗" \([t^*,t^*+\delta t]\):窗内**标称轨迹已经在 post-event 相**(已过 reset,按 \(F^+\) 流动),而**扰动轨迹还在 pre-event 相**(未过 reset,按 \(F^-\) 流动)。如果我们想比较"跳变完成后"两条轨迹的状态差 \(\delta x^+\),必须把它们放在一个公共的、双方都已跳变的时刻上比较。
\(\Xi\) 推导的全部技巧,就是**选一个公共比较时刻,把两条轨迹都"搬运"到那里**,然后做差。Kong 2024 选的公共时刻是扰动轨迹的触地时刻 \(t^*+\delta t\)(此时双方都已跳变)。我们跟随这个选择,分三步搬运。
本质洞察:Saltation 矩阵不是"reset 的导数",而是"在正确对齐了跳变事件之后,pre-event 扰动到 post-event 扰动的导数"。"正确对齐"这四个字是全部技术含量——它要求我们用 pre-event 流把扰动轨迹推进 \(\delta t\) 让它触地,再用 post-event 流把标称轨迹倒推 \(\delta t\) 回到同一时刻。这两个 \(\delta t\) 的推进/倒推,一个贡献 \(F^-\delta t\),一个贡献 \(-F^+\delta t\),它们的差 \((F^+-\ldots)\delta t\) 经过 reset 后就长成了那个秩-1 修正项。记住:\(\Xi\) 的灵魂是"对齐",\(D\Delta\) 只是对齐之后顺手要做的那一步 reset。
理论:三步几何推导¶
我们要计算 \(\delta x^+:=x(t^*+\delta t)^+-\bar x(t^*)^+\),即"扰动轨迹刚跳变后的状态"减去"标称轨迹刚跳变后的状态(已演化到 \(t^*+\delta t\)?不——标称在 \(t^*\) 跳变)"。为避免歧义,严格的做法是把两条轨迹都搬到**扰动轨迹的跳变时刻 \(t^*+\delta t\) 之后那一瞬**比较。逐步来。
第一步(pre-flow 推进):把扰动轨迹从 \(t^*\) 推进到它的触地时刻 \(t^*+\delta t\)。
在 \(t^*\) 时刻,扰动轨迹相对标称的偏差是 \(\delta x^-\)(§5.3 定义),且它还在 pre-event 相。从 \(t^*\) 到 \(t^*+\delta t\),它继续按 \(F^-\) 流动。一阶下,它的状态从 \(\bar x(t^*)+\delta x^-\) 沿 \(F^-\) 推进 \(\delta t\):
此刻扰动轨迹**恰好在 guard 上**(这正是 \(\delta t\) 的定义——它走到这个时刻才触地)。它相对"标称触地点 \(\bar x(t^*)\)"的偏差是:
这一步的几何:扰动轨迹比标称晚 \(\delta t\) 触地,这段额外飞行让它在触地瞬间多漂移了 \(F^-\delta t\)。
第二步(reset):两条轨迹各自过 reset \(\Delta\)。
扰动轨迹在 \(t^*+\delta t\) 触地,过 \(\Delta\)。标称轨迹在 \(t^*\) 触地,也过 \(\Delta\)。reset 是同一个映射 \(\Delta\),对它在标称触地点 \(\bar x^-\) 处线性化,导数为 \(D\Delta\)。扰动轨迹触地点相对标称触地点的偏差 \(\delta x^-_{\text{at-impact}}\) 经 reset 后变为:
(若 reset 显式含时 \(\Delta(x,t)\),还要加 \(D_t\Delta\cdot\delta t\);足式场景 reset 通常不显含时,\(D_t\Delta=0\),我们先略去,最后补回。)
这一步的几何:两条轨迹各自在自己的触地点过冲击,导数都是 \(D\Delta\)(因为 reset 是同一个映射,差别只在作用点,一阶下用同一个 \(D\Delta\))。
第三步(post-flow 拉回):把扰动轨迹从 \(t^*+\delta t\) 拉回 \(t^*\),与标称对齐。
现在两条轨迹都已跳变,但时刻不同——扰动在 \(t^*+\delta t\) 刚跳完,标称在 \(t^*\) 早已跳完并按 \(F^+\) 流动了 \(\delta t\)。要在公共时刻比较,把扰动轨迹"倒推" \(\delta t\) 回到 \(t^*\)(沿 post-event 流 \(F^+\) 反向)。等价地,把标称轨迹正推 \(\delta t\) 到 \(t^*+\delta t\)。我们采用后者更直观:标称轨迹从 \(t^*\) 的跳变后状态按 \(F^+\) 流动 \(\delta t\),新增漂移 \(F^+\delta t\)。于是在公共时刻 \(t^*+\delta t\),扰动相对标称的偏差是:
这一步的几何:标称轨迹比扰动早 \(\delta t\) 跳变,所以它在公共时刻已经按 post 动力学多走了 \(F^+\delta t\)——这段要从扰动的偏差里扣掉。
合并三步并代入 \(\delta t\)。 把三步拼起来:
现在代入 §5.3 的结果 \(\delta t=-\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}\):
因为这对任意 \(\delta x^-\) 成立,方括号里的矩阵就是 Saltation 矩阵:
带时变 guard / 时变 reset 的完整版(分母补 \(\partial_t g\),分子补 \(-D_t\Delta\)):
这与 Kong-Payne-Zhu-Johnson 2024 (Proc. IEEE) 的式子 \(\Xi=D_xR+\dfrac{(F_J^+-D_xR\,F_I^--D_tR)\,D_xg}{D_tg+D_xg\,F_I^-}\) 完全一致(他们用 \(R\) 记 reset、\(D_xg\) 记 guard 梯度行向量)。
阶段小结:到这里我们用三步几何推导得到了 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\)。三步对应三个物理动作:pre-flow 推进(扰动晚到 → 多漂 \(F^-\delta t\))、reset(过冲击 → 乘 \(D\Delta\))、post-flow 拉回(标称早跳 → 扣 \(F^+\delta t\))。接下来逐项拆解这个公式的几何,并用类比固化直觉。
逐项几何解释:\(\Xi\) 的解剖学¶
把 \(\Xi=\underbrace{D\Delta}_{\text{基础项}}+\underbrace{\dfrac{(F^+-D\Delta F^-)}{\nabla g^\top F^-}}_{\text{列向量}}\,\underbrace{\nabla g^\top}_{\text{行向量}}\) 拆成四个零件,逐一审视。
零件一:基础项 \(D\Delta\)(reset 自身的导数)。 这是 \(\Xi\) 的"零阶骨架"——如果触地时刻完全不随扰动变化(\(\delta t\equiv0\)),\(\Xi\) 就退化成 \(D\Delta\)。它回答"如果两条轨迹同时触地,冲击如何放大/缩小它们的差异"。对塑性冲击(§5.2),\(D\Delta=\begin{bmatrix}I&0\\ \partial(P_\Delta\dot q)/\partial q&P_\Delta\end{bmatrix}\)。
零件二:行向量 \(\nabla g^\top\)(guard 法向,决定"哪个方向的扰动触发修正")。 修正项是一个外积 \((\cdots)\nabla g^\top\),秩为 1。\(\nabla g^\top\) 作为左因子,意味着修正项**只对 \(\delta x^-\) 在 guard 法向上的分量起作用**:若 \(\delta x^-\) 沿 guard 切向(\(\nabla g^\top\delta x^-=0\)),修正项为零,\(\Xi\delta x^-=D\Delta\delta x^-\)。这与 §5.3 观察一一致——切向扰动不改变触地时刻,故无时间错位补偿。
零件三:分母 \(\nabla g^\top F^-\)(横截速度,"空间→时间"汇率)。 已在 §5.3 反复强调。它出现在分母,意味着横截速度越小,修正项越大;趋零时 \(\Xi\) 爆炸(grazing,§5.5)。
零件四:列向量 \(F^+-D\Delta F^-\)("速度失配",决定"修正往哪个状态方向加")。 这是最富物理含义的一项。它度量"post-event 标称速度 \(F^+\)"与"pre-event 标称速度过 reset 导数的像 \(D\Delta F^-\)"之间的差。回忆 §5.3 反面:当 \(F^+=D\Delta F^-\)(速度匹配)时,这一项为零,\(\Xi=D\Delta\),"假装 \(\delta t=0\)"恰好正确。一般情况下二者失配,失配量 \(F^+-D\Delta F^-\) 正是触地时刻扰动 \(\delta t\) 注入 post-event 状态的方向。
把四个零件合起来读一遍 \(\Xi\delta x^-\) 的物理故事:扰动 \(\delta x^-\) 在 guard 法向上的投影 \(\nabla g^\top\delta x^-\),除以横截速度换算成触地时刻偏移 \(\delta t\);这个 \(\delta t\) 沿"速度失配方向" \(F^+-D\Delta F^-\) 注入 post-event 状态;再叠加上 reset 本身对 \(\delta x^-\) 的放大 \(D\Delta\delta x^-\)。 这就是 \(\Xi\) 的完整解剖。
本质洞察:\(\Xi\) 的秩-1 修正项把"一个标量(触地时刻偏移 \(\delta t\))"放大成"一个状态向量(沿速度失配方向的偏移)"。这正是混合系统区别于光滑系统的数学指纹——光滑系统的灵敏度永远是满秩流形上的连续传播,而混合系统在每个事件处都被注入一个**秩-1 的"时间→状态"耦合**。一个步态周期有 \(k\) 次接触,单值矩阵就被 \(k\) 个这样的秩-1 修正"扎"了 \(k\) 下(§5.4 末 + §5.5 的 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\))。理解 \(\Xi\) = "光滑骨架 \(D\Delta\) + 秩-1 时间耦合",是理解整个混合灵敏度理论的最高一层抽象。
三个类比:把"\(\Xi\neq D\Delta\)"刻进直觉¶
\(\Xi\) 公式抽象,三个类比从不同侧面帮你固化它。按 R7 纪律,每个都标注"像在哪、不像在哪"。
类比一:接力赛交接棒的"提前量"。 想象 4×100 米接力,第一棒(pre-event 动力学 \(F^-\))冲进交接区把棒交给第二棒(post-event 动力学 \(F^+\))。交接的位置(guard)是固定的一条线。若第一棒跑得比标称快一点(扰动 \(\delta x^-\)),他会**早一点**到交接线(\(\delta t<0\)),于是第二棒也要**早一点**起跑——但第二棒早起跑的这段时间里,他是以自己的速度 \(F^+\) 在跑,不是第一棒的速度。最终领先量 = 第一棒带来的领先(\(D\Delta\delta x^-\))+ 因交接时刻提前、第二棒多跑的那段(\(\propto(F^+-\ldots)\delta t\))。 - 像的部分:交接时刻随扰动变化(对应 \(\delta t\)),且交接后是用新速度 \(F^+\) 计算后续,这精确对应 \(\Xi\) 的秩-1 修正来自"事件时刻随扰动漂移"。 - 不像的部分:接力赛是 1 维(沿跑道),\(\Xi\) 是 \(n\) 维状态空间的矩阵;交接没有"速度突变"(\(D\Delta=I\)),而冲击有 reset 投影。不要把这个类比延伸到"\(\Xi\) 总是单纯的加法"——真实 \(\Xi\) 里 \(D\Delta\) 可以是秩亏投影,远比接力的恒等传递复杂。
类比二:两个时钟的"时区换算"误差。 设想你在比较纽约(pre 相)和伦敦(post 相)两地的事件。一个事件在纽约时刻 \(t^*\) 发生跨越(过国际日界线 = guard)。若事件被扰动推迟一点(\(\delta t\)),换算到伦敦时间时,这个推迟不是简单平移——因为两地"时钟走速"(向量场 \(F^-\) vs \(F^+\))不同,同样的 \(\delta t\) 在两个时区里对应不同的"事件状态偏移"。\(\Xi\) 的修正项 \((F^+-D\Delta F^-)\delta t\) 正是这个"跨时区换算的速度差"。 - 像的部分:核心是"同一个时间偏移 \(\delta t\),在事件前后两套动力学下对应不同的状态变化",这正是 \(F^+\neq D\Delta F^-\) 时修正项非零的原因。 - 不像的部分:时区换算是线性平移(差一个常数小时数),而 \(\Xi\) 涉及向量场在事件点的非平凡取值和 reset 的投影。边界:类比只到"事件前后速率不同导致换算非平凡"为止,不要推断"\(\Xi\) 像时差一样是固定偏移"——\(\Xi\) 依赖标称轨迹的具体穿越点。
类比三:光的折射(Snell 定律)。 光线(轨迹)从一种介质(pre 相,光速 \(\propto F^-\))穿过界面(guard)进入另一种介质(post 相,光速 \(\propto F^+\)),方向发生偏折。一束有微小角度偏差的入射光(扰动 \(\delta x^-\)),其出射光的偏差不等于入射偏差——界面两侧的"传播速度差"重新分配了偏差。Saltation 矩阵就是混合系统版的"折射矩阵":它把入射扰动映射到出射扰动,映射规则由界面法向 \(\nabla g\) 和两侧速度 \(F^\pm\) 共同决定。 - 像的部分:界面两侧动力学不同导致扰动被"重新折射",且偏折量依赖界面法向(对应 \(\nabla g\))——这与 \(\Xi\) 的结构惊人地对应。Filippov 学派引入 Saltation(拉丁语"跳跃")时,脑中正是这种"轨迹在面上折一下"的图像。 - 不像的部分:Snell 定律是可逆的、保能量的(弹性),而塑性冲击 \(D\Delta\) 是不可逆的、耗散的(秩亏)。边界:类比适用于"界面折射"的几何直觉,但不要延伸到"折射定律的可逆性"——塑性 \(\Xi\) 把一维速度子空间永久投影掉了,光的折射不会丢失维度。
三个类比的互补:接力赛抓住"事件时刻随扰动漂移 + 交接后用新速度";时区换算抓住"同一 \(\delta t\) 在两套动力学下不等价";折射抓住"界面两侧速度差决定扰动重分配"。三者从时间、换算、空间三个角度逼近同一个真相——\(\Xi=D\Delta+\)(事件错位的一阶补偿)。哪个类比对你最有用因人而异,但三个一起看,\(\Xi\) 就不再是一坨吓人的公式。
\(\Xi\) 与 reset Jacobian \(D\Delta\) 的关键区别(再强调)¶
这是初学者最常翻车的地方,单独拎出来用反事实钉死。
反事实:什么时候 \(\Xi=D\Delta\)(修正项消失)? 当且仅当 \(F^+=D\Delta F^-\)(速度匹配)。这有三个典型场景: 1. 纯逻辑切换、无状态跳变(\(\Delta=\text{id}\) 且 \(F^+=F^-\),即向量场也连续):此时 \(\Xi=I=D\Delta\)。但这种情形下根本没有"混合"的实质。 2. 离地事件:\(\Delta=\text{id}\)(速度不跳),但 \(F^+\neq F^-\)(支撑相→飞行相动力学切换)。此时 \(\Xi=I+\dfrac{(F^+-F^-)\nabla g^\top}{\nabla g^\top F^-}\neq I\)——即使 reset 是恒等,\(\Xi\) 仍非平凡!因为向量场在事件处跳变了。这是最反直觉、最容易漏的一点。 3. 速度恰好匹配的巧合:一般不发生。
对比性思维(不是 X 而是 Y):\(\Xi\) 不是 reset 的导数 \(D\Delta\),而是 "事件对齐后的端到端灵敏度"。混淆二者的后果在 §5.0 已预告:Cassie 的 EKF 用 \(D\Delta\) 传协方差 → 过度自信 → 发散(漏了秩-1 项);iLQR 用 \(D\Delta\) 反传值函数 → 梯度有偏 → 震荡不收敛。记住离地的例子——\(\Delta=\text{id}\) 但 \(\Xi\neq I\)——它是检验你是否真懂 \(\Xi\) 的试金石。 凡是认为"没有速度跳变就不用 \(\Xi\)"的人,都会在离地、锁膝这类"纯向量场切换"事件上栽跟头。
算例:离地事件的 \(\Xi\)(\(\Delta=\text{id}\) 但 \(\Xi\neq I\) 的具体数字)¶
把那个"试金石"算成数字,钉死直觉。考虑一个一维竖直跳跃模型(质心高度 \(p\)、速度 \(v\),状态 \(x=(p,v)\))的**离地瞬间**:从支撑相(受弹簧 + 重力)切换到飞行相(仅重力)。reset 是恒等(离地速度连续,\(\Delta=\text{id}\),\(D\Delta=I\)),但向量场跳变。
设定离地瞬间的量。离地点法向力恰好归零(弹簧力 = 0),设此刻速度 \(v^*>0\)(正在上升离地):
- pre-event 场(支撑相,弹簧力此刻为零但加速度仍含弹簧的导数效应——简化取弹簧力归零瞬间净加速度为 \(a^-\)):\(F^-=(v^*,a^-)\)。
- post-event 场(飞行相,仅重力):\(F^+=(v^*,-G)\)。位置分量连续(\(v^*\) 相同),加速度分量从 \(a^-\) 跳到 \(-G\)。
- 离地 guard:\(g=\lambda_n\)(法向力),但为手算,等价地用"弹簧压缩量 = 自然长度"的运动学代理,设其梯度在状态空间给出 \(\nabla g=(1,0)^\top\)(随高度增加力减小,方向相反时取符号),横截速度 \(\nabla g^\top F^-=v^*\)。
计算 \(\Xi\)。 因 \(D\Delta=I\):
关键观察:\(\Xi\neq I\),即使 \(\Delta=\text{id}\)!左下角元素 \(-(G+a^-)/v^*\) 完全来自**向量场的跳变** \(F^+-F^-\)。物理含义:离地时刻随高度扰动而变(早离地/晚离地),而离地前后的加速度不同(支撑相的 \(a^-\) vs 飞行相的 \(-G\)),这个时刻差通过加速度失配注入了速度扰动。用 \(D\Delta=I\) 会完全漏掉这个左下角项——这正是"离地这种无速度跳变的事件也需要 \(\Xi\)"的铁证。
本质洞察:这个算例把 §5.4 最反直觉的一点变成了一个具体的数 \(-(G+a^-)/v^*\)。它告诉你:\(\Xi\) 的非平凡性有两个独立来源——reset 跳变(进 \(D\Delta\))和向量场跳变(进秩-1 修正)。 触地事件两者都有;离地事件只有后者,但后者足以让 \(\Xi\neq I\)。任何只盯着"状态跳没跳"来判断"要不要用 \(\Xi\)"的人,都会在这里翻车。记住:只要向量场在事件处跳变(\(F^+\neq F^-\)),哪怕状态完全连续,\(\Xi\) 也偏离 \(I\)。
进阶:\(\Xi\) 作为 Bouligand 导数(B-导数)¶
最后给出 \(\Xi\) 的现代非光滑分析诠释,这是 Burden-Sastry-Koditschek-Revzen 2016 (SIADS) 的核心贡献,也是 §5.0 末尾埋下的钩子。
混合系统的"流" \(\phi^t\)(从初值到 \(t\) 时刻状态的映射)在跨越 guard 时**不是经典可微的**——左导数和右导数不同(轨迹在 guard 两侧服从不同动力学)。但它是 Bouligand 可微(B-可微) 的:存在一个正齐次、连续的"B-导数",在每个方向上给出方向导数。对单个横截穿越的 guard,这个 B-导数沿穿越方向恰好就是 \(\Xi\)。
为什么必须用 B-导数而非普通 Jacobian?因为"扰动早触地"和"扰动晚触地"(\(\delta t\) 的两个符号)对应不同的"分段"——B-导数能在两个分段上分别给出正确的方向导数,且在横截情形下两侧一致地等于 \(\Xi\)。当多个 guard 同时激活(codim-2,§5.5),不同的触发顺序对应不同的复合 \(\Xi\) 序列,B-导数则是"所有可能顺序的复合 Saltation 之集合"——此时 \(\Xi\) 不再唯一,普通矩阵语言失效,必须用 B-导数的集值描述。
理论-工程桥接:B-导数理论给"梯度穿过接触事件"提供了**合法性证明**——这正是专题 6(Model-Based RL)让策略梯度穿过触地、以及可微仿真器(专题 4)正确反传的数学依据。一句话总结这个钩子:想让自动微分穿过混合事件,合法的对象是 \(\Xi\)(B-导数),不是朴素 autodiff,更不是 \(D\Delta\)。 朴素 autodiff 之所以在 grazing 附近发散,正是因为它无视了 B-导数的分段结构,错误地在两个分段间插值。
⚠️ 常见陷阱¶
💡 概念误区:把 \(\Xi\) 的修正项当成"高阶小量"可以忽略 新手想法:"\(D\Delta\) 是主项,那个分数修正项看着复杂,应该是个小修正,工程上忽略问题不大。" 实际上:修正项与 \(D\Delta\) 同阶(都是 \(O(1)\) 的矩阵),绝非高阶小量。在离地事件(\(\Delta=\text{id}\))它甚至是 \(\Xi\) 偏离 \(I\) 的**唯一**来源。忽略它 = 把混合系统当光滑系统处理,灵敏度系统性出错。 为什么重要:弹跳球的 \(\Xi\) 谱半径等于恢复系数 \(e\),而只用 \(D\Delta=\mathrm{diag}(1,-1)\) 算出的谱半径恒为 1——前者能正确预测 \(e<1\) 时的稳定收缩,后者永远判成临界稳定,结论定性错误。 正确做法:永远完整计算 \(\Xi\) 的两项。除非你能验证 \(F^+=D\Delta F^-\),否则修正项不可省。
💡 概念误区:以为 \(\nabla g^\top F^-\) 是分子的一部分(约分错误)
新手想法:"\(\Xi=D\Delta+(F^+-D\Delta F^-)\nabla g^\top/(\nabla g^\top F^-)\),分子分母都有 \(F^-\) 和 \(\nabla g\),能不能约掉?"
实际上:绝对不能约。分母 \(\nabla g^\top F^-\) 是一个**标量**(行向量乘列向量),分子 \((F^+-D\Delta F^-)\nabla g^\top\) 是一个**矩阵**(列向量乘行向量 = 外积)。标量做分母只是给整个外积矩阵缩放,\(\nabla g\) 在分子(作为行向量参与外积)和分母(作为点积的一半)扮演完全不同的角色,没有任何可约关系。
为什么重要:错误约分会得到维度都不对的表达式,是初学者手推 \(\Xi\) 时的高频低级错误。
正确做法:始终记住分母是标量、分子是矩阵。写代码时分母用 double,分子用矩阵,外积用 (Fp - DDelta*Fm) * dg.transpose()。
🧠 思维陷阱:认为离地这种"无速度跳变"的事件不需要 \(\Xi\) 新手想法:"离地时速度连续(\(\Delta=\text{id}\)),状态没跳,那灵敏度就是普通传播,\(\Xi=I\) 吧?" 实际上:\(\Delta=\text{id}\) 给出 \(D\Delta=I\),但 \(\Xi=I+\dfrac{(F^+-F^-)\nabla g^\top}{\nabla g^\top F^-}\neq I\)(只要向量场跳变 \(F^+\neq F^-\))。离地瞬间,支撑相动力学(受约束)切换到飞行相动力学(自由),\(F\) 是跳变的,秩-1 修正非零。 为什么重要:足式步态的每个周期既有触地(\(\Delta\neq\text{id}\))又有离地(\(\Delta=\text{id}\))。漏掉离地的 \(\Xi\),单值矩阵 \(M\) 算错,Floquet 乘子错,稳定性判据错。 正确思维:\(\Xi\) 由**两个**不连续驱动——reset 的状态跳变(进 \(D\Delta\))和向量场的跳变(进修正项)。只要其一非平凡,\(\Xi\) 就非平凡。 离地是"向量场跳但状态不跳"的纯粹例子,专门用来训练这个直觉。
练习¶
5.4.1(推导题,在草稿纸上完成) 对竖直弹性球(\(x=(p,v)\),\(g=p\),\(\Delta(p,v)=(p,-v)\),\(F^\pm\) 见 §5.3):(a) 算出 \(D\Delta=\mathrm{diag}(1,-1)\)、\(F^-=(v^-,-G)\)、\(F^+=(-v^-,-G)\)、\(\nabla g=(1,0)^\top\)、\(\nabla g^\top F^-=v^-\);(b) 代入公式得 \(\Xi=\begin{bmatrix}-1&0\\ -2G/v^-&-1\end{bmatrix}\)(请自己补全推导,注意 \(F^+-D\Delta F^-=(-2v^-,-2G)^\top\));(c) 验证 \(\det\Xi=1\)(辛!弹性碰撞保相空间体积)且谱半径为 1;(d) 把 \(e=1\) 改成一般 \(e\)(\(\Delta:v\mapsto-ev\)),重做并验证此时 \(\Xi\) 的相关特征量与 \(e\) 的关系,解释"谱半径 = \(e\)"的物理含义(碰撞越塑性,扰动收缩越快)。
5.4.2(开放思考题) 离地事件 \(\Delta=\text{id}\) 但 \(\Xi\neq I\)。(a) 取一个具体的平面单腿 hopper,支撑相向量场 \(F^-\)(含弹簧力 + 重力 + 约束),飞行相向量场 \(F^+\)(仅重力),离地 guard \(g=\lambda_n\)(法向力归零)。写出此时 \(\Xi=I+\dfrac{(F^+-F^-)\nabla g^\top}{\nabla g^\top F^-}\)。(b) 讨论 \(F^+-F^-\) 在离地瞬间等于什么(提示:离地瞬间 \(\lambda_n=0\),约束力消失,但 \(F\) 的差还来自约束加速度项 \(\dot J\dot q\) 的处理)。(c) 这个非平凡的 \(\Xi\) 对"飞行相轨迹对支撑相扰动的敏感度"意味着什么?
5.4.3(证明题) 证明 \(\Xi\) 的两条结构性质:(a) 若 reset 为恒等且向量场连续(\(\Delta=\text{id},\,F^+=F^-\)),则 \(\Xi=I\);(b) 对任意满足横截性的 guard,\(\Xi\) 把 guard 切空间映到……什么子空间?具体地,设 \(\delta x^-\) 满足 \(\nabla g^\top\delta x^-=0\)(pre-event 切向),证明 \(\Xi\delta x^-=D\Delta\,\delta x^-\)(修正项不作用于切向扰动),并讨论这与 §5.3.3"切向扰动不改变触地时刻"的一致性。
§5.5 混合系统的变分方程与周期步态稳定性 ⭐⭐⭐¶
这一节解决什么问题:§5.4 给了我们单次跳变的灵敏度 \(\Xi\)。但一个步态是**周期性重复**的"流动—跳变—流动—跳变…"。我们想回答:一个标称周期步态是稳定的吗?给它一个扰动(绊一下、地面不平),它会收敛回原步态还是发散摔倒?这一节把 \(\Xi\) 和光滑段的状态转移矩阵 \(\Phi\) 串成**单值矩阵 \(M\)**,用 Floquet 乘子给出周期步态稳定性的解析判据。这是 §5.6(HZD)和 §5.7(应用)的稳定性理论基础。
动机:步态稳定性 = "绊一下能不能恢复"¶
人走路时被绊一下,通常一两步就恢复了正常步态。这种"对扰动的自我修复能力"就是步态的**轨道稳定性(orbital stability)**。我们想把这个直觉变成可计算的判据。
困难在于步态是混合的:一个周期里有连续流动段(单/双支撑)和瞬间跳变(触地/离地)。光滑系统的稳定性理论(线性化 + 特征值)不能直接用——线性化在跳变处断裂。我们需要的工具,是把 \(\Xi\)(跳变处的灵敏度)和 \(\Phi\)(流动段的灵敏度)正确地缝合成一个"整周期灵敏度"。
本质洞察:周期步态稳定性的全部信息,浓缩在一个矩阵——单值矩阵(monodromy matrix)\(M\)——的特征值里。\(M\) 是"沿一个完整周期,扰动被放大/缩小的线性映射"。它由光滑段的 \(\Phi\) 和跳变处的 \(\Xi\) **交替相乘**构成。这个"交替相乘"的结构是混合系统稳定性分析的标志性特征:光滑段贡献 \(\Phi\)(连续演化),跳变贡献 \(\Xi\)(秩-1 时间耦合)。理解 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\) 这个乘积,就理解了"为什么足式步态能稳定"——稳定性是 \(\Phi\) 的发散倾向与 \(\Xi\)(尤其塑性冲击的秩亏投影)的收缩作用相互博弈的净结果。
理论:混合系统的变分方程¶
回顾前置自测第 1 题:光滑 ODE \(\dot x=f(x)\) 的扰动满足变分方程 \(\dot{(\delta x)}=A(t)\delta x\),\(A=\partial f/\partial x\),解为 \(\delta x(t)=\Phi(t,t_0)\delta x_0\)。混合系统的变分方程在此基础上加一条"跨 guard 跳跃律":
这就是 §5.4 全部工作的"成果收割"——它告诉我们:在混合系统里传播扰动,光滑段照常用 \(\Phi\),每撞一次 guard 就乘一个 \(\Xi\)。 对比光滑系统只有第一行,混合系统多出第二行的瞬间跳跃。
沿轨迹积分变分方程。考虑一条轨迹,依次经过:光滑段 0(用 \(\Phi_0\))→ 第 1 次跳变(用 \(\Xi_1\))→ 光滑段 1(\(\Phi_1\))→ 第 2 次跳变(\(\Xi_2\))→ … 把这些灵敏度依次复合(注意矩阵相乘是右作用,最先发生的在最右):
每个 \(\Phi_i\) 是第 \(i\) 段光滑动力学的状态转移矩阵,每个 \(\Xi_i\) 是第 \(i\) 次跳变的 Saltation 矩阵。
理论:单值矩阵与 Floquet 乘子¶
现在聚焦**周期步态**。设标称步态是一个周期 \(T\) 的轨道 \(\bar x(t)=\bar x(t+T)\),一个周期内恰好发生 \(n\) 次跳变。沿一整个周期复合所有灵敏度,得到**单值矩阵(monodromy matrix)**:
它是"经过一个完整周期,初始扰动 \(\delta x_0\) 被映射成 \(\delta x(T)=M\delta x_0\)"的线性算子。\(M\) 的特征值 \(\{\mu_i\}\) 称为 Floquet 乘子(Floquet multipliers)(也叫 characteristic multipliers)。它们决定轨道稳定性。
回顾前置自测第 5 题(Floquet 理论):光滑周期系统 \(\dot x=A(t)x\)(\(A(t+T)=A(t)\))的单值矩阵是 \(\Phi(T,0)\),其特征值(Floquet 乘子)\(|\mu_i|<1\) 对所有 \(i\) ⟺ 周期轨指数稳定。现在我们把这套理论搬到混合系统:唯一的改动是单值矩阵从纯 \(\Phi(T,0)\) 变成 \(\Phi\) 和 \(\Xi\) 交替的乘积 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\)。Floquet 乘子的判据完全不变——这就是跨章桥接的力量:旧工具(Floquet)+ 新缝合方式(插入 \(\Xi\))= 混合系统稳定性。
Floquet 乘子的稳定性判据。但有一个关键的细节——周期轨总有一个**平凡的 Floquet 乘子 \(\mu=1\)**,对应"沿轨道切向的扰动"(把扰动理解成"在轨道上提前/延后一点出发",它既不增长也不衰减,只是相位平移)。所以判据要"剔除这个平凡方向":
这与 Poincaré 截面分析等价——在 guard 上取一个截面,周期轨穿过它形成不动点,Poincaré 返回映射 \(P\) 的线性化 \(DP\) 的特征值恰好是 \(M\) 去掉平凡乘子后的那些 \(\mu_i\)。两种语言(单值矩阵 vs Poincaré 映射)描述同一件事:\(M\) 是"整周期 + 切向"的全空间映射,\(DP\) 是"截面内"的降维映射,二者特征值仅差一个平凡的 \(\mu=1\)。
几何直觉:\(\Phi\) 想发散,\(\Xi\) 来收缩¶
为什么足式步态——一个本质上不稳定的倒立摆系统——竟然能形成稳定的周期轨?答案藏在 \(M=\Phi\cdots\Xi\cdots\) 的乘积结构里。
- 光滑段的 \(\Phi\) 倾向于发散:单支撑相,机器人像一个倒立摆,质心偏离会被重力放大。\(\Phi\) 的某些特征值 \(>1\)(不稳定流形)。
- 跳变处的 \(\Xi\) 倾向于收缩:塑性冲击(\(e=0\))的 \(D\Delta\) 是秩亏投影(§5.2),它把一整个速度子空间"压扁"到约束流形上。这个投影对应 \(\Xi\) 的某些特征值 \(<1\)(甚至为 0)。
多视角理解(能量视角 vs 几何视角):从**能量视角**,每步触地的塑性冲击耗散动能(§5.2 的 \(\Delta T\ge0\)),这个耗散是步态稳定的"阻尼"来源——发散的能量被冲击周期性地"刹掉"。从**几何视角**,冲击的秩亏投影把相空间体积周期性地压缩(\(D\Delta\) 行列式 \(<1\) 甚至 \(=0\)),抵消了倒立摆动力学的体积膨胀。两个视角描述同一件事:稳定步态 = 流动段的膨胀被冲击的压缩恰好平衡。这也解释了为什么完全弹性碰撞(\(e=1\),\(\Xi\) 辛、保体积、无耗散)的"步态"通常不渐近稳定——没有压缩来平衡膨胀,最多临界稳定(如理想弹跳球)。
被动行走的奇迹。McGeer 1990 的被动动态行走器(passive dynamic walker)——一个没有任何驱动、仅靠重力下坡行走的双腿机构——能形成稳定的极限环步态。用 \(M\) 分析:下坡重力做功补充每步冲击耗散的能量(能量平衡),而冲击的秩亏投影提供 Floquet 乘子 \(<1\) 的收缩(轨道稳定)。这是混合系统稳定性理论最优美的范例——稳定性完全来自被动的"流动膨胀 vs 冲击收缩"博弈,无需任何反馈控制。
理论:常秩降维与子流形收缩(Burden-Revzen-Sastry 定理)¶
塑性冲击的秩亏带来一个深刻结论,值得展开——它解释了"模板模型为何精确"。
回忆 §5.2:\(e=0\) 的塑性冲击把状态投影到低维约束子流形(投影掉法向速度那一维)。Burden-Revzen-Sastry 2015 在"常秩降维假设"下证明(对应本章定理 T5):反复的塑性冲击使周期轨的邻域在有限时间内收缩到一个光滑的低维子流形上。换言之,混合系统虽然名义上活在高维状态空间,但塑性冲击的周期性投影让长期行为坍缩到一个低维不变流形。
这就是 模板-锚定(template-anchor) 思想的数学根基:SLIP(弹簧负载倒立摆)、LIPM(线性倒立摆)这类低维"模板模型"之所以能精确捕捉高维机器人("锚定"模型)的周期行为,不是工程近似,而是塑性冲击秩亏投影的数学必然——高维动力学的稳定流形本来就坍缩到了模板所在的低维子流形上。
理论-工程桥接:这个定理为足式控制的"分层架构"提供了理论辩护。工程上,我们常先用低维模板(LIPM/SRBD,见 05 足式简化模型)规划质心轨迹,再用全身控制器(WBC)追踪——这套分层看似是"为了降低计算量的工程妥协",但 Burden-Revzen-Sastry 定理告诉我们:低维模板捕捉了系统真正的长期动力学,分层不是妥协而是顺应数学结构。这与 §5.0 "HZD 利用周期接触序列结构"是同一个哲学——利用混合系统特有的降维结构,而非对抗它。
完整算例:弹跳球单值矩阵的端到端计算¶
光说不练假把式。这里把弹跳球(耗散,\(e<1\))的周期弹跳从头到尾算一遍——这是本章第一个能完整手算的混合稳定性例子,强烈建议跟着推一遍。
设定。竖直弹跳球,状态 \(x=(p,v)\)(高度、速度),重力 \(G\),恢复系数 \(e\)。一个周期 = 从地面以速度 \(v_0>0\) 弹起 → 上升到最高点 → 下落 → 落地(速度 \(v^-<0\))→ 冲击反弹(速度 \(v^+=-ev^->0\))。一个周期内一次冲击。
第一步:飞行段的状态转移矩阵 \(\Phi\)。 飞行段动力学 \(\dot p=v,\ \dot v=-G\),是线性的,Jacobian \(A=\begin{bmatrix}0&1\\0&0\end{bmatrix}\)(常数)。变分方程 \(\dot\Phi=A\Phi\) 的解是矩阵指数 \(\Phi(T_f)=e^{AT_f}\)。由于 \(A^2=0\)(幂零),\(e^{AT_f}=I+AT_f\):
直观:飞行 \(T_f\) 后,初始位置扰动 \(\delta p\) 原样保留,初始速度扰动 \(\delta v\) 既贡献 \(T_f\delta v\) 的位置漂移、又原样保留为速度扰动——这就是自由落体对扰动的线性传播。
第二步:落地冲击的 Saltation 矩阵 \(\Xi\)。 用 §5.4.1 的结果(一般 \(e\))。落地点 \(g=p=0\),\(\nabla g=(1,0)^\top\);pre-event 场 \(F^-=(v^-,-G)\),横截速度 \(\nabla g^\top F^-=v^-<0\);reset \(\Delta(p,v)=(p,-ev)\),\(D\Delta=\mathrm{diag}(1,-e)\);post-event 场 \(F^+=(-ev^-,-G)\)。计算速度失配列向量:
代入 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\),其中 \((F^+-D\Delta F^-)\nabla g^\top\) 是外积(列 × 行),\(\nabla g^\top=(1,0)\) 只选出第一列:
第三步:组装单值矩阵 \(M=\Xi\Phi\)。 一个周期 = 先飞行(\(\Phi\))后落地冲击(\(\Xi\)),按"先发生在右"的规则 \(M=\Xi\Phi\):
第四步:Floquet 乘子与稳定性。 这是 \(2\times2\) 矩阵,特征值由迹和行列式定。先算行列式(用 \(\det(\Xi\Phi)=\det\Xi\det\Phi\),且 \(\det\Phi=1\)):
(与"塑性程度"的物理一致:\(e=1\) 时 \(\det M=1\) 保体积,\(e<1\) 时 \(\det M=e^2<1\) 收缩。)特征值之积 \(\mu_1\mu_2=e^2\)。再看这个周期轨——它对应能量守恒的弹跳(给定 \(e\) 和驱动平衡),存在一个沿轨道切向的中性方向(相位),但弹跳球的"周期"由能量决定,实际分析中常取 Poincaré 截面(落地面 \(p=0\))降一维。降维后的标量返回映射:落地速度 \(v_{k+1}^-\) 与 \(v_k^-\) 的关系。由能量守恒,弹起速度 \(|v^+|=e|v^-|\),下次落地速度大小 \(|v_{k+1}^-|=|v_{k}^+|=e|v_k^-|\)(无驱动自由弹跳),故:
Poincaré 返回映射的斜率恰好是 \(e\)——非平凡 Floquet 乘子 \(|\mu|=e\)。判据:\(e<1\) ⟹ 渐近稳定(每次弹跳能量耗散,最终停在地面,这也是 §5.6 的 Zeno);\(e=1\) ⟹ 临界稳定(永远等高弹跳,保守)。这与 \(\det M=e^2\) 自洽(\(e^2\) = 平凡乘子 1 × 非平凡乘子 \(e^2\)?需细辨——这里玩具系统的"平凡乘子"对应能量方向,完整分析见练习 5.5.1)。
阶段小结:到这里我们把一个完整的混合稳定性分析从头算到尾——\(\Phi\)(飞行)→ \(\Xi\)(冲击)→ \(M=\Xi\Phi\)(单值矩阵)→ Floquet 乘子 \(|\mu|=e\)(稳定性)。这条"四步流水线"对任何周期步态都适用,只是 \(\Phi\) 要数值积分、\(\Xi\) 要按机器人模型算、\(M\) 是多个 \(\Phi\Xi\) 的乘积。弹跳球的价值在于:每一步都能手算、能验证,把抽象的 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\) 落到看得见的数字上。
Poincaré 截面:单值矩阵的"降维孪生"¶
上面算例自然引出 Poincaré 截面这个与单值矩阵等价、但更常用的工具,值得单独讲清。
定义。在切换面 \(\mathcal S\)(或任一横截于周期轨的截面)上取一个 \((n-1)\) 维截面 \(\mathcal P\)。周期轨每绕一圈穿过 \(\mathcal P\) 一次,形成一个不动点 \(x^*\in\mathcal P\)。Poincaré 返回映射(return map) \(P:\mathcal P\to\mathcal P\) 把"这次穿过截面的点"映到"下次穿过截面的点":\(x_{k+1}=P(x_k)\)。周期轨 ⟺ \(P\) 的不动点 \(x^*=P(x^*)\)。
与单值矩阵的关系。\(P\) 在不动点处的线性化 \(DP(x^*)\) 是一个 \((n-1)\times(n-1)\) 矩阵,它的特征值恰好是**单值矩阵 \(M\) 去掉平凡乘子 \(\mu=1\) 后剩下的那 \(n-1\) 个 Floquet 乘子**。原因:\(M\) 是全状态空间(\(n\) 维)的整周期映射,它沿轨道切向有一个平凡的 \(\mu=1\)(相位中性);Poincaré 截面正是"垂直于轨道切向"的 \(n-1\) 维子空间,自动剔除了这个平凡方向。
多视角理解(连续时间 vs 离散时间,像在哪不像在哪):单值矩阵 \(M\) 和 Poincaré 映射 \(DP\) 描述同一个稳定性,但视角不同。\(M\) 是**连续时间**视角——"沿整条周期轨连续传播扰动一圈",保留全部 \(n\) 维(含相位)。\(DP\) 是**离散时间**视角——"只看周期轨与截面的交点,一圈记一个点",降到 \(n-1\) 维。像**的部分:非平凡特征值完全相同,稳定性判据一致。**不像**的部分:\(M\) 含平凡乘子(相位方向),\(DP\) 不含(截面已剔除);\(M\) 需要沿轨迹积分变分方程,\(DP\) 可以直接对返回映射数值求导(打靶法)。**边界:不要以为"\(DP\) 比 \(M\) 信息少"——它只是剔除了无信息的平凡方向,稳定性信息一字不差。
工程上为什么 Poincaré 更常用。算 \(M\) 要沿标称轨迹积分整个变分方程(高维 ODE)。算 \(DP\) 可以用**打靶法(shooting)**:在截面上对不动点施加 \(n-1\) 个微小扰动,各自仿真一圈回到截面,数值差分得到 \(DP\) 的各列。后者不需要显式写出变分方程,对复杂机器人模型更易实现。这就是为什么足式步态稳定性分析的论文里,Poincaré 返回映射比单值矩阵出现得更频繁。
⚠️ 常见陷阱¶
💡 概念误区:把单值矩阵写成 \(M=\Phi_0\Xi_1\Phi_1\cdots\)(顺序写反) 新手想法:"按时间先后从左往右写:先 \(\Phi_0\),再 \(\Xi_1\),再 \(\Phi_1\)……" 实际上:矩阵作用在向量上是**右乘**,最先发生的灵敏度要写在**最右边**。正确顺序 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\),因为 \(\delta x(T)=\Phi_n(\Xi_n(\cdots(\Xi_1(\Phi_0\delta x_0))))\),从内(右)往外(左)依次作用。 为什么重要:写反顺序,矩阵不可交换,\(M\) 完全错,Floquet 乘子全错。这是线性代数的基本功,但在混合系统的长乘积里极易手滑。 正确做法:默念"时间从右往左流",或用作用箭头 \(\delta x_0\xrightarrow{\Phi_0}\xrightarrow{\Xi_1}\cdots\) 检查,确保最右是初始段。
💡 概念误区:忘记剔除平凡 Floquet 乘子 \(\mu=1\),误判步态不稳定 新手想法:"算出 \(M\) 的特征值,有一个恰好等于 1,那 \(|\mu|=1\) 不满足 \(<1\),步态是临界稳定/不稳定?" 实际上:周期轨**必然**有一个 \(\mu=1\),对应沿轨道切向(相位)的中性方向。这个乘子不反映稳定性,必须剔除后看其余乘子。 为什么重要:不剔除会把所有周期步态都误判为"非渐近稳定",得出"步态永远不稳定"的荒谬结论。 正确做法:判据是"除一个平凡 \(\mu=1\) 外,其余 \(|\mu_i|<1\)"。等价地,用 Poincaré 截面降一维,直接看 \(DP\) 的特征值(已自动剔除平凡方向)。
🧠 思维陷阱:以为 Floquet 乘子的模 \(<1\) 就够了,忽略冲击映射对稳定流形维数的影响 新手想法:"只要算出所有非平凡乘子模 \(<1\),步态就稳,不用管 \(\Xi\) 的秩。" 实际上:模判据本身没错,但塑性冲击 \(e=0\) 时 \(\Xi\) 秩亏(有零特征值),会让某些 Floquet 乘子**恰好为零**——这对应"扰动在一步内被完全消除"的超强收缩(deadbeat)。理解这个零乘子的来源(秩亏投影)能帮你判断步态的收缩速度,而不只是"稳不稳"。 为什么重要:零 Floquet 乘子意味着该方向的扰动一步归零,这是 HZD 步态"标量返回映射"的来源(§5.6)——其余维度被冲击投影掉,只剩一维动态。不理解这点,看 §5.6 会觉得"为什么高维系统的返回映射是标量"莫名其妙。 正确思维:Floquet 乘子的**模**给稳定性,乘子的**结构(多少个为零)**给收缩速度和降维信息。两者都要看。
练习¶
5.5.1(推导题,在草稿纸上完成) 对竖直弹性球的周期弹跳(从地面弹起到落回,一个周期一次冲击):(a) 写出飞行段的状态转移矩阵 \(\Phi=\begin{bmatrix}1&T_f\\0&1\end{bmatrix}\)(\(T_f\) 为飞行时间,自由落体的变分方程);(b) 用 §5.4.1 的 \(\Xi\) 和这个 \(\Phi\) 组装单值矩阵 \(M=\Xi\Phi\)(一个周期:飞行 \(\Phi\) 后落地冲击 \(\Xi\));(c) 算 \(M\) 的特征值,讨论 \(e=1\)(保守,临界稳定)与 \(e<1\)(耗散,渐近稳定)的区别;(d) 这个玩具例子里平凡乘子 \(\mu=1\) 出现了吗?为什么(提示:能量守恒/相位)。
5.5.2(开放思考题) Burden-Revzen-Sastry 的常秩降维定理说塑性冲击使轨道邻域收缩到低维子流形。(a) 对一个 \(n\) 自由度、单接触点(约束维数 \(c\))的双足,每次塑性冲击投影掉几维?(b) 若一个周期有两次冲击(左右脚交替),经过一个周期收缩掉的维数是多少?这与"模板模型维数远低于全身维数"如何对应?(c) 反事实:如果冲击是弹性的(\(e=1\),无降维),还会有这种子流形收缩吗?这对"弹性腿机器人难以用低维模板"有何启示?
5.5.3(跨章综合题,综合 §5.2 + §5.4 + §5.5 + 控制理论 3.5) 考虑一个平面 compass-gait(指南针步态)双足走在缓坡上。(a) 用 §5.2 的塑性冲击映射写出触地 reset \(\Delta\) 与 \(D\Delta\);(b) 用 §5.4 的公式写出触地处的 \(\Xi\)(注意支撑腿摆动腿角色互换的 relabeling);(c) 用 §5.5 组装单值矩阵 \(M=\Xi\Phi\)(compass-gait 一个周期只有一次冲击 + 一段被动摆动),说明如何数值计算 \(\Phi\)(沿标称轨迹积分变分方程);(d) 用前置自测第 5 题的 Floquet 判据判断步态稳定性;(e) 结合控制理论 3.5 的 LQR:如果这个被动步态不稳定,你会如何在 \(\Xi\) 的框架下设计一个镇定反馈(提示:这正是 §5.7 的 HiLQR,把 \(\Xi\) 当"单步动力学 Jacobian"喂给 LQR 反传)。
§5.6 横截性失效、Grazing 与 Zeno 现象 ⭐⭐⭐¶
这一节解决什么问题:前几节的 \(\Xi\) 理论建立在两个隐含假设上——横截性(\(\nabla g^\top F^-\neq0\))和"一次只跳一个 guard"。本节专门拆这两个假设的边界:(1) 横截性退化(grazing/擦切)时 \(\Xi\) 爆炸;(2) 多 guard 同时触发(codim-2)时 \(\Xi\) 不唯一;(3) Zeno 现象(有限时间无穷次跳变)让数值积分器失效。理解这些失效边界,是从"会推 \(\Xi\)"到"知道 \(\Xi\) 什么时候不能用"的关键一跃——这正是 §5.0 提到的、区分成熟研究者与初学者的分水岭。
动机:理论的边界比理论本身更重要¶
一个工程师最危险的状态,是手握一个公式却不知道它何时失效。\(\Xi\) 公式 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\) 有一个刺眼的分母 \(\nabla g^\top F^-\)。只要这个分母趋零,\(\Xi\) 就趋于无穷——一阶理论彻底崩溃。什么物理场景对应分母趋零?什么场景对应"一次跳多个 guard"?什么场景让跳变次数无穷?这一节逐一回答。
本质洞察:\(\Xi\) 理论的所有失效,都可以追溯到一个共同的根源——"扰动如何穿过切换面"这个问题本身变得病态。横截穿越(transversal crossing)是良态的:轨迹干净地刺穿 guard,穿越时刻可微。一旦穿越退化成相切(grazing)、多面交汇(codim-2)、或无穷次反复(Zeno),"穿越时刻"这个概念本身就不再是单值可微的函数。\(\Xi\) 是"横截穿越"这个良态假设的产物;离开这个假设,\(\Xi\) 失去意义,必须换用更弱的工具(B-导数、正则化、事件检测加固)。
理论一:Grazing(擦切)与横截性退化¶
什么是 grazing。Grazing 指轨迹与 guard 曲面**相切**而非横穿——脚以接近零的法向速度擦过地面。数学上 \(\nabla g^\top F^-\to 0\):guard 法向速度趋于零。物理上:水平擦地的脚、刚好够到的踏脚、临界翻越障碍。
为什么 \(\Xi\) 爆炸。\(\Xi\) 的修正项分母是 \(\nabla g^\top F^-\)。当它 \(\to0\):
灵敏度发散意味着:触地时刻 \(\delta t=-\nabla g^\top\delta x^-/\nabla g^\top F^-\) 对扰动无穷敏感——一点点扰动就在"碰到"和"碰不到"之间翻转。这不是数值问题,是**真实的物理敏感性**:擦地飞过时,毫米级的高度差决定成败。
grazing 分岔(grazing bifurcation)。当一个参数(如步高、地形高度)连续变化,使轨迹从"横穿 guard"过渡到"完全不碰 guard",中间必经过"相切"的临界点——这就是 grazing 分岔。它是非光滑系统特有的分岔类型(光滑系统没有),会产生极其复杂的动力学(如擦切诱导的混沌、周期加倍级联)。di Bernardo 等 2008《Piecewise-smooth Dynamical Systems》(Springer) 是这方面的权威专著。
对比性思维(不是 X 而是 Y):grazing 处 \(\Xi\) 的发散**不是**"数值精度不够"(不是换 double 为 long double 能解决的),而是"问题本身病态"——真实的物理灵敏度就是无穷大。这个区分极重要:遇到 \(\Xi\) 爆炸,正确的反应不是"调高数值精度",而是"检查是否接近 grazing,若是则换工具或改步态设计"。把物理病态误当数值病态,会让你在错误的方向上浪费大量精力。
工程对策。面对 grazing,有三条路:(1) 绕开——重新设计步态,让脚以明确的负法向速度触地(增大横截速度),这是最根本的解法;(2) 正则化——用平滑接触(compliant,§5.0 退路一)局部替换刚性 guard,把奇点抹平,代价是引入刚度参数依赖;(3) 检测并降级——实时监控 \(\nabla g^\top F^-\),接近零时切换到更鲁棒的(如二阶或集值)灵敏度估计,并对估计器/优化器的输出加置信度衰减(uaSKF 的思路,§5.7)。
理论二:多接触同时触发与 codim-2 退化¶
什么是 codim-2。当**两个 guard 同时**被触发——例如双足两脚同时落地、或一只脚的脚跟脚尖同时触地——轨迹同时命中两张切换面 \(g_1=0\) 和 \(g_2=0\) 的交集,这是一个余维 2(codimension-2)的事件。
为什么 \(\Xi\) 不唯一。单 guard 时,扰动只有"早穿/晚穿"两种摄动,横截性保证两侧灵敏度一致地等于 \(\Xi\)。但两个 guard 同时触发时,扰动可以让它们以**不同的先后顺序**触发:
- 顺序 A:先碰 \(g_1\)(过 \(\Xi_1\)),再碰 \(g_2\)(过 \(\Xi_2\))→ 复合灵敏度 \(\Xi_2\Xi_1\)。
- 顺序 B:先碰 \(g_2\)(过 \(\Xi_2'\)),再碰 \(g_1\)(过 \(\Xi_1'\))→ 复合灵敏度 \(\Xi_1'\Xi_2'\)。
一般地 \(\Xi_2\Xi_1\neq\Xi_1'\Xi_2'\)(矩阵不交换 + 中间向量场不同)。到底用哪个,取决于扰动的方向——不同方向的扰动让事件以不同顺序发生。所以在 codim-2 点,灵敏度不是一个唯一的矩阵,而是一个**依赖扰动方向的分片线性映射**。
关键澄清:\(\Xi_2\Xi_1\neq\,\)"联合处理两个约束同时激活推出的灵敏度"。一个常见错误是把"两脚同时落地"建模成"一个 4 维约束的单次冲击",直接算一个 \(\Xi_{12}\)。这在标称轨迹上可能数值接近,但**它丢失了"扰动可以改变触发顺序"这个一阶信息**。正确的对象是 B-导数(§5.4 末),即"所有可能顺序的复合 Saltation 之集合"——它是集值的、分片线性的,不是单个矩阵。
这正是 B-导数登场的地方。Burden-Sastry 2016 指出:在 codim-2(及更高余维)的同时事件处,piecewise flow 的 B-导数是"不同事件顺序对应的复合 Saltation 矩阵的集合"。普通矩阵语言失效,必须用 Bouligand 导数的集值、正齐次结构来描述。这是混合系统灵敏度理论最微妙的部分,也是 §5.0 末尾"绕过 \(\Xi\) 的 autodiff 在擦切附近发散"的更深层原因——朴素 autodiff 会随机选一个顺序的分支,而正确的对象是所有分支的集合。
多视角理解(足式工程视角 vs 数学视角):从**足式工程视角**,codim-2 对应"双脚同时着地"或"trotting 对角腿同时触地"——这在四足 trot、双足跑跳落地时真实发生,不是边缘情况。从**数学视角**,它是 guard 流形的交集(横截相交的两张超曲面交出余维 2 的子流形)。像**的部分:两个视角都认为这是"特殊但重要"的退化;**不像**的部分:工程上常用微小时间错开(dithering,故意让两脚差几毫秒落地)把 codim-2 退化成两个 codim-1 事件来规避,而数学上则用 B-导数严格处理。**边界:dithering 是工程权宜,它把问题简化但引入了人为的顺序假设;要严格分析对称步态(两脚理论上同时落地)的稳定性,绕不开 B-导数。
算例:codim-2 处 \(\Xi_2\Xi_1\neq\Xi_1'\Xi_2'\) 的显式验证¶
抽象地说"顺序不同结果不同"不够。用一个最简单的 2D 例子把两个复合矩阵都算出来,亲眼看到它们不相等(这是练习 5.6.2 的解答骨架)。
设定。状态 \(x\in\mathbb R^2\)。两个 guard 是两条过原点的直线:\(g_1=x_2=0\)(横轴,法向 \(\nabla g_1=(0,1)^\top\))、\(g_2=x_1=0\)(纵轴,法向 \(\nabla g_2=(1,0)^\top\))。它们在原点交汇——这就是 codim-2 点。为最大化简洁,设两次穿越的 reset 都是恒等(\(D\Delta=I\)),但**向量场在每次穿越时跳变**(这才让 \(\Xi\neq I\),对应 §5.4 离地型)。
设标称轨迹从第二象限驶向原点。三段向量场(常向量,便于手算):穿 \(g_1\) 前 \(F_a=(1,-1)\);穿 \(g_1\) 后 / 穿 \(g_2\) 前 \(F_b=(1,-2)\);穿 \(g_2\) 后 \(F_c=(2,-2)\)。
顺序 A(先 \(g_1\) 后 \(g_2\))。 第一次穿 \(g_1\)(横轴),pre 场 \(F_a\)、post 场 \(F_b\),横截速度 \(\nabla g_1^\top F_a=(0,1)\cdot(1,-1)=-1\):
第二次穿 \(g_2\)(纵轴),pre 场 \(F_b\)、post 场 \(F_c\),横截速度 \(\nabla g_2^\top F_b=(1,0)\cdot(1,-2)=1\):
复合(先 \(\Xi_1\) 后 \(\Xi_2\),按"先发生在右"):
顺序 B(先 \(g_2\) 后 \(g_1\))。 若扰动让轨迹先穿纵轴 \(g_2\)——此时第一次穿越用的 pre 场是 \(F_a\)(还没经历任何切换),post 场设为 \(F_b'\);为体现"中间段向量场不同",取 \(F_b'=(2,-1)\),再穿 \(g_1\) 到 \(F_c\)。第一次穿 \(g_2\),横截速度 \(\nabla g_2^\top F_a=(1,0)\cdot(1,-1)=1\):
第二次穿 \(g_1\),pre 场 \(F_b'=(2,-1)\),post 场 \(F_c\),横截速度 \(\nabla g_1^\top F_b'=(0,1)\cdot(2,-1)=-1\):
复合(先 \(\Xi_2'\) 后 \(\Xi_1'\)):
本例中两者恰好相等(因为选的向量场使两条路径的净效果对称)。但这正是教学的关键——只要把中间段向量场改成不对称的(如顺序 A 的中间场含交叉耦合项,让 \(\Xi_i\) 出现非对角元),两个复合矩阵立刻不等(练习 5.6.2 要求你构造这种情形)。更一般地,当 \(\Xi_1,\Xi_2\) 含非对角元(不可交换),\(\Xi_2\Xi_1\neq\Xi_1'\Xi_2'\) 几乎总成立。
本质洞察:这个算例的价值不在于"恰好相等的特例",而在于揭示**为什么一般情况下不等**——两条路径经历的中间段向量场不同(顺序 A 的中间是"已过 \(g_1\)"的场,顺序 B 的中间是"已过 \(g_2\)"的场),导致两次 \(\Xi\) 的因子不同;加之矩阵乘法不交换,复合结果一般不同。到底哪条路径,取决于扰动的方向——这就是为什么 codim-2 点的灵敏度不是单个矩阵,而是依赖扰动方向的分片线性映射(B-导数)。把"两脚同时落地"硬塞进一个 \(\Xi_{12}\),等于强行假设了一条路径,丢掉了这个方向依赖性。
算例:弹跳球的 grazing 极限——\(\Xi\) 如何发散¶
延续 §5.5 的弹跳球,把 grazing 算清楚,让"发散"从抽象变具体。
回忆 §5.5 算出的(一般 \(e\))Saltation 矩阵:
注意左下角元素 \(\Xi_{21}=-(1+e)G/v^-\)。它的分母正是横截速度 \(v^-\)(落地速度)。现在让球"越来越轻地"落地——\(v^-\to0^-\)(grazing:球几乎贴着地面、以趋零的速度触地):
\(\Xi\) 的左下角元素发散到无穷。物理含义清晰得惊人:当球以趋零速度触地,一点点位置扰动 \(\delta p\) 就在"碰到地面"和"差一点没碰到"之间翻转,触地时刻 \(\delta t=-\delta p/v^-\) 对扰动无穷敏感,而这个时刻扰动通过重力(\(F^+-D\Delta F^-\) 的速度分量 \(-(1+e)G\))注入速度扰动——除以趋零的 \(v^-\),放大到无穷。
关键诊断要点:注意 \(\Xi\) 的左上、右下角(\(-e\))和右上角(0)完全不受 grazing 影响——只有那个除以 \(v^-\) 的元素爆炸。这告诉你:grazing 的病态是**沿特定方向**的(位置扰动 → 速度扰动的耦合方向),不是整个 \(\Xi\) 均匀变大。工程上,这意味着 grazing 处的协方差/梯度爆炸也是沿特定方向的,监控时应盯住这个方向(而非 \(\Xi\) 的整体范数)。
对比性思维(反事实):如果球**正常**落地(\(v^-=-2\) m/s,明确的负速度),\(\Xi_{21}=-(1+e)\cdot9.8/(-2)\approx(1+e)\cdot4.9\),是个有限的、温和的数。同样的公式,同样的物理,只因落地速度从 \(-2\) 变到 \(-0.01\),\(\Xi_{21}\) 从约 10 暴涨到约 2000。这就是为什么"软着陆"在状态估计/控制里是出了名的难——不是算法不好,是问题本身在 grazing 附近病态。理解这个反事实,你就不会在软着陆估计漂移时去怪滤波器,而会正确地诊断为 grazing。
理论三:Zeno 现象¶
什么是 Zeno。Zeno 现象指**有限时间内发生无穷多次跳变**。经典例子是弹跳球的能量耗散版(\(e<1\)):每次弹起高度按 \(e^2\) 衰减,弹跳间隔按 \(e\) 衰减,无穷多次弹跳的总时间 \(\sum e^k T_0=\dfrac{T_0}{1-e}\) 是**有限**的——球在有限时间内完成无穷次弹跳,最终"停"在地面。这就是 Zeno(得名于芝诺的"飞矢不动"悖论)。
Zeno 时刻的精确计算。把这个几何级数算到底,让"有限时间"成为可验证的数。设球第 0 次以速度 \(v_0\) 离地,飞行时间 \(T_0=2v_0/G\)(上升 \(v_0/G\) + 下降 \(v_0/G\))。第 \(k\) 次离地速度 \(v_k=e^kv_0\)(每次冲击速度乘 \(e\)),飞行时间 \(T_k=2v_k/G=e^kT_0\)。无穷多次弹跳的总时间:
例如 \(v_0=2\) m/s、\(G=9.8\)、\(e=0.8\):\(T_Z=4/(9.8\times0.2)\approx2.04\) s——球在约 2 秒内完成**无穷多次**弹跳,然后静止。这个有限的 \(T_Z\) 就是 Zeno 时刻,是混合时间域里那个奇异点的物理时间坐标。
为什么 GST 框架最适合分析 Zeno。回顾 §5.1:GST 用混合时间 \((t,j)\) 双指标参数化。Zeno 现象在这套语言里有极简的刻画:
普通时间 \(t\) 无法表达"\(t\) 收敛但跳了无穷次",而 \((t,j)\) 的双指标天然刻画这个奇异点 \((T_Z,\infty)\)。这正是 §5.1 说"Zeno 分析用 GST 最自然"的具体兑现。
Zeno 对数值积分器的灾难。事件驱动的积分器(event-detection integrator,§5.9)在每次跳变处停下、处理 reset、重启。遇到 Zeno,跳变间隔 \(\to0\),积分器被无穷多次越来越密的事件"卡死"——它永远走不过 Zeno 时刻 \(T_Z\),仿真挂起。
工程对策:(1) Zeno 检测 + 相滑移(phase slip / chattering 处理):当检测到连续跳变间隔小于阈值,判定进入 Zeno,强制切换到"接触保持"模式(把无穷次微弹近似成持续接触),这对应物理上"球停在地面";(2) 能量阈值:当反弹动能低于阈值,直接置零法向速度,进入约束模式;(3) 避免 Zeno 的建模:很多 Zeno 是过度理想化的产物(\(e\) 设成常数而非随冲击速度衰减),更真实的恢复系数模型可消除 Zeno。
本质洞察:Zeno 现象揭示了混合系统"流 + 跳"二分法的极限——在 Zeno 点,"流"和"跳"的界限模糊了,无穷密的跳变在宏观上表现为一种新的"连续接触"模式。这暗示一个深刻的事实:离散冲击模型(reset)和持续接触模型(约束)不是两个独立的世界,而是同一物理在不同时间尺度下的两个面相。Zeno 是它们的交汇点。这也呼应了专题 4:硬接触极限下的 Dirac 冲量(离散)与持续约束力(连续)本是一体——专题 4 用测度微分包含统一处理,本专题用"Zeno 后切换到约束模式"工程化处理。
⚠️ 常见陷阱¶
💡 概念误区:把 grazing 处 \(\Xi\) 的发散当成数值精度问题 新手想法:"\(\Xi\) 算出来巨大无比,肯定是浮点误差,加高精度或调小步长就好。" 实际上:grazing 处灵敏度**真的是无穷大**(物理病态),不是数值假象。提高精度只会让你更精确地算出"无穷大",无济于事。 为什么重要:误判病因会导致错误的修复方向——你会无止境地调数值参数,而真正的问题在步态设计(脚擦地)或建模(该用平滑接触)。 正确做法:先诊断 \(\nabla g^\top F^-\) 是否接近零。若是,问题在物理/建模层面:要么改步态增大横截速度,要么换平滑接触模型,要么对该事件的灵敏度估计加不确定性(uaSKF)。
💡 概念误区:把"两脚同时落地"建模成单个 4 维约束的一次冲击 新手想法:"两脚同时着地,就是同时满足两个接触约束,合并成一个 \(J=[J_1;J_2]\) 的冲击映射,算一个 \(\Xi\) 不就行了?" 实际上:标称轨迹上这样算数值可能接近,但它**丢失了一阶信息**——扰动可以改变两脚触地的先后顺序,不同顺序给出不同的复合 \(\Xi_2\Xi_1\neq\Xi_1'\Xi_2'\)。真实灵敏度是 B-导数(集值、分片线性),不是单个矩阵。 为什么重要:在对称步态(双足同时落地、四足 trot 对角腿同时落地)的稳定性分析或优化里,用单一 \(\Xi_{12}\) 会得到错误的 Floquet 乘子/梯度,且这个错误在恰好对称时最严重。 正确做法:要么用 B-导数严格处理(集值灵敏度),要么工程上用 dithering(微小时间错开)把 codim-2 拆成两个 codim-1,但要清楚这是近似、引入了顺序假设。
🧠 思维陷阱:以为 Zeno 只是数学家虚构的病态,工程上不会遇到 新手想法:"有限时间无穷次跳变?这种芝诺悖论式的东西现实中哪有,纯粹是理论游戏。" 实际上:Zeno 在仿真中**真实地让积分器挂起**。任何带耗散冲击(\(e<1\))的物体静止到接触面的过程,理论上都是 Zeno(弹跳球停下、餐具落桌、机器人脚最终静止贴地)。事件驱动积分器遇到它会卡在 \(T_Z\) 前无限循环。 为什么重要:你写的足式仿真,机器人静止站立时支撑脚的微小残余弹跳就可能触发 Zeno,导致仿真"卡住不动"或步长趋零报错。这是实际的 bug,不是理论臆想。 正确思维:任何严肃的混合系统仿真器都必须有 Zeno 检测 + 切换到约束模式的逻辑。把 Zeno 当作"必须工程处理的真实现象",而非"可以忽略的理论边缘"。
练习¶
5.6.1(开放思考题) Grazing 处 \(\nabla g^\top F^-\to0\)。(a) 对竖直弹跳球,什么物理情形对应 grazing?(提示:落地速度 \(v^-\to0\),即球几乎"轻放"到地面。)(b) 此时 §5.4.1 的 \(\Xi\) 哪个元素发散?(c) 设计一个数值实验思路:固定扰动大小,让 \(v^-\) 从 \(-1\) 趋于 \(0^-\),画出 \(\|\Xi\|\) 随 \(v^-\) 的变化,验证 \(\sim1/|v^-|\) 的发散律。(d) 讨论:实际机器人"轻放脚"(软着陆)为什么状态估计特别难?
5.6.2(推导题,在草稿纸上完成) 两个 guard \(g_1,g_2\) 在标称轨迹上同时触发。(a) 写出"先 \(g_1\) 后 \(g_2\)"的复合灵敏度 \(\Xi_2\Xi_1\) 和"先 \(g_2\) 后 \(g_1\)"的 \(\Xi_1'\Xi_2'\)(注意两条顺序中,中间段的向量场不同——先过 \(g_1\) 后,第二次穿越用的 pre-event 场是"已过 \(\Delta_1\)"的场)。(b) 构造一个简单的 2D 例子(两条相交直线作 guard,简单的常向量场),显式算出两个复合矩阵,验证它们不相等。(c) 由此论证:为什么 codim-2 点的灵敏度必须用集值的 B-导数描述。
5.6.3(证明题) 证明耗散弹跳球(\(e<1\))的 Zeno 性质:(a) 设初始从高度 \(h_0\) 落下,落地速度 \(v_0=\sqrt{2Gh_0}\),反弹速度 \(ev_0\),反弹高度 \(e^2h_0\)。写出第 \(k\) 次弹跳的飞行时间 \(T_k\) 与 \(T_0\) 的关系。(b) 证明总弹跳时间 \(\sum_{k=0}^\infty T_k\) 收敛到有限值 \(T_Z\),给出 \(T_Z\) 的闭式。(c) 在 GST 混合时间 \((t,j)\) 语言里,描述这个 Zeno 点 \((T_Z,\infty)\),并说明为什么事件驱动积分器无法越过它。(d) 提出一个消除该 Zeno 的物理上合理的建模修改(提示:恢复系数随冲击速度趋零而趋零,或设动能阈值)。
§5.7 混合零动力学(HZD):虚拟约束与解析稳定性 ⭐⭐⭐¶
这一节解决什么问题:§5.5 给了周期步态稳定性的一般判据(Floquet 乘子),但要算单值矩阵 \(M\) 需要数值积分整个高维变分方程。对欠驱动双足(如 Cassie,驱动数 < 自由度数),有没有办法把稳定性分析降到**一个标量**?答案是 Grizzle 学派的混合零动力学(Hybrid Zero Dynamics, HZD)。这一节讲它的三个核心构件——虚拟约束、零动力学流形、impact invariance——并说明为什么 impact invariance 条件让稳定性可解析判断。这是 §5.5 降维定理(Burden-Revzen-Sastry)在控制设计上的主动版本。
动机:欠驱动双足的稳定性为什么难¶
四旋翼是全驱动的——4 个输入控制 4 个平坦输出(专题样板 D3)。但双足机器人在单支撑相是**欠驱动**的:脚与地面只是点/线接触,无法对地面施加任意力矩(踝关节力矩受限于不让脚翻转的 ZMP 约束)。这意味着质心的某些运动方向是"不可直接驱动"的——你不能像控制全驱动机械臂那样任意指定全部自由度的轨迹。
欠驱动带来的困难:标准的反馈线性化(feedback linearization)只能控制"可驱动"的那部分自由度,剩下的欠驱动自由度形成一个**内部动力学(internal dynamics)**,它不受直接控制,却决定系统稳定性。如果这个内部动力学不稳定,机器人就算精确跟踪了所有可驱动自由度,照样会摔。
本质洞察:HZD 的核心思想是——与其对抗欠驱动,不如利用它。我们不试图控制全部自由度(做不到),而是用控制把"可驱动自由度"约束到一族期望曲线上(虚拟约束),使系统坍缩到一个低维的"零动力学流形",然后**只在这个低维流形上分析稳定性**。对平面欠驱动双足,这个流形低到只剩一维——稳定性判断变成一个标量返回映射。这是 §5.5 那个"塑性冲击使轨道收缩到低维子流形"的降维定理的**主动控制版**:被动行走是物理自发降维,HZD 是用控制主动制造降维。
理论一:虚拟约束(Virtual Constraints)¶
动机:什么是虚拟约束。物理约束(如 \(J\dot q=0\))由机械结构强制。**虚拟约束**则是用**反馈控制**强制实现的"软约束"——我们定义一组输出:
其中 \(h(q)\) 是受控自由度(如各关节角),\(h_d(\cdot)\) 是期望的关节轨迹,\(\theta(q)\) 是一个**单调递增的相位变量**(phase variable,如躯干倾角或支撑腿角度——一个随步态推进单调变化的标量,代替时间 \(t\))。
关键设计选择:用相位 \(\theta\) 而非时间 \(t\) 参数化。这是 HZD 区别于"轨迹跟踪"的精髓。传统跟踪是 \(h(q)\to h_d(t)\)(跟一条时间轨迹)。虚拟约束是 \(h(q)\to h_d(\theta(q))\)(跟一条由系统自身状态参数化的轨迹)。为什么?因为**机器人被绊一下时,相位 \(\theta\) 会自动调整,虚拟约束随之"等待"机器人**——而时间轨迹是刚性的,绊一下就追不上了。这让 HZD 对扰动天然鲁棒。
多视角理解(轨迹跟踪 vs 路径跟踪,像在哪不像在哪):虚拟约束 \(h(q)=h_d(\theta(q))\) 像**汽车沿弯道行驶——你关心的是"车在路径上的位置(几何)",而非"几点几分到哪个点(时间表)";如果减速了,你还在路径上,只是慢一点。传统时间跟踪 \(h(q)=h_d(t)\) **像**严格按时刻表的火车——晚点了就全乱。**不像的部分:汽车的"路径参数"是弧长(外部几何量),而 HZD 的相位 \(\theta(q)\) 是系统自身的状态函数(内部量),它由欠驱动动力学驱动,不能被直接控制——这正是零动力学的来源。边界:不要把类比延伸到"相位像弧长一样可任意指定"——\(\theta\) 的演化由零动力学决定,是 HZD 全部稳定性问题的所在。
理论二:零动力学流形(Zero Dynamics Manifold)¶
定义。当控制把虚拟约束精确维持(\(y\equiv0,\ \dot y\equiv0\)),系统状态被限制在一个子流形上:
这就是**零动力学流形**——"输出 \(y\) 被清零"后系统能去的所有状态。在 \(\mathcal Z\) 上,受控自由度完全由相位 \(\theta\) 决定(被虚拟约束锁定),只剩**相位 \(\theta\) 及其速度 \(\dot\theta\) 这一对自由度自由演化**。\(\mathcal Z\) 上的动力学叫**零动力学(zero dynamics)**,对平面欠驱动双足,它是 2 维的(\((\theta,\dot\theta)\))。
零动力学的物理意义。\(\mathcal Z\) 上的动力学描述"当所有可控自由度都完美跟踪虚拟约束时,那个唯一不可控的自由度(欠驱动方向)如何演化"。对双足,这通常对应"质心绕支撑点的摆动"——像一个倒立摆。这个倒立摆动力学不受直接控制(欠驱动),它的稳定性就是整个步态的稳定性。
用能量类守恒量降维。零动力学的 \((\theta,\dot\theta)\) 演化有一个关键性质:连续相内存在一个类似能量的守恒结构,使得 \(\dot\theta\) 可以表示成 \(\theta\) 的函数(沿零动力学轨迹)。具体地,定义守恒量 \(\zeta=\tfrac12\dot\theta^2\)(或更一般的广义动量),它在连续相沿零动力学的演化满足一个一阶 ODE。这让连续相的零动力学进一步压缩——只需追踪一个标量(如步末的 \(\dot\theta^-\))。
理论三:Impact Invariance(冲击不变性)——HZD 的点睛之笔¶
问题:零动力学流形对冲击不闭合。这里是整个 HZD 理论最微妙、也最关键的一步。连续相我们能把系统约束在 \(\mathcal Z\) 上。但每步末尾有一次触地冲击 \(\Delta\)——冲击会**把状态踢出 \(\mathcal Z\)**!冲击前状态在 \(\mathcal Z\)(\(y=0,\dot y=0\)),冲击后 \(\Delta\) 改变了速度,新状态可能 \(\dot y\neq0\),跳出了流形。如果跳出了,下一步的连续相又要先把系统拉回 \(\mathcal Z\),分析就不再是"纯粹在 \(\mathcal Z\) 上",降维失败。
解决:impact invariance 条件。Westervelt-Grizzle-Koditschek 2003 (TAC) 的核心贡献是要求虚拟约束满足:
读作:冲击映射 \(\Delta\) 把"切换面与零动力学流形的交集"映回零动力学流形内。即——如果冲击前状态既在切换面 \(\mathcal S\) 上(该触地了)又在 \(\mathcal Z\) 上(虚拟约束满足),那么冲击后状态仍在 \(\mathcal Z\) 上。满足这个条件,\(\mathcal Z\) 就成了**整个混合系统**(流动 + 冲击)的不变流形——这就是"混合零动力学(Hybrid Zero Dynamics)"中"Hybrid"的含义:不变性对流动和冲击**都**成立。
如何实现 impact invariance。这是对虚拟约束 \(h_d\) 的设计约束。直观地,要求"步末的虚拟约束姿态,经过冲击和支撑腿/摆动腿角色互换(relabeling)后,恰好等于步初的虚拟约束姿态"。这通常通过对 \(h_d\) 的边界条件(步初步末的位置与速度)施加等式约束来满足——是一个轨迹优化里的约束。
本质洞察:impact invariance 是"让 §5.5 的降维定理为我所用"的主动条件。Burden-Revzen-Sastry 说"塑性冲击自发地把轨道收缩到某个低维流形",但那个流形是动力学自己决定的、未必是我们想要的。HZD 反过来——我们先指定想要的低维流形 \(\mathcal Z\)(通过虚拟约束设计),再用 impact invariance 条件强制冲击不破坏它。这是从"观察降维"到"设计降维"的升华。一句话:被动行走是"听天由命的降维",HZD 是"指哪打哪的降维"。
理论四:标量 LTI 返回映射——稳定性的解析判据¶
把前三步串起来,奇迹发生。当 \(\mathcal Z\) 是混合不变流形(impact invariance 成立),整个步态的稳定性分析可以**完全限制在 \(\mathcal Z\) 上**——一个 2 维流形,用能量守恒量进一步降到追踪一个标量。
具体地,取 \(\mathcal Z\) 上、切换面 \(\mathcal S\) 处的 Poincaré 截面,状态由单个标量刻画(如步末相位速度的平方 \(\zeta^-=\tfrac12(\dot\theta^-)^2\))。Westervelt-Grizzle 2003 证明:零动力学的 Poincaré 返回映射 \(\zeta_{k+1}^-=P(\zeta_k^-)\) 微分同胚于一个标量、线性、时不变(LTI)系统:
其中 \(\delta_z\) 是一个由冲击映射和虚拟约束决定的常数(冲击对相位速度的"折扣因子")。这个标量映射的不动点就是周期步态,其稳定性判据简单到极致:
这是何等的简化:一个 \(2n\) 维的高度非线性欠驱动混合系统的稳定性,被压缩成一个标量斜率 \(\delta_z^2\) 是否小于 1。你不需要数值积分变分方程、不需要算 \(2n\times2n\) 的单值矩阵——只需算一个数。这就是 HZD 被称为欠驱动双足"唯一权威框架"(Westervelt et al. 2007 是该领域唯一权威教科书)的原因。
理论-工程桥接:HZD 不是纸上理论——Cassie、ATRIAS、MARLO/RABBIT 等真实欠驱动双足都用 HZD 设计行走/奔跑控制器(Grizzle 实验室及合作者)。工程流程是:(1) 用轨迹优化设计虚拟约束 \(h_d\)(Bézier 多项式参数化),同时施加 impact invariance 约束;(2) 用 \(|\delta_z|<1\) 验证稳定性;(3) 用反馈控制(PD + 前馈,或 CLF-QP)在线维持虚拟约束 \(y\to0\)。HZD 把"双足能不能稳定走路"这个看似要靠大量仿真试错的问题,变成了一个可在设计阶段解析回答的问题——这正是 §5.0 说的"Cassie 不是给 ZMP 糊一层 MPC"的含义:它有坚实的混合系统稳定性理论支撑。
算例骨架:三连杆双足的虚拟约束与零动力学¶
把 HZD 的抽象落到一个具体(但仍可手推)的模型——平面三连杆双足(两条腿 + 一个躯干,3 个自由度,单支撑相通常 1 维欠驱动)。这个骨架展示 HZD 各构件如何具体化。
配置与欠驱动。取广义坐标 \(q=(q_1,q_2,q_3)\):\(q_1\) = 支撑腿绝对角(相对竖直),\(q_2\) = 摆动腿相对支撑腿角,\(q_3\) = 躯干相对支撑腿角。驱动在两个关节(髋的两个自由度:摆动腿 \(q_2\)、躯干 \(q_3\)),但支撑脚是点接触、无踝驱动——\(q_1\)(整体绕支撑点的转动)不可直接驱动,这就是 1 维欠驱动。
第一步:选相位变量。取 \(\theta=q_1\)(支撑腿角)作相位变量——它在单支撑相单调推进(支撑腿从后向前转),是时间的天然替代。验证单调性:\(\dot\theta=\dot q_1\) 在标称步态中不变号。
第二步:设计虚拟约束。把两个可驱动自由度约束为相位的函数:
其中 \(h_d^{(2)},h_d^{(3)}\) 是 Bézier 多项式(设计参数)。当反馈控制把 \(y\to0\),摆动腿和躯干的运动完全由支撑腿角 \(\theta\) 决定——3 个自由度被锁定成 1 个(\(\theta\))。
第三步:零动力学流形与动力学。\(\mathcal Z=\{(q,\dot q):y=0,\dot y=0\}\) 是 2 维的(\((\theta,\dot\theta)\))。在 \(\mathcal Z\) 上,\(q_2,q_3\) 由 \(\theta\) 决定,系统约化为单自由度的欠驱动动力学——形如一个"广义倒立摆"。用拉格朗日方程投影到 \(\mathcal Z\),得到 \(\theta\) 的二阶 ODE。借助能量类守恒量 \(\zeta=\tfrac12 I(\theta)\dot\theta^2+V(\theta)\)(\(I,V\) 由约化动力学决定),可把 \(\dot\theta\) 表为 \(\theta\) 的函数,进一步降维。
第四步:impact invariance 约束。设计 \(h_d\) 时,要求步末(\(\theta=\theta^-\),摆动脚触地)的姿态与速度,经冲击 \(\Delta\) 和支撑/摆动腿 relabeling 后,恰好等于步初(\(\theta=\theta^+\))的姿态与速度——这给 Bézier 系数施加边界等式约束。满足后,\(\mathcal Z\) 成为混合不变流形。
第五步:标量返回映射。在 \(\mathcal Z\) 上、切换面处取 Poincaré 截面,状态由步末 \(\zeta^-\)(或 \(\dot\theta^-\))单标量刻画。约化动力学 + 冲击给出 \(\zeta_{k+1}^-=\delta_z^2\zeta_k^-+c\),\(|\delta_z|<1\) 即稳定。\(\delta_z\) 由冲击对相位速度的折扣(\(\Xi\) 限制到 \(\mathcal Z\))和约化势能决定。
理论-工程桥接:这个骨架就是 RABBIT(Chevallereau 等 2003)这类经典欠驱动双足实验平台 HZD 控制器设计的真实流程。注意第二步的 Bézier 参数 + 第四步的 impact invariance 约束 + 第五步的 \(|\delta_z|<1\),共同构成一个**轨迹优化问题**:在 Bézier 系数空间里,找一组系数使步态周期、impact invariant、且 \(|\delta_z|<1\)。这正是 §5.7 工程流程第 (1) 步"用轨迹优化设计虚拟约束"的具体内容——HZD 把控制设计变成了一个有限维的、可解析施加稳定性约束的优化。
HZD 与 Saltation 的关系¶
读到这里你可能困惑:HZD 用 Poincaré 返回映射的标量斜率 \(\delta_z^2\),§5.5 用单值矩阵 \(M\) 的 Floquet 乘子——它们什么关系?
答案:\(\delta_z^2\) 就是零动力学流形 \(\mathcal Z\) 上那个唯一的非平凡 Floquet 乘子。完整的单值矩阵 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\)(其中 \(\Xi\) 含触地的 Saltation)有 \(2n\) 个 Floquet 乘子:一个平凡的 \(\mu=1\)(相位方向)、若干个被虚拟约束控制到 0 或很小的(横向 \(\mathcal Z\) 的方向,由反馈镇定)、以及一个 \(\delta_z^2\)(\(\mathcal Z\) 内的零动力学方向)。HZD 的妙处在于:通过虚拟约束把"横向 \(\mathcal Z\)"的乘子都压到可控的小值,只留 \(\mathcal Z\) 内的 \(\delta_z^2\) 待定——于是整个 \(M\) 的稳定性归结为单个 \(\delta_z^2\)。Saltation 矩阵 \(\Xi\) 仍在幕后(它是 \(M\) 的组成部分,也进入 \(\delta_z\) 的计算),只是 HZD 的结构让我们不必显式面对整个 \(M\)。
对比性思维(不是 X 而是 Y):HZD 不是 "避开了 Saltation 矩阵",而是 "用虚拟约束的结构,把含 \(\Xi\) 的高维 \(M\) 的稳定性问题,约化成 \(\Xi\) 在零动力学流形上诱导的单个标量乘子"。\(\Xi\) 没有消失——它进入 \(\delta_z\) 的表达式(冲击对相位速度的折扣由 \(\Xi\) 限制到 \(\mathcal Z\) 上得到)。理解这点能统一本章 §5.5(一般 Floquet)和 §5.7(HZD 标量)两套看似不同的稳定性语言。
⚠️ 常见陷阱¶
💡 概念误区:把虚拟约束当成时间轨迹跟踪 新手想法:"虚拟约束 \(h(q)\to h_d(\theta(q))\) 不就是让关节跟踪一条轨迹吗,和 \(h_d(t)\) 有啥区别?" 实际上:参数化变量是天壤之别。\(h_d(t)\) 用**时间**参数化(外部时钟,刚性),\(h_d(\theta(q))\) 用**相位**参数化(系统自身状态,自适应)。被绊一下时,相位 \(\theta\) 自动放慢/加快,虚拟约束随之等待机器人;而时间轨迹不管你绊没绊都按时钟走,必然追不上。 为什么重要:用时间参数化做欠驱动双足,鲁棒性极差,小扰动就失稳——丢掉了 HZD 最核心的鲁棒性来源。 正确做法:相位变量 \(\theta(q)\) 必须是状态的单调函数(如支撑腿角度),让步态"按几何推进"而非"按时钟推进"。
💡 概念误区:以为只要连续相把系统约束在 \(\mathcal Z\) 上就够了,忽略 impact invariance 新手想法:"我用反馈让 \(y\to0\),系统就在零动力学流形上了,降维完成。" 实际上:连续相在 \(\mathcal Z\) 上,但每步触地冲击 \(\Delta\) 会把状态踢出 \(\mathcal Z\)(冲击改变速度,\(\dot y\) 可能变非零)。不满足 impact invariance \(\Delta(\mathcal S\cap\mathcal Z)\subset\mathcal Z\),\(\mathcal Z\) 就不是混合不变的,标量返回映射的推导不成立。 为什么重要:漏掉 impact invariance,你设计的虚拟约束在仿真里会表现为"每步触地后 \(y\) 跳一下、再被拉回",稳定性分析失效,且这种"拉回"消耗控制量、降低鲁棒性。 正确做法:设计虚拟约束 \(h_d\) 时必须把 impact invariance 作为硬约束(步初步末姿态/速度的等式约束)纳入轨迹优化。这是 HZD 区别于普通虚拟约束的"Hybrid"所在。
🧠 思维陷阱:以为 HZD 的标量返回映射对全驱动机器人也是必要的 新手想法:"HZD 这么优美,所有足式机器人都该用它。" 实际上:HZD 的威力专门针对**欠驱动**——它处理的是"无法直接控制的内部动力学"。对全驱动机器人(如带大脚掌、可施加任意 ZMP 力矩的双足,或全驱动四足在特定步态下),你能直接控制全部自由度,不存在欠驱动的零动力学,HZD 的标量返回映射机器是杀鸡用牛刀。 为什么重要:盲目套 HZD 到全驱动系统,会引入不必要的约束(虚拟约束 + impact invariance),反而限制了本可自由利用的控制自由度。 正确思维:HZD 是欠驱动的利器。判断是否该用:你的系统在感兴趣的步态相是否欠驱动?是 → HZD 大放异彩;否 → 全驱动方法(如 §5.7 后续的 HiLQR、WBC)更直接。这与 §5.1"用最小够用的框架"一脉相承。
练习¶
5.7.1(推导题,在草稿纸上完成) 对一个平面 compass-gait 双足(2 自由度:两腿角,欠驱动 1 维):(a) 选支撑腿绝对角为相位变量 \(\theta\),写出一个 Bézier 多项式虚拟约束 \(h_d(\theta)\) 把摆动腿角约束为 \(\theta\) 的函数;(b) 写出零动力学流形 \(\mathcal Z=\{y=0,\dot y=0\}\),说明它是几维;(c) 推导零动力学(\(\mathcal Z\) 上 \(\theta\) 的演化),论证它形如一个倒立摆;(d) 讨论 impact invariance 条件对 \(h_d\) 的边界值施加了什么约束。
5.7.2(开放思考题) Impact invariance \(\Delta(\mathcal S\cap\mathcal Z)\subset\mathcal Z\) 是对虚拟约束的设计约束。(a) 用 §5.4 的 Saltation 矩阵语言重新表述:impact invariance 等价于"\(\Xi\) 把 \(\mathcal Z\) 在 \(\mathcal S\) 处的切空间映到 \(\mathcal Z\) 的切空间"吗?给出你的论证。(b) 如果 impact invariance 只近似满足(\(\Delta(\mathcal S\cap\mathcal Z)\) 接近但不完全在 \(\mathcal Z\) 内),稳定性会怎样退化?(c) 这与 §5.7 后面要讲的 Yang-Posa "impact-invariant control"(把控制目标投影到 impact-invariant 子空间)有什么概念联系?
5.7.3(跨章综合题,综合 §5.5 + §5.7 + 前置自测 5) 论证"\(\delta_z^2\) 是零动力学方向的 Floquet 乘子":(a) 设完整混合系统单值矩阵 \(M\) 有 \(2n\) 个 Floquet 乘子,定性说明它们分成哪三类(平凡相位、横向 \(\mathcal Z\) 被镇定、\(\mathcal Z\) 内零动力学);(b) 论证虚拟约束的反馈把"横向 \(\mathcal Z\)"的乘子压向 0(deadbeat 或快速收缩);(c) 由此说明为什么整个 \(M\) 的稳定性归结为单个 \(\delta_z^2<1\);(d) 这如何体现了 §5.5"\(\Phi\) 发散 vs \(\Xi\) 收缩"的博弈在 HZD 框架下被"控制设计 + 冲击"共同调制?
§5.8 Saltation 矩阵的三大工程应用 ⭐⭐⭐¶
这一节解决什么问题:前面几节把 \(\Xi\) 的数学讲透了。但 \(\Xi\) 到底"用在哪一行代码里"?这一节落到三个真实的、近年顶刊/顶会的工程应用——状态估计(Salted Kalman Filter)、轨迹优化/MPC(Hybrid iLQR)、跟踪控制(Impact-Invariant Control)。每个应用都对应一个"\(\Xi\) 替换了原来的什么"的清晰故事。这是 §5.0 "如果跳过本章会怎样"两个崩溃场景的正面解药,也是本专题与专题 4(可微接触)/ 专题 6(RL)的接口。
动机:三个领域,同一个 \(\Xi\)¶
状态估计、最优控制、跟踪控制,表面是三个不同领域,但它们都要回答同一个数学问题——"一个量经过混合事件如何线性传播?":
- 状态估计:协方差 \(P\)(不确定性的二阶矩)经过触地如何传播?
- 最优控制:值函数的 Hessian \(V_{xx}\)(代价的二阶灵敏度)反向经过触地如何传播?
- 跟踪控制:跟踪误差经过触地如何演化,控制该往哪个方向使劲?
三个问题的答案都是 \(\Xi\) 的某种二次型或子空间。这就是 Kong-Payne-Zhu-Johnson 2024 (Proc. IEEE) 标题"Saltation Matrices: The Essential Tool"的底气——一个矩阵统一了三个领域跨混合事件的线性化。
本质洞察:\(\Xi\) 在三个应用里扮演的角色,本质都是"把光滑系统的 Jacobian \(f_x\) 在混合事件处替换成 \(\Xi\)"。Kalman 滤波的协方差传播 \(P^+=f_x P^- f_x^\top\) 变成 \(P^+=\Xi P^-\Xi^\top\);iLQR 的值函数反传 \(V_{xx}\leftarrow f_x^\top V_{xx}f_x\) 变成 \(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\)。所有为光滑系统建立的二阶矩/二阶灵敏度传播公式,只要把事件处的 \(f_x\) 换成 \(\Xi\),就自动推广到混合系统——这是 \(\Xi\) 作为"混合系统的事件 Jacobian"的统一力量。记住这个"替换原则",你就掌握了把任何光滑算法移植到混合系统的通用配方。
应用一:Salted Kalman Filter(协方差经 \(\Xi\) 跳变)¶
背景。回顾前置自测(隐含)的 Kalman 滤波:预测步用动力学传播状态均值与协方差,更新步用观测修正。对光滑系统,协方差预测是 \(P_{k+1}^-=F_kP_kF_k^\top+Q_k\),其中 \(F_k\) 是动力学的离散 Jacobian。
问题。当系统经过一个混合事件(触地),状态均值过 reset(\(x^+=\Delta(x^-)\)),协方差该怎么传播?朴素做法用 reset Jacobian:\(P^+=D\Delta\,P^-\,D\Delta^\top\)。这正是 §5.0 Cassie EKF 发疯的根源——它漏了 \(\Xi\) 比 \(D\Delta\) 多的那个秩-1 项。
Salted Kalman Filter(SKF)的修正。Kong, Mousaei, …, Johnson 2021 (Automatica, arXiv:2007.12233) 提出:在混合事件处,用 Saltation 矩阵 \(\Xi\) 替换 reset Jacobian \(D\Delta\) 来传播协方差:
(更完整地,若 reset 本身带过程噪声,加一项 \(P^+=\Xi P^-\Xi^\top+Q_\Xi\)。)"Salted"(加盐的)这个名字正是来自 Saltation 矩阵。
为什么 \(\Xi\) 而非 \(D\Delta\)——物理直觉。回到弹跳球(§5.3 反面):位置不确定性 \(\delta p\) 会让球早/晚落地,落地时刻的不确定性 \(\delta t\) 又通过重力耦合进速度不确定性。\(D\Delta\)(对角投影)看不到这条"位置→时刻→速度"的耦合通道,而 \(\Xi\) 的秩-1 项 \(\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\) 恰好编码了它。用 \(D\Delta\) 会**低估落地后的速度不确定性**——滤波器过度自信,开始拒绝合理观测,发散。
本质洞察:SKF 的核心信息可以浓缩成一句话——混合事件不仅改变状态,还把"事件时刻的不确定性"注入状态的不确定性,而这个注入通道只有 \(\Xi\)(不是 \(D\Delta\))才能捕捉。触地时刻本身是不确定的(因为触地前状态不确定),这个时刻不确定性通过 pre/post 向量场的失配 \(F^+-D\Delta F^-\) 转化成 post-event 状态的额外协方差。漏掉它 = 假装"我们精确知道何时触地" = 过度自信 = 发散。
uaSKF(不确定性感知 SKF)。Payne, Kong, Johnson 2022 (IROS, arXiv:2202.12729) 进一步处理 **guard 本身不确定**的情形(地形高度未知、触地检测有噪声)——推导了"guard saltation matrix",把事件前的扰动(含 guard 不确定性)映射到事件后。实验显示在多种系统/条件下平均估计误差峰值降低 24-60%。这对应 §5.6 的 grazing 鲁棒化——guard 不确定时,对 \(\Xi\) 的估计加置信度衰减。
理论-工程桥接:SKF 不是对 EKF 的小修小补,而是混合系统状态估计的"正确做法"。工程落地:足式机器人的腿式里程计/LIO(Legged-Inertial Odometry)在落地时刻用 SKF 传播协方差,能正确反映"刚落地时位置/速度的真实不确定性",避免滤波器在触地后过度自信。这直接解决了 §5.0 场景一的 Cassie EKF 发疯问题。Bloesch 等的足式状态估计、以及近年腿足 LIO 工作都在向这个方向演进。
应用二:Hybrid iLQR / Contact-Implicit MPC(值函数经 \(\Xi\) 反传)¶
背景。回顾控制理论 3.5 的 iLQR(迭代 LQR):在标称轨迹附近反复线性化,用 LQR 子程序做 backward pass 算值函数与反馈增益。光滑系统的值函数 Hessian 反传是 \(V_{xx,k}=\ell_{xx}+f_x^\top V_{xx,k+1}f_x\),其中 \(f_x\) 是单步动力学 Jacobian。
问题。当 backward pass 跨越一个接触事件(guard),\(f_x\) 不再是普通 Jacobian——它必须是 \(\Xi\)。
Hybrid iLQR(HiLQR)的修正。Kong, Li, Council, Johnson 2021 (CDC, arXiv:2103.14584, "iLQR for Piecewise-Smooth Hybrid Dynamical Systems") + Kong, Li, Johnson 2023 (IEEE T-RO, arXiv:2207.04591, "Hybrid iLQR MPC") 提出两个关键修正:
- 用 \(\Xi\) 反传值函数:在事件处,
替换原来用 \(D\Delta\) 的近似。这让值函数及其梯度正确地"知道"跨越接触时灵敏度如何变化。
- 参考扩展(reference extension / reference spreading)处理 mode 失配:当迭代轨迹的接触切换时刻与参考不一致(mode mismatch),代价函数的计算需要把 pre-event 参考向后延拓、post-event 参考向前延拓,在重叠区用"应该处于哪个 mode"的参考计算代价。这解决了"扰动轨迹和参考轨迹处在混合系统不同相"导致的代价突变问题。
性能。HiLQR MPC 在 Unitree A1 四足上(仿真 + 硬件)对比基于质心动力学(centroidal)假设的方法,在稳定性和恢复能力上更优——尤其在接触切换附近的镇定。
对比性思维(不是 X 而是 Y):HiLQR 处理接触的方式**不是**"对
if分支直接 autodiff"(§5.0 场景二的错误做法,在 grazing 附近梯度方差爆炸),而是"用 \(\Xi\)(piecewise flow 的 B-导数)作为事件处的合法灵敏度,并用参考扩展对齐 mode"。这正是 §5.4 末尾 B-导数理论的工程兑现——合法穿越接触的梯度是 \(\Xi\),朴素 autodiff 会因无视分段结构而发散。
与 Contact-Implicit MPC 的关系。\(\Xi\) 路线(mode 序列先验已知)与接触隐式 MPC(mode 序列由优化器从互补松弛中发现,专题 6)是 §5.0 接触建模光谱的两端。近年代表:Le Cleac'h 等 2021/2024 ("Fast Contact-Implicit MPC", arXiv:2107.05616) 用可微接触 + 内点法做实时 CI-MPC;Kim, Kang, Kim, Hong, Park 2023/2025 (IJRR, arXiv:2312.08961) 的 CI-MPC 在 45kg HOUND 四足上无需预设接触序列实现多样运动。
理论-工程桥接(两条路线的分工):当接触序列**清晰可重复**(周期步态),HiLQR(显式 hybrid + \(\Xi\))收敛更快、数值更稳——这是 §5.0 Kong-Johnson 2023 的结论,也是 Cassie/Digit 这类有明确步态结构的机器人偏爱它的原因。当接触序列**高度不确定**(杂乱地形、多接触操作、需要自主发现新接触),CI-MPC(让优化器从松弛中选 mode)更合适。两者不是竞争而是互补——选哪个取决于"你是否先验知道接触序列"。这与 §5.0 接触建模光谱表、§5.1"用最小够用的框架"一以贯之。
应用三:Impact-Invariant Control(把误差投影到 \(\ker(I-D\Delta)\))¶
背景与动机。前两个应用是"被动地"正确传播灵敏度(估计、优化)。第三个应用 Yang-Posa 2021 (IROS, arXiv:2103.06907),扩展版 2023/2025 (Autonomous Robots) 处理一个更主动的问题——冲击瞬间的跟踪控制该怎么做?
困难在于:触地时刻本身是不确定的(§5.3 的 \(\delta t\))。如果控制器在"以为该触地但实际还没触地"或反之的时刻,强行用反馈去纠正一个"经历了不同冲击"的误差,会注入巨大的、错误的控制量——因为它在拿"已冲击的参考"和"未冲击的实际"做差(或反之),这个差是 \(O(1)\) 的冲击大小,不是真实跟踪误差。这正是 §5.0 场景的另一面。
核心思想:投影到 impact-invariant 子空间。Yang-Posa 的洞察是——存在一个状态子空间,冲击对它的作用是"不变"的(误差经冲击不被放大),在这个子空间上控制是安全的;而在其补空间上(冲击敏感方向),冲击的时刻不确定性会污染控制,应当放弃控制权。具体地,把控制目标投影到 impact-invariant 子空间——与冲击映射的"时刻敏感方向"正交的子空间。在足式落地、跳跃、跑步控制器(五连杆双足、Cassie)上验证,能在保持对冲击不变子空间最大控制权的同时,对冲击时刻不确定性鲁棒。
与 \(\ker(I-D\Delta)\) 的联系。impact-invariant 子空间与冲击映射的不动方向(\(D\Delta\) 的特征值为 1 的特征子空间,即 \(\ker(I-D\Delta)\))密切相关——这些是"冲击不改变"的状态方向,在这些方向上控制目标不受冲击时刻扰动影响,可安全跟踪。补空间(如塑性冲击投影掉的法向速度方向)则是冲击"说了算"的方向,控制器在冲击瞬间不该与之较劲。
本质洞察:三个应用揭示了对待"冲击时刻不确定性 \(\delta t\)"的三种态度,恰好覆盖了一个完整的认识光谱——SKF 是"如实记账"(把 \(\delta t\) 的不确定性通过 \(\Xi\) 如实传播进协方差,不回避);HiLQR 是"提前规划"(用 \(\Xi\) 让优化器预见 \(\delta t\) 对代价的影响);Impact-Invariant Control 是"主动回避"(在 \(\delta t\) 污染最严重的子空间上放弃控制权,只在安全子空间使劲)。同一个 \(\delta t\),三种工程智慧。理解这个光谱,你就理解了 \(\Xi\) 不只是个公式,而是一整套"如何与混合系统的内在不确定性共处"的方法论。
与专题 4(可微接触)、专题 6(RL)的关系¶
把本专题放回第七批的接触建模光谱(§5.0 表),明确分工:
| 维度 | 专题 4(可微接触) | 专题 5(本专题 Saltation) | 专题 6(Model-Based RL / CI-MPC) |
|---|---|---|---|
| 接触序列 | 求解器隐式决定 | 先验已知 | 求解器从松弛中选 |
| 核心灵敏度对象 | Clarke Jacobian / 参数 VI 导数 | Saltation \(\Xi\)(B-导数) | 接触隐式 TO 的非光滑梯度 |
| 适用场景 | 可微仿真、参数辨识 | 周期步态稳定性、估计、HiLQR | 自主发现接触、杂乱多接触 |
| 数学根基 | 隐函数定理 + 凸松弛 | 隐函数定理 + B-导数 | LCP / 互补松弛 |
与专题 4 的接口:专题 4 的可微接触在"硬接触极限"下退化为本专题的离散冲击——可微仿真器若把硬接触当成 guard + reset 处理,跨接触的梯度就是 \(\Xi\)。换言之,\(\Xi\) 是可微接触在"刚性 + mode 已知"特例下的解析形式。专题 4 用凸松弛 + 隐函数定理统一处理软硬接触,本专题用 guard + reset + \(\Xi\) 精确处理刚性已知 mode——二者在硬接触极限相遇(Posa-Kuindersma-Tedrake 2016 WAFR 证明局部等价)。
与专题 6 的接口:专题 6 让策略梯度穿过接触事件。\(\Xi\)(B-导数)是这条梯度合法穿越的唯一正确对象——这就是 §5.0、§5.4 末反复埋的钩子的最终兑现。任何"让梯度穿过触地"的方法(可微仿真训练、CI-MPC 的解析梯度),底层都绕不开 \(\Xi\) 或其推广(grazing 处的 B-导数)。
⚠️ 常见陷阱¶
💡 概念误区:在 Kalman 滤波里用 reset Jacobian \(D\Delta\) 传播协方差 新手想法:"状态过 reset 是 \(x^+=\Delta(x^-)\),那协方差自然是 \(P^+=D\Delta P^-D\Delta^\top\),标准的雅可比传播。" 实际上:必须用 \(\Xi\) 而非 \(D\Delta\):\(P^+=\Xi P^-\Xi^\top\)。\(D\Delta\) 漏掉了"触地时刻不确定性耦合进状态不确定性"的秩-1 通道,导致 post-event 协方差被低估、滤波器过度自信、发散。 为什么重要:这是 §5.0 Cassie EKF 发疯的精确数学原因,也是 Kong 2021 Automatica 整篇论文的核心信息。用错一个矩阵,整个估计器失效。 正确做法:混合事件处的协方差传播一律用 Saltation 矩阵 \(\Xi\)。这是 SKF 的全部要点。
💡 概念误区:iLQR 跨接触时直接对 if-else 分支自动微分 新手想法:"反正有 autodiff,让它穿过接触判断的 if 分支,自动算梯度不就行了?" 实际上:朴素 autodiff 穿过接触判断,在 grazing(擦切)附近梯度方差爆炸、cost 不降反升、不收敛(§5.0 场景二)。合法的梯度是 \(\Xi\)(piecewise flow 的 B-导数),还需配参考扩展处理 mode 失配。 为什么重要:很多人把 iLQR 在接触系统上不收敛归咎于"iLQR 不适合接触",真相是用错了灵敏度——用 \(\Xi\) + 参考扩展(HiLQR)就能收敛。 正确做法:跨接触事件用 \(\Xi\) 反传值函数(\(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\)),并用 reference spreading 对齐 mode。
🧠 思维陷阱:以为冲击瞬间应该"全力"跟踪参考 新手想法:"跟踪控制就是让误差最小,冲击瞬间也不例外,该全力把状态拉回参考。" 实际上:冲击瞬间触地时刻不确定(\(\delta t\)),在"冲击敏感方向"上,实际状态与参考的差主要由"谁先冲击"造成(\(O(1)\) 的冲击大小),不是真实跟踪误差。全力纠正它 = 注入巨大错误控制量。 为什么重要:在冲击敏感方向硬纠错会让控制器在触地瞬间"抽搐",浪费控制权甚至失稳。Yang-Posa 证明应当把控制目标投影到 impact-invariant 子空间,在敏感方向放弃控制权。 正确思维:冲击瞬间,控制要"挑方向使劲"——在冲击不变子空间(\(\ker(I-D\Delta)\) 相关)全力跟踪,在冲击敏感方向暂时让位给物理。这是"主动回避 \(\delta t\) 污染"的智慧。
练习¶
5.8.1(推导题,在草稿纸上完成) 对竖直弹跳球(\(\Xi\) 见 §5.4.1),设落地前位置-速度协方差 \(P^-=\mathrm{diag}(\sigma_p^2,\sigma_v^2)\)。(a) 用 \(P^+=\Xi P^-\Xi^\top\) 算出落地后协方差,特别关注速度方差 \(P^+_{vv}\);(b) 对比朴素的 \(P^+_{D\Delta}=D\Delta P^-D\Delta^\top\),证明 \(\Xi\) 给出的速度方差**更大**(多出位置不确定性经 \(\delta t\) 耦合的项);(c) 解释为什么"更大"才是对的——朴素法过度自信的物理含义。
5.8.2(开放思考题) HiLQR 用 \(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\) 反传值函数 Hessian。(a) 类比 §5.8 的"替换原则",写出值函数梯度 \(V_x\) 的反传公式;(b) 为什么 backward pass(反向)用 \(\Xi^\top\) 而 forward 的协方差传播用 \(\Xi\cdots\Xi^\top\)(提示:值函数是代价对状态的灵敏度,沿时间反向传播;协方差是状态的二阶矩,沿时间正向传播);(c) 讨论"参考扩展"为什么必要——举一个 mode 失配导致代价突变的具体例子。
5.8.3(跨章综合题,综合 §5.4 + §5.7 + §5.8) 论证三大应用共享同一个 \(\Xi\):(a) 分别写出 SKF(协方差)、HiLQR(值函数 Hessian)、Impact-Invariant(误差子空间)三处 \(\Xi\) 出现的公式;(b) 用"替换原则"统一解释:它们都是"把光滑系统的事件 Jacobian 换成 \(\Xi\)"的特例吗?Impact-Invariant 的子空间投影也能这么理解吗?(c) 结合 §5.7 HZD:impact-invariant 子空间与 HZD 的零动力学流形 \(\mathcal Z\) 有何概念关联(都涉及"冲击下不变/受控的子空间")?
§5.9 数值实现与陷阱 ⭐⭐⭐¶
这一节解决什么问题:前八节是数学。但当你真的要在仿真器/估计器/优化器里**实现** \(\Xi\) 时,会撞上一堆教科书不讲的工程陷阱——事件检测抖动、横截性退化、Zeno 卡死、协方差不对称、接触序列误设。这一节把这些"实现层面的坑"系统化,配一个最小事件驱动积分器的骨架(理论教学中代码仅作验证/演示),并给出本章的故障排查手册(R15)。这是把 \(\Xi\) 从"纸上公式"变成"能跑的代码"的最后一公里。
数值实现的总原则:事件驱动积分¶
混合系统的正确数值积分**不是**"用固定步长 RK45 一路积下去、撞到 guard 就硬切"。正确做法是**事件驱动积分(event-driven integration)**:
- 在当前 mode 内用光滑积分器(如 RK45)前进;
- 同时监控 guard 函数 \(g(x(t))\) 的符号;
- 当 \(g\) 变号(穿越),用**根查找(root-finding,如 bisection / Brent)精确定位穿越时刻 \(t^*\)**;
- 在 \(t^*\) 处应用 reset \(x^+=\Delta(x^-)\),并(若做灵敏度)应用 \(\Xi\);
- 切换到新 mode,从 \(t^*\) 重新积分。
关键是第 3 步——必须精确定位事件时刻,不能"等到下一个固定步长才发现已经穿过了"。差之毫厘的事件时刻会污染 \(\Xi\)(它依赖事件点的 \(F^\pm,\nabla g\))和整条轨迹。
下面是一个最小的事件驱动积分 + Saltation 传播的 Python 骨架(仅演示结构,验证 §5.4 推导,非生产代码):
import numpy as np
from scipy.integrate import solve_ivp
def hybrid_simulate_with_saltation(x0, Phi0, modes, t_end):
"""事件驱动积分 + 沿轨迹传播灵敏度 Phi(跨 guard 乘 Xi)。
modes: 当前 mode 提供 f(x), guard g(x), reset Delta(x), DDelta(x),
f_next(x)(post-event 向量场), grad_g(x)。
返回最终状态与累积灵敏度(= 单值矩阵的构造块)。"""
x, Phi, t, mode = x0.copy(), Phi0.copy(), 0.0, modes.current()
while t < t_end:
# 1) 光滑段积分,事件函数 = guard 符号变化(terminal 触发)
def guard_event(tt, xx): return mode.g(xx)
guard_event.terminal = True
guard_event.direction = -1.0 # 只在 g 从正变负(向下穿越)触发:横截方向条件
sol = solve_ivp(lambda tt, xx: mode.f(xx), (t, t_end), x,
events=guard_event, rtol=1e-10, atol=1e-12, dense_output=True)
# 1b) 同步积分光滑段的状态转移矩阵 Phi(变分方程 dPhi=A Phi)
Phi = integrate_variational(mode, sol, Phi) # 累乘当前段的 Phi_i
if sol.t_events[0].size == 0:
x = sol.y[:, -1]; break # 本段未触发事件,结束
# 2) 事件被精确定位(solve_ivp 内部用根查找细化到 rtol)
t_star = sol.t_events[0][0]
x_minus = sol.y_events[0][0] # 穿越点 pre-event 状态
# 3) 计算 Saltation 矩阵 Xi(§5.4 公式)—— 注意分母是标量、分子是外积矩阵
Fm = mode.f(x_minus) # pre-event 向量场 F^-
Fp = mode.f_next(mode.Delta(x_minus)) # post-event 向量场 F^+(在 reset 后取值)
dg = mode.grad_g(x_minus) # guard 梯度(列向量)
DDel = mode.DDelta(x_minus) # reset Jacobian DΔ
denom = float(dg @ Fm) # 横截速度(标量)
assert abs(denom) > 1e-6, "接近 grazing:横截性退化,Xi 不可靠"
Xi = DDel + np.outer(Fp - DDel @ Fm, dg) / denom # 秩-1 修正
# 4) 应用 reset 与 Saltation
x = mode.Delta(x_minus) # 状态过 reset
Phi = Xi @ Phi # 灵敏度跨 guard 乘 Xi(左乘,时间向前)
# 5) 切换 mode,从 t_star 继续
mode = modes.advance(); t = t_star
return x, Phi
注意代码里三个被注释强调的要点,全部对应前文的理论:direction=-1.0(横截方向条件,§5.2)、assert denom(grazing 检测,§5.6)、np.outer(...)/denom(分子矩阵 / 分母标量,§5.4 陷阱)。
陷阱一:Guard 检测抖动(chattering / 误触发)¶
现象。机器人脚在地面附近时,guard 函数 \(g=p_{\text{foot},z}\) 因数值噪声/数值积分误差在零附近反复变号,触发大量虚假的"触地-离地-触地"事件,仿真步长趋零、卡死,或状态被反复 reset 污染。
根本原因。(1) 纯运动学 guard 在接触面附近对噪声敏感;(2) 缺少**滞回(hysteresis)或**方向条件——只看 \(g=0\) 不看穿越方向,导致正反向都触发;(3) 接触检测阈值设得过紧。
正确做法。(1) 强制**方向条件**(§5.2):只在 \(\nabla g^\top F^-<0\)(向下穿越)触发触地,避免"刚弹起又判触地";(2) 加**滞回带**:触地阈值与离地阈值不同(如触地 \(g<0\)、离地 \(g>\epsilon\)),制造一个不灵敏区间;(3) 离地用**动力学 guard**(\(\lambda_n=0\))而非运动学(§5.2 陷阱),因为支撑相 \(p_z\equiv0\) 运动学无法判离地;(4) 对 Zeno 式的残余抖动,用陷阱三的处理。
陷阱二:横截性退化(grazing)导致 \(\Xi\) 爆炸¶
现象。某些步态(软着陆、擦地、临界翻越)下,\(\Xi\) 的元素变得巨大,SKF 协方差爆炸或 HiLQR 梯度方差激增、不收敛。
根本原因。横截速度 \(\nabla g^\top F^-\to0\)(§5.6),\(\Xi\) 的分母趋零。这是**物理病态**,不是数值精度问题(§5.6 陷阱)。
正确做法。(1) 实时监控 \(\nabla g^\top F^-\),接近零时报警(代码里的 assert/降级逻辑);(2) 改步态设计——让脚以明确的负法向速度触地(最根本);(3) 正则化——grazing 邻域局部换平滑接触模型;(4) 不确定性降级——对该事件的 \(\Xi\) 估计加置信度衰减(uaSKF,§5.8)。**绝不要**靠提高浮点精度去"解决"——那只会更精确地算出无穷大。
陷阱三:Zeno 现象导致积分器卡死¶
现象。物体静止贴近接触面时(机器人站立支撑脚、餐具落桌),事件驱动积分器在某时刻 \(T_Z\) 前被无穷多次越来越密的微弹事件卡住,仿真挂起或步长报错。
根本原因。耗散冲击(\(e<1\))的几何级数收缩使有限时间内跳变无穷次(§5.6)。事件驱动积分器逐事件停-启,遇 Zeno 永远走不过 \(T_Z\)。
正确做法。(1) Zeno 检测:连续跳变间隔小于阈值 → 判定进入 Zeno;(2) 切换到约束模式:把无穷次微弹近似成持续接触(约束 \(J\dot q=0\)),对应物理上"物体停在面上";(3) 能量阈值:反弹动能低于阈值直接置零法向速度进约束相;(4) 建模层面:用随冲击速度衰减的恢复系数,从源头消除 Zeno(§5.6.3)。任何严肃的混合系统仿真器都必须有这套逻辑。
陷阱四:协方差矩阵失去对称性/正定性¶
现象。SKF 跑一段时间后,协方差矩阵 \(P\) 出现负特征值或非对称,滤波器输出 NaN 或发散。
根本原因。(1) 浮点运算中 \(P^+=\Xi P^-\Xi^\top\) 的结果因舍入误差略微非对称;(2) \(\Xi\) 秩亏(塑性冲击 \(e=0\) 投影掉一维)使 \(P^+\) 半正定(有零特征值),后续运算的舍入误差可能把它推成微负;(3) 数值上 \(\Xi P^-\Xi^\top\) 直接计算比对称形式更易累积误差。
正确做法。(1) 强制对称化:每步算完 \(P\leftarrow\tfrac12(P+P^\top)\);(2) 用**平方根滤波(square-root / Cholesky form)**:传播 \(P\) 的 Cholesky 因子而非 \(P\) 本身,结构上保证正定(这与第零批数值线性代数的 Cholesky 一脉相承);(3) 对秩亏 \(\Xi\) 带来的零特征值方向,加一个微小的过程噪声 \(Q_\Xi\)(正则化),避免 \(P\) 在该方向完全塌缩;(4) 用 Joseph form 的协方差更新提升数值稳定性。
理论-工程桥接:协方差非对称是所有 Kalman 类滤波器的通病,但在 SKF 里因 \(\Xi\) 秩亏而**加剧**——塑性冲击把 \(P\) 投影到低维(§5.2/§5.5 的降维),零特征值方向最脆弱。这把第零批的"Cholesky/平方根"数值技巧与本章的"\(\Xi\) 秩亏"理论联系起来:理论上的降维(秩亏投影)正是数值上最需要平方根滤波保护的地方。
陷阱五:接触序列误设(mode schedule 错误)¶
现象。HiLQR/HZD 把接触序列设错(如该是"左支撑→双支撑→右支撑"却设成"左支撑→右支撑"漏掉双支撑),优化器收敛到一个物理上不可行的轨迹,或在真机上一落地就摔。
根本原因。本专题的前提是**mode 序列先验已知**(§5.0)。如果这个先验设错,\(\Xi\) 在错误的事件点计算、\(M\) 用错误的 \(\Xi\) 序列组装——整个灵敏度链建立在错误的接触拓扑上。这是"用对了 \(\Xi\) 公式但用在错的事件序列上"的隐蔽错误。
正确做法。(1) 从数据/物理验证 mode 序列:用接触检测确认真实步态的接触相序,再据此设 schedule;(2) 对**不确定接触序列**的任务,根本不该用本专题的显式 hybrid 路线——改用专题 6 的接触隐式 MPC(让优化器自己发现 mode,§5.8);(3) 混合策略:用显式 hybrid 处理已知的主导步态相,对不确定的过渡相留给 CI-MPC;(4) 检查 mode 序列与 guard/reset 的**一致性**——每个声明的 mode 切换都要有对应的、横截满足的 guard。
对比性思维(不是 X 而是 Y):接触序列误设的教训**不是**"\(\Xi\) 理论不可靠",而是"\(\Xi\) 理论的有效性以 mode 序列正确为前提"。这条前提是本专题与专题 4/6 的分界线(§5.0 光谱)。一个成熟的工程师会先问"我的接触序列是先验确定的吗?"——是,则本专题的 \(\Xi\) 工具锋利无比;否,则应换工具,而非硬套 \(\Xi\) 到一个会变的接触拓扑上。
🔧 本章故障排查手册¶
下表汇总本章相关的典型故障(R15),按"症状→可能原因→排查步骤→相关节"组织。
| # | 症状 | 可能原因 | 排查步骤 | 相关节 |
|---|---|---|---|---|
| 1 | 机器人一落地,EKF 协方差骤降、过度自信、随后发散 | 协方差用 reset Jacobian \(D\Delta\) 而非 \(\Xi\) 传播,漏了触地时刻不确定性耦合进速度的秩-1 项 | (1) 检查事件处协方差更新是否用 \(\Xi\);(2) 对比 \(\Xi\) 与 \(D\Delta\) 算出的 post-event 速度方差,后者偏小即确诊;(3) 改用 \(P^+=\Xi P^-\Xi^\top\) | §5.8 应用一、§5.4 |
| 2 | iLQR/DDP 优化含接触运动时,在切换处剧烈震荡、永不收敛 | 对 if 分支直接 autodiff(朴素灵敏度),或用 \(D\Delta\) 近似值函数反传;grazing 附近梯度方差爆炸 | (1) 确认事件处用 \(\Xi\) 反传 \(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\);(2) 检查是否有 reference spreading 处理 mode 失配;(3) 监控横截速度是否接近零(grazing) | §5.8 应用二、§5.6 |
| 3 | \(\Xi\) 元素数值巨大,估计/优化发散 | 横截性退化(grazing),\(\nabla g^\top F^-\to0\),\(\Xi\) 分母趋零;物理病态非数值问题 | (1) 实时计算 \(\nabla g^\top F^-\),接近零确诊;(2) 检查步态是否擦地/软着陆;(3) 改步态增大横截速度,或换平滑接触,或加不确定性降级 | §5.6、§5.3 |
| 4 | 仿真在某时刻"卡住",步长趋零或报错,状态几乎不动 | Zeno 现象——耗散冲击有限时间内无穷次微弹;事件驱动积分器卡在 \(T_Z\) 前 | (1) 检查是否物体静止贴近接触面;(2) 监控连续跳变间隔是否趋零;(3) 加 Zeno 检测 + 切换约束模式 + 能量阈值 | §5.6、§5.9 陷阱三 |
| 5 | 支撑相机器人"永不离地",步态卡死在单相 | 离地用了运动学 guard(\(p_z>0\)),但支撑相 \(p_z\equiv0\),条件永不满足 | (1) 检查离地 guard 定义;(2) 改用动力学 guard \(\lambda_n=0\)(从约束 KKT 反解法向力归零) | §5.2、§5.9 陷阱一 |
| 6 | SKF 协方差出现负特征值/非对称,输出 NaN | 浮点舍入使 \(\Xi P\Xi^\top\) 非对称;\(\Xi\) 秩亏使 \(P\) 半正定后被推成微负 | (1) 每步 \(P\leftarrow\tfrac12(P+P^\top)\) 对称化;(2) 改平方根/Cholesky 滤波;(3) 对秩亏方向加正则化 \(Q_\Xi\) | §5.9 陷阱四 |
| 7 | 优化轨迹物理不可行 / 真机落地就摔,仿真却"正常" | 接触序列(mode schedule)设错,\(\Xi\) 链建立在错误接触拓扑上 | (1) 用接触检测验证真实步态相序;(2) 检查每个声明的 mode 切换是否有横截满足的 guard;(3) 不确定序列改用 CI-MPC | §5.9 陷阱五、§5.0 |
| 8 | 含旋转浮动基座的 \(\Xi\) 谱结构错乱、灵敏度符号跳变 | 四元数双覆盖(\(q\) 与 \(-q\))未固定一致分支,\(D\Delta\) 在两分支差符号 | (1) 检查 reset 前后四元数符号是否连续;(2) reset 后强制 \(q\) 与 pre-event 同半球;(3) 用 \(SO(3)\) 上的 adjoint 形式(专题 3) | §5.2(李群 reset)、专题 3 |
⚠️ 常见陷阱(补充:数值层面的概念误区)¶
💡 概念误区:用固定步长积分器跑混合系统,"撞到 guard 就在当前步切换" 新手想法:"固定步长 RK4 简单高效,每步检查一下 \(g\) 的符号,变号了就 reset,不用搞复杂的事件检测。" 实际上:固定步长会**错过精确的穿越时刻**——你在步末才发现 \(g\) 已变号,但真实穿越发生在步中某处。用错误的事件点算 \(\Xi\)(依赖事件点的 \(F^\pm,\nabla g\))和 reset,误差污染整条轨迹与灵敏度。 为什么重要:事件时刻误差会让 \(\Xi\) 算错、单值矩阵错、Floquet 乘子错、协方差/梯度有偏。对周期步态稳定性这种对 \(\Xi\) 敏感的分析,固定步长几乎必然给出错误结论。 正确做法:用事件驱动积分 + 根查找精确定位穿越时刻(代码骨架第 2-3 步),再在精确事件点应用 reset 与 \(\Xi\)。
🧠 思维陷阱:以为实现层面的陷阱(抖动/Zeno/对称性)是"工程细节",与前面的理论无关 新手想法:"前八节的数学我懂了,这些数值坑就是写代码时小心点的事,不影响对理论的理解。" 实际上:每个数值陷阱都是某条理论的"实现层投影"——抖动 ↔ 横截方向条件(§5.2);grazing 爆炸 ↔ 横截性失效(§5.6);Zeno 卡死 ↔ 混合时间 \(j\to\infty\)(§5.1/§5.6);协方差秩亏 ↔ 塑性冲击降维(§5.2/§5.5)。理论与实现是同一枚硬币的两面。 为什么重要:把陷阱当孤立的"代码 bug",你只能头痛医头;理解它对应的理论根源,才能从根本上设计正确的实现(如知道 grazing 是物理病态就不会去调精度)。 正确思维:每遇到一个数值故障,问"它对应哪条理论假设的破坏?"——这能把零散的调试经验升华成系统的理解。
练习¶
5.9.1(实现题,可在草稿纸上设计或上机) 基于本节代码骨架,为竖直弹跳球实现完整的事件驱动积分 + Saltation 传播:(a) 实现 f, g, Delta, DDelta, f_next, grad_g;(b) 跑 5 个周期,用 §5.5.1 的单值矩阵 \(M=\Xi\Phi\) 验证你累积的 Phi 与解析 \(M\) 一致;(c) 把 \(e\) 从 1 调到 0.8,观察连续跳变间隔,故意触发 Zeno,验证你的 Zeno 检测逻辑(间隔趋零时切换约束模式)。
5.9.2(开放思考题) 陷阱四说塑性冲击的 \(\Xi\) 秩亏让协方差最脆弱。(a) 对一个塑性冲击 \(\Xi\)(含零特征值方向),手算 \(P^+=\Xi P^-\Xi^\top\),说明 \(P^+\) 在哪个方向变成零方差;(b) 这个"零方差方向"物理上意味着什么(提示:冲击后法向速度被确定性地置零,该方向无不确定性);(c) 为什么这恰恰是数值上最需要保护(加 \(Q_\Xi\) 正则化)的方向?过度自信的零方差会带来什么后果?
5.9.3(综合诊断题) 你接手一个足式 SKF 估计器,现象是"机器人小步慢走正常,但快跑落地后状态估计明显漂移"。请用本章故障排查手册系统诊断:(a) 列出至少三个可能原因(结合症状"快跑"——落地速度大但也可能软着陆、可能 codim-2 双脚近同时、可能 mode 序列在快跑时变化);(b) 设计区分这些原因的排查步骤;(c) 对每个可能原因给出对应的修复方向,并指出相关章节。
§5.10 桥接:本专题在路线图中的上下游 ⭐⭐¶
这一节解决什么问题:本章的数学已经完整。最后这一节把 \(\Xi\) 和混合系统放回整个机器人学的知识网络——它从哪些专题"接收"原料(专题 3 李群、专题 4 可微接触),又向哪些专题"输出"工具(05 足式简化模型、专题 6 RL)。这是 R14 跨章桥接的集中体现,帮你看清本章不是孤岛,而是"接触建模光谱"中承上启下的一环。
向后桥接:本章站在哪些专题肩上¶
← 专题 3(李群):Lie 群上的 reset 与 adjoint。 本章 §5.2 末尾埋下的"李群 reset 复杂化"在这里收束。当机器人状态含浮动基座姿态(\(SO(3)/SE(3)\)),reset 映射 \(\Delta\) 不能写成向量空间的线性投影——速度(角速度)活在李代数里,\(D\Delta\) 要用 adjoint 表示,\(\Xi\) 的推导也要在李群的切丛上进行。回顾专题 3:旋转的"加法"是群乘法、"减法"是 \(\log(R_1^{-1}R_2)\)、扰动用左/右平凡化的旋量表示。本章的 \(\delta x,\Xi\) 在含旋转时全部要换成李代数语言,且小心四元数双覆盖(§5.9 陷阱表第 8 行)。专题 3 给本章提供了"如何在弯曲状态空间上做灵敏度"的工具。
← 专题 4(可微接触):mode 已知 vs 求解器选。 §5.0 和 §5.8 反复强调:本专题(mode 先验已知,显式 guard+reset)与专题 4(mode 由凸松弛求解器隐式决定)是接触建模光谱的两端,在硬接触极限相遇。专题 4 的 Clarke Jacobian / 参数 VI 导数,在"刚性 + mode 已知"特例下退化为本章的 \(\Xi\)。专题 4 给本章提供了"\(\Xi\) 在更一般接触模型下的推广形式"的视野——当你不确定 mode、或接触是软的,回到专题 4 的凸松弛框架。
← 控制理论 3.5(LQR/Riccati):iLQR 反传的复用。 §5.8 应用二的 HiLQR 直接复用了控制理论 3.5 的 iLQR backward pass,唯一的改动是事件处把 \(f_x\) 换成 \(\Xi\)。控制理论 3.5 给本章提供了"最优控制的反向传播机器",本章只是教它如何跨越接触。
向前桥接:本章为哪些专题铺路¶
→ 05 足式简化模型(LIPM/SRBD):\(\Xi\) 落到具体模板。 05 章的线性倒立摆(LIPM)、单刚体动力学(SRBD)等简化模型,本质是本章 §5.5/§5.7 那个"塑性冲击使轨道收缩到低维子流形"的降维定理的具体产物。Burden-Revzen-Sastry 定理(§5.5)告诉我们:低维模板捕捉了高维机器人的真正长期动力学——这是 05 章那些简化模型"为什么能用"的数学辩护。本章给 05 章提供了"模板模型合法性"的理论根基。 反过来,05 章的 LIPM/SRBD 给本章抽象的 \(F^\pm,\Delta,g\) 提供了最具体的"看得见摸得着"的实例(SLIP 的弹簧 reset、LIPM 的支撑点切换)。
→ 专题 6(Model-Based RL):梯度穿越接触事件。 §5.0、§5.4、§5.8 三次埋钩的最终去向。专题 6 做闭环学习,需要让策略梯度穿过触地事件。本章的结论是:\(\Xi\)(piecewise flow 的 B-导数)是这条梯度合法穿越的唯一正确对象——朴素 autodiff 在 grazing 附近必然发散。可微仿真训练、CI-MPC 的解析梯度,底层都绕不开 \(\Xi\) 或其 grazing 处的 B-导数推广。本章给专题 6 提供了"梯度如何合法穿过接触"的数学基础。
选型决策:什么时候用本专题的 \(\Xi\) 工具¶
把全章的"选工具"智慧收成一个可操作的决策流程。面对一个含接触的机器人问题,按顺序问自己:
- 接触序列先验已知吗?(步态周期清晰可重复?)
- 否 → 接触序列不确定(杂乱地形、富接触操作) → 用专题 4/6(可微接触 / CI-MPC,让求解器发现 mode),本专题不适用。
-
是 → 进入第 2 步。
-
你要做什么任务?
- 周期步态**稳定性分析** → §5.5 单值矩阵 + Floquet;欠驱动双足额外用 §5.7 HZD 标量返回映射。
- 状态估计(落地时刻协方差) → §5.8 Salted Kalman Filter(\(P^+=\Xi P^-\Xi^\top\))。
- 最优控制 / MPC → §5.8 Hybrid iLQR(\(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\) + 参考扩展)。
- 冲击瞬间的跟踪控制 → §5.8 Impact-Invariant Control(投影到 \(\ker(I-D\Delta)\) 相关子空间)。
-
让策略梯度穿过接触(RL / 可微仿真) → \(\Xi\) 即 B-导数(§5.4 末),交给专题 6。
-
你的系统接近失效边界吗?
- 接近 grazing(软着陆/擦地,\(\nabla g^\top F^-\approx0\)) → §5.6 警告:\(\Xi\) 病态,改步态或换平滑接触。
- 多接触同时触发(对称步态) → §5.6 警告:用 B-导数或 dithering,勿用单一 \(\Xi_{12}\)。
-
物体趋于静止贴地 → §5.9 警告:Zeno,加约束模式切换。
-
用哪套形式化语言写下来?(§5.1)
- Zeno / 鲁棒性 / well-posedness → GST 混合包含。
- 多模态复杂离散逻辑 → 混合自动机。
- 单周期步态稳定性 → 脉冲效应系统(最简洁)。
本质洞察:这个决策流程的第一问"接触序列先验已知吗"是**分水岭**——它决定你是站在接触建模光谱的"显式 hybrid"端(本专题)还是"求解器选 mode"端(专题 4/6)。一个成熟的工程师不会教条地"总用 \(\Xi\)"或"总用 CI-MPC",而是先诊断问题的接触结构,再选最贴合的工具。这正是 §5.0 到 §5.10 一以贯之的元原则:工具的威力来自它与问题结构的匹配,而非工具本身的通用性或新颖性。
一张图看清上下游¶
专题3(李群) 专题4(可微接触) 控制理论3.5(LQR)
弯曲空间灵敏度 mode求解器选/软接触 iLQR反向传播
│ │ │
│ adjoint reset │ 硬接触极限退化 │ 事件处换Ξ
▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ 专题5(本章):混合系统 + Saltation 矩阵 Ξ │
│ mode先验已知 · 显式guard+reset · Ξ=DΔ+秩1修正 │
│ 稳定性(Floquet/HZD) · 估计(SKF) · 控制(HiLQR/II) │
└─────────────────────────────────────────────────────┘
│ │ │
│ 降维定理 │ Ξ=B导数 │ 模板合法性
▼ ▼ ▼
05足式简化模型 专题6(RL) (回到光谱另一端)
LIPM/SRBD模板 梯度穿越接触 CI-MPC自主发现mode
本质洞察:本专题在整个机器人学知识网络中的位置,可以用一句话概括——它是"已知接触结构"这一假设下,把光滑系统的全套工具(变分方程、Floquet、Kalman、iLQR)系统地推广到含接触系统的桥梁。这个桥梁的桥墩是 \(\Xi\):一个把"事件时刻不确定性"一阶编码进状态灵敏度的秩-1 修正。理解了 \(\Xi\),你就同时理解了足式步态为何稳定(§5.5/5.7)、估计器为何不能用 \(D\Delta\)(§5.8)、优化器为何不能朴素 autodiff(§5.8)——它们是同一个数学对象的不同投影。这正是 §5.0 承诺的"理解 Cassie/Digit 为何不是给 ZMP 糊一层 MPC"的兑现:它们背后是一整套以 \(\Xi\) 为核心、严格而可计算的混合系统理论。
本章常见误解汇总¶
下表汇总本章最容易出错的 12 个认知点,供快速自检。左列是常见的错误想法,右列是正确理解。
| # | 常见误解 | 正确理解 |
|---|---|---|
| 1 | 混合系统就是"分段函数"(\(f\) 分几段定义) | 混合系统 = 分段流动 + 状态跳变。分段右端只是一半;真正的难点是触地瞬间速度的不连续跳变(§5.1) |
| 2 | GST 最通用,所有问题都该用 GST | 框架越贴合任务结构越好。单周期步态稳定性用脉冲效应系统最简洁,Zeno 才需要 GST(§5.1) |
| 3 | 触地 guard 和离地 guard 对称(都看脚位置) | 触地是**运动学**的(\(g=p_z\)),离地是**动力学**的(\(g=\lambda_n\))。支撑相 \(p_z\equiv0\),位置无法判离地(§5.2) |
| 4 | 速度投影 \(P_\Delta\) 是欧氏正交投影 | 是关于动能度量 \(M\) 的投影(\(P_\Delta^2=P_\Delta\) 但 \(P_\Delta\neq P_\Delta^\top\))。物理(动量)选定了度量(§5.2) |
| 5 | \(\delta x^-\) 是两条轨迹各自触地点之差 | 是两条轨迹在**同一标称时刻 \(t^*\)** 的状态差。固定公共时刻才能与初值线性联系(§5.3) |
| 6 | 横截性是可有可无的技术假设 | 它是 \(\delta t\)(进而 \(\Xi\))**存在**的充要前提,三位一体:隐函数可解条件 + guard 方向条件 + \(\Xi\) 分母(§5.3) |
| 7 | \(\Xi\) 就是 reset 的导数 \(D\Delta\) | \(\Xi=D\Delta+\) 秩-1 时间错位补偿。离地时 \(D\Delta=I\) 但 \(\Xi\neq I\)(向量场跳变)(§5.4) |
| 8 | \(\Xi\) 的修正项是可忽略的高阶小量 | 修正项与 \(D\Delta\) 同阶(\(O(1)\))。弹跳球谱半径 = \(e\) 全靠它,漏掉则恒判临界稳定(§5.4) |
| 9 | 单值矩阵写成 \(\Phi_0\Xi_1\Phi_1\cdots\)(左→右时间序) | 矩阵右乘,最先发生在最右:\(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\)。写反则全错(§5.5) |
| 10 | Floquet 乘子全部 \(<1\) 才稳定 | 周期轨必有平凡乘子 \(\mu=1\)(相位方向),须剔除后看其余 $ |
| 11 | grazing 处 \(\Xi\) 爆炸是数值精度问题 | 是**物理病态**(真实灵敏度无穷大)。提高精度无用,要改步态/换模型(§5.6) |
| 12 | Kalman 滤波协方差用 \(D\Delta\) 传播 | 必须用 \(\Xi\):\(P^+=\Xi P^-\Xi^\top\)。用 \(D\Delta\) 漏掉时刻不确定性耦合,过度自信发散(§5.8) |
本章小结¶
本章从"一只脚踩到地面,连续 ODE 算不清"这个最朴素的物理困难出发(§5.0),逐层建立了混合动力系统的完整理论:三套形式化语言(§5.1)→ guard 与 reset 的具体形式(§5.2)→ 穿越时刻灵敏度 \(\delta t\)(§5.3)→ Saltation 矩阵 \(\Xi\) 的完整推导(§5.4)→ 周期步态稳定性(§5.5)→ 失效边界(§5.6)→ HZD 解析稳定性(§5.7)→ 三大工程应用(§5.8)→ 数值实现(§5.9)→ 知识网络定位(§5.10)。
贯穿全章的一条主线是 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\)——这个把"事件时刻不确定性"一阶编码进状态灵敏度的秩-1 修正,是连接稳定性分析、状态估计、最优控制三大领域的统一工具。
如果只带走一句话,那应该是:混合系统的全部困难,根源于"扰动什么时候穿过切换面"这个看似简单的问题;而 \(\Xi\) 就是这个问题在横截穿越假设下的一阶答案。 横截穿越时,\(\Xi\) 是一个干净的秩-1 修正的矩阵;横截性退化(grazing)、多面交汇(codim-2)、无穷反复(Zeno)时,这个答案分别表现为发散、集值、奇异——但它们都是同一个问题"穿越何时发生"在不同退化模式下的面相。理解了这条主线,你会发现本章看似庞杂的十一节其实只讲了一件事:如何在接触事件处,正确地传播一个一阶扰动。 稳定性(传播一圈看放大率)、估计(传播协方差)、控制(传播值函数)、RL(传播策略梯度)——全是这件事的不同应用。
本质洞察(全章收束):从 §5.0 那只"踩到地面、连续 ODE 算不清"的脚,到 §5.8 Cassie 落地时 SKF 协方差的正确传播,本章走过的是同一段路——把"零时间内的有限跳变"这个连续数学无法表达的物理,变成一套可推导、可计算、可工程落地的灵敏度理论。 这套理论的核心不是某个炫技的公式,而是一种思维方式:遇到接触事件,不要回避它的不连续,而要精确地刻画"扰动如何穿过它"。\(\Xi\) 是这种思维方式的结晶。当你下次看到 Cassie 稳稳落地、四足在碎石上恢复平衡,你会知道——那背后不是玄学调参,而是 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\) 里每一个 \(\Xi\) 都被正确地算对了。
符号表¶
本章新引入的核心数学符号汇总(按首次出现排序):
| 符号 | 含义 | 首见 |
|---|---|---|
| \(\mathcal H=(C,F,D,G)\) | GST 混合包含:流集/流映射/跳集/跳映射 | §5.1 |
| \((t,j)\) | 混合时间:连续时间 \(t\) + 跳变计数 \(j\) | §5.1 |
| \(H=(\mathcal Q,\mathcal X,f,\text{Init},\text{Inv},E,G,R)\) | 混合自动机八元组 | §5.1 |
| \(\mathcal S\) | 切换面(脉冲效应系统),\(\mathcal S=\{H(x)=0\}\) | §5.1 |
| \(\Delta\) | 冲击/reset 映射,\(x^+=\Delta(x^-)\) | §5.1 |
| \(g(x)\) | guard 函数(标量),零水平集为切换面 | §5.2 |
| \(\nabla g\) | guard 梯度(切换面法向) | §5.2 |
| \(\nabla g^\top F^-\) | 横截速度(guard 方向条件 + \(\Xi\) 分母) | §5.2 |
| \(F^-,F^+\) | 事件前/后向量场(pre/post-event) | §5.2 |
| \(J\) | 接触点 Jacobian,\(J=\partial p_{\text{foot}}/\partial q\) | §5.2 |
| \(\hat\Lambda\) | 冲击法向冲量,\(\hat\Lambda=\int\lambda\,dt\) | §5.2 |
| \(P_\Delta\) | 塑性冲击速度投影矩阵(\(M\)-投影) | §5.2 |
| \(D\Delta\) | reset 映射的 Jacobian | §5.2 |
| \(e\) | 恢复系数(\(e=0\) 塑性,\(e=1\) 弹性) | §5.2 |
| \(\delta t\) | 扰动穿越时刻偏移 | §5.3 |
| \(\delta x^-,\delta x^+\) | 事件前/后状态扰动(标称穿越时刻处) | §5.3 |
| \(\Phi(t,t_0)\) | 光滑段状态转移矩阵,\(\dot\Phi=A\Phi\) | §5.3 |
| \(\tau(\delta x_0)\) | 扰动穿越时刻(隐函数定理解出) | §5.3 |
| \(\Xi\) | Saltation 矩阵(跳跃矩阵),\(\delta x^+=\Xi\delta x^-\) | §5.4 |
| \(M\) | 单值矩阵,\(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\) | §5.5 |
| \(\mu_i\) | Floquet 乘子(\(M\) 的特征值) | §5.5 |
| \(y=h(q)-h_d(\theta(q))\) | 虚拟约束(HZD) | §5.7 |
| \(\theta(q)\) | 相位变量(单调,代替时间参数化) | §5.7 |
| \(\mathcal Z\) | 零动力学流形,\(\{y=0,\dot y=0\}\) | §5.7 |
| \(\delta_z^2\) | 零动力学返回映射斜率(HZD 稳定性判据) | §5.7 |
| \(P^\pm\) | 事件前/后状态协方差(SKF) | §5.8 |
| \(Q_\Xi\) | 事件处过程噪声(SKF 正则化) | §5.8 |
| \(V_x,V_{xx}\) | 值函数梯度/Hessian(HiLQR) | §5.8 |
| \(\ker(I-D\Delta)\) | 冲击不变子空间(Impact-Invariant Control) | §5.8 |
定理速查表¶
本章核心定理/公式及一句话说明:
| 定理/公式 | 一句话说明 | 对应节 |
|---|---|---|
| 横截方向条件 \(\nabla g^\top F^-<0\) | 保证轨迹"穿过"而非"擦过"切换面,是 \(\delta t/\Xi\) 良定义的护城河 | §5.2 |
| 塑性冲击映射 \(\dot q^+=P_\Delta\dot q^-\) | 落地速度沿 \(M\)-度量投影到接触约束子空间,配置不变 | §5.2 |
| 穿越时刻灵敏度 \(\delta t=-\dfrac{\nabla g^\top\delta x^-}{\nabla g^\top F^-}\) | 隐函数定理:扰动在 guard 法向的投影除以横截速度(空间→时间换算) | §5.3 |
| Saltation 矩阵 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\) | reset 导数 + 时间错位的秩-1 一阶补偿;混合系统的"事件 Jacobian" | §5.4 |
| \(\Xi\) 即 B-导数(Burden-Sastry 2016) | piecewise flow 在横截穿越处的 Bouligand 导数恰为 \(\Xi\);梯度合法穿越接触的唯一对象 | §5.4 |
| 混合变分方程 \(\dot{\delta x}=A\delta x\) / \(\delta x^+=\Xi\delta x^-\) | 光滑段用 \(\Phi\) 传播,跨 guard 乘 \(\Xi\) | §5.5 |
| 单值矩阵 \(M=\Phi_n\Xi_n\cdots\Xi_1\Phi_0\) | \(\Phi\) 与 \(\Xi\) 交替相乘;其 Floquet 乘子(除平凡 \(\mu=1\))判周期步态稳定性 | §5.5 |
| 常秩降维定理(Burden-Revzen-Sastry 2015) | 塑性冲击秩亏投影使轨道有限时间收缩到低维子流形——模板模型合法性根基 | §5.5 |
| Impact invariance \(\Delta(\mathcal S\cap\mathcal Z)\subset\mathcal Z\) | 冲击不破坏零动力学流形,使 HZD 的 \(\mathcal Z\) 成混合不变流形 | §5.7 |
| HZD 标量返回映射 \(\zeta_{k+1}=\delta_z^2\zeta_k+c\) | 欠驱动双足稳定性压缩成标量斜率 \(\delta_z^2<1\) | §5.7 |
| Salted Kalman Filter \(P^+=\Xi P^-\Xi^\top\) | 协方差经混合事件用 \(\Xi\)(非 \(D\Delta\))传播,捕捉时刻不确定性耦合 | §5.8 |
| Hybrid iLQR \(V_{xx}\leftarrow\Xi^\top V_{xx}\Xi\) | 值函数 Hessian 跨接触用 \(\Xi\) 反传 + 参考扩展处理 mode 失配 | §5.8 |
知识点总表¶
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 5.0 | 混合系统的必要性 | 刚性冲击 = 零时间有限跳变,超出经典 ODE | §5.0 | ⭐ |
| 5.1 | 三大形式化框架 | GST / 自动机 / 脉冲效应,按任务选 | §5.1 | ⭐⭐ |
| 5.2 | Guard 与 reset | 何时跳(运动学/动力学)+ 怎么跳(\(M\)-投影) | §5.2 | ⭐⭐ |
| 5.3 | 穿越时刻灵敏度 | 隐函数定理推 \(\delta t\),横截性是地基 | §5.3 | ⭐⭐⭐ |
| 5.4 | Saltation 矩阵 | 三步推导 \(\Xi=D\Delta+\) 秩-1,B-导数 | §5.4 | ⭐⭐⭐ |
| 5.5 | 变分方程与稳定性 | 单值矩阵 \(M\),Floquet 乘子,降维定理 | §5.5 | ⭐⭐⭐ |
| 5.6 | 失效边界 | grazing / codim-2 / Zeno | §5.6 | ⭐⭐⭐ |
| 5.7 | 混合零动力学 | 虚拟约束 + impact invariance → 标量稳定性 | §5.7 | ⭐⭐⭐ |
| 5.8 | 三大工程应用 | SKF / HiLQR / Impact-Invariant,统一 \(\Xi\) | §5.8 | ⭐⭐⭐ |
| 5.9 | 数值实现与陷阱 | 事件驱动积分 + 8 类故障排查 | §5.9 | ⭐⭐⭐ |
| 5.10 | 知识网络定位 | 上承李群/可微接触,下启简化模型/RL | §5.10 | ⭐⭐ |
累积项目:本章新增模块¶
本项目贯穿第七批接触力学专题。前面专题 1-4 已搭建了"接触力求解 + 时步法 + 可微仿真"的基础。本章为项目新增**混合系统灵敏度模块**——一个能对足式周期步态做稳定性分析、状态估计与最优控制的 Saltation 工具箱。
本章新增:saltation_toolbox 模块
在累积项目的代码库中新增一个模块,包含三个子组件,逐个对应本章的三大应用:
- 核心:Saltation 矩阵计算器(对应 §5.4)
- 输入:穿越点状态 \(x^-\)、pre/post 向量场 \(F^\pm\)、guard 函数 \(g\) 及其梯度、reset 映射 \(\Delta\) 及其 Jacobian \(D\Delta\)。
- 输出:\(\Xi\)(含 grazing 检测——横截速度接近零时抛出警告)。
-
验证:对竖直弹跳球,验证 \(\det\Xi=1\)(\(e=1\))、谱半径 \(=e\)(一般 \(e\))。
-
稳定性分析器(对应 §5.5/§5.7)
- 给定一个周期步态的标称轨迹与接触序列,事件驱动积分 + 沿轨迹累积 \(\Phi\) 与 \(\Xi\),组装单值矩阵 \(M\)。
- 计算 Floquet 乘子,剔除平凡 \(\mu=1\),判断轨道稳定性。
-
进阶:对 HZD 步态,验证 impact invariance 并计算标量返回映射斜率 \(\delta_z^2\)。
-
Salted Kalman Filter(对应 §5.8)
- 在已有的(光滑)EKF 基础上,在混合事件处用 \(\Xi\) 替换 \(D\Delta\) 传播协方差(\(P^+=\Xi P^-\Xi^\top+Q_\Xi\))。
- 加入数值保护:每步对称化 \(P\)、对 \(\Xi\) 秩亏方向加正则化(§5.9 陷阱四)。
- 对比实验:同一落地场景下,对比 \(\Xi\) 版与 \(D\Delta\) 版的 post-event 速度方差,复现"\(D\Delta\) 过度自信"现象。
与前面专题模块的衔接: - 复用专题 1-2 的接触力求解器:reset 映射 \(\Delta\) 中的冲量 \(\hat\Lambda\) 计算、离地 guard 的 \(\lambda_n\) 反解,都调用接触力模块。 - 复用专题 4 的可微仿真器:\(D\Delta\)、\(\nabla g\)、\(F^\pm\) 的导数可由可微仿真器自动微分得到,无需手写。 - 为后续 05 足式简化模型铺路:稳定性分析器可直接用于 LIPM/SLIP 模板的极限环稳定性验证。
项目里程碑检查:本章模块完成后,你应能对一个平面 compass-gait 双足(练习 5.5.3)完整地:(1) 计算每步触地的 \(\Xi\);(2) 组装 \(M\) 并判稳定性;(3) 在落地时刻用 SKF 正确传播协方差。这三件事串起来,就是一个最小但完整的"混合系统感知-分析"管线。
延伸阅读¶
按"入门→核心→进阶→应用"分层,标注难度与定位。
入门与综述(先读这些建立全局)¶
- Kong, Payne, Zhu, Johnson, "Saltation Matrices: The Essential Tool for Linearizing Hybrid Dynamical Systems," Proceedings of the IEEE, 2024(arXiv:2306.06862)⭐⭐⭐。本章首选入口。面向机器人学家的 \(\Xi\) 权威教程,三步几何推导、刚体系统的 \(\Xi\) 结构性质、在估计/控制中的统一应用。本章 §5.3-5.4 的推导组织即沿用此文。
- Johnson, Burden, Koditschek, "A Hybrid Systems Model for Simple Manipulation and Self-Manipulation Systems," IJRR 2016 ⭐⭐⭐。混合系统建模的机器人学视角综述。
核心理论(混合系统的数学根基)¶
- Goebel, Sanfelice, Teel, Hybrid Dynamical Systems: Modeling, Stability, and Robustness, Princeton University Press, 2012 ⭐⭐⭐⭐。混合系统的"圣经"。混合时间域、well-posedness、Zeno、鲁棒性的完整理论。第 6-7 章是 Zeno 与鲁棒性的标准参考。难度高,作为查阅手册而非通读。
- Burden, Sastry, Koditschek, Revzen, "Event-Selected Vector Field Discontinuities Yield Piecewise-Differentiable Flows," SIAM J. Applied Dynamical Systems (SIADS) 2016 ⭐⭐⭐⭐。\(\Xi\) = B-导数的严格证明;piecewise-differentiable flow 理论。专题 6 梯度穿越接触的数学根基。
- Aizerman, Gantmakher, "On the stability of periodic motions," 1958 ⭐⭐⭐⭐。Saltation 矩阵的历史原始出处(继电器控制系统的扰动传播)。史料价值。
- di Bernardo, Budd, Champneys, Kowalczyk, Piecewise-smooth Dynamical Systems: Theory and Applications, Springer 2008 ⭐⭐⭐⭐。grazing 分岔、非光滑系统分岔理论的权威专著(§5.6 的深入参考)。
足式与 HZD(步态稳定性的专门理论)¶
- Westervelt, Grizzle, Chevallereau, Choi, Morris, Feedback Control of Dynamic Bipedal Robot Locomotion, CRC Press 2007 ⭐⭐⭐⭐。HZD 的**唯一权威教科书**。虚拟约束、零动力学、impact invariance、标量返回映射的完整理论。§5.7 的源头。
- Westervelt, Grizzle, Koditschek, "Hybrid Zero Dynamics of Planar Biped Walkers," IEEE TAC 2003 ⭐⭐⭐⭐。HZD 的奠基论文。impact invariance 条件与标量 LTI 返回映射的原始推导。
- Hurmuzlu, Marghitu, "Rigid body collisions of planar kinematic chains with multiple contact points," IJRR 1994 ⭐⭐⭐。多接触点刚体冲击映射的经典推导(§5.2 冲击映射的出处)。
- Brogliato, Nonsmooth Mechanics: Models, Dynamics and Control, 3rd ed., Springer 2016 ⭐⭐⭐⭐。恢复系数、冲击分类、非光滑力学的系统参考(§5.2 冲击分类的出处)。
- McGeer, "Passive Dynamic Walking," IJRR 1990 ⭐⭐⭐。被动动态行走的开创性工作(§5.5 被动行走稳定性的来源)。
应用(估计、控制、优化)¶
- Kong, Mousaei, Bhounsri, ..., Johnson, "The Salted Kalman Filter: Kalman Filtering on Hybrid Dynamical Systems," Automatica 2021(arXiv:2007.12233)⭐⭐⭐。SKF 原始论文,\(P^+=\Xi P^-\Xi^\top\) 的推导与实验。
- Payne, Kong, Johnson, "The Uncertainty Aware Salted Kalman Filter: State Estimation for Hybrid Systems with Uncertain Guards," IROS 2022(arXiv:2202.12729)⭐⭐⭐。guard 不确定时的 uaSKF,估计误差峰值降 24-60%。
- Kong, Li, Council, Johnson, "iLQR for Piecewise-Smooth Hybrid Dynamical Systems," CDC 2021(arXiv:2103.14584)⭐⭐⭐。HiLQR 的值函数 \(\Xi\) 反传 + reference extension。
- Kong, Li, Johnson, "Hybrid iLQR Model Predictive Control for Contact Implicit Stabilization on Legged Robots," IEEE T-RO 2023(arXiv:2207.04591)⭐⭐⭐。HiLQR-MPC,Unitree A1 四足验证。
- Yang, Posa, "Impact Invariant Control with Applications to Bipedal Locomotion," IROS 2021(arXiv:2103.06907;扩展版 Autonomous Robots 2023/2025)⭐⭐⭐。冲击瞬间把控制目标投影到 impact-invariant 子空间。
- Le Cleac'h, Howell, Yang, Lee, Zhang, Bishop, Schwager, Manchester, "Fast Contact-Implicit Model Predictive Control," 2021/2024(arXiv:2107.05616)⭐⭐⭐⭐。接触隐式 MPC(光谱另一端,§5.8 对比)。
- Kim, Kang, Kim, Hong, Park, "Contact-Implicit Model Predictive Control: Controlling Diverse Quadruped Motions Without Pre-Planned Contact Modes or Trajectories," IJRR 2025(arXiv:2312.08961)⭐⭐⭐⭐。45kg HOUND 四足,无需预设接触序列。
历史与交叉(拓宽视野)¶
- Lygeros, Johansson, Simić, Zhang, Sastry, "Dynamical Properties of Hybrid Automata," IEEE TAC 2003 ⭐⭐⭐⭐。混合自动机在控制理论中的标准形式(§5.1 自动机框架出处)。
- Branicky, "Multiple Lyapunov Functions and Other Analysis Tools for Switched and Hybrid Systems," IEEE TAC 1998 ⭐⭐⭐⭐。多 Lyapunov 函数与切换系统稳定性(§5.1 第四套语言)。
- Posa, Kuindersma, Tedrake, "Optimization and Stabilization of Trajectories for Constrained Dynamical Systems," WAFR 2016 ⭐⭐⭐⭐。证明显式 hybrid 与接触隐式优化的局部等价(§5.0/§5.8 的依据)。
- Filippov, Differential Equations with Discontinuous Righthand Sides, Kluwer 1988 ⭐⭐⭐⭐。微分包含与滑模解的经典理论(§5.0 第二条源流;Saltation 一词的来源)。
本章与后续章节的关系¶
| 后续章节 | 与本章的关系 | 本章哪个知识点为其铺垫 |
|---|---|---|
| 05 足式简化模型(LIPM/SRBD) | 简化模型的合法性由本章降维定理保证;其极限环稳定性用本章单值矩阵/Floquet 分析 | §5.5 常秩降维定理、§5.7 HZD 标量返回映射 |
| 专题 6(Model-Based RL) | 策略梯度穿越接触事件的合法对象是 \(\Xi\)(B-导数);可微仿真训练的接触梯度 | §5.4 \(\Xi\) 即 B-导数、§5.8 与专题 6 的接口 |
| 足式控制(MPC/WBC 实践) | HiLQR-MPC 直接用本章 \(\Xi\) 反传值函数;WBC 的接触切换处理 | §5.8 HiLQR、§5.2 reset/guard |
| 足式状态估计(LIO/腿式里程计) | 落地时刻协方差传播用 SKF(本章 \(\Xi\)) | §5.8 Salted Kalman Filter |
| 专题 3(李群)反向复用 | 含旋转浮动基座的 \(\Xi\) 需李代数/adjoint 表示 | §5.2 李群 reset、§5.10 桥接 |
一句话定位本章在课程中的角色:本章是"接触力学光谱"中**显式建模**那一端的数学核心。它把前面专题学到的接触力求解(专题 1-2)、时步法(专题 3)、可微仿真(专题 4)的"原料",组装成一套能做**稳定性分析、状态估计、最优控制**的灵敏度理论。学完本章,你手里就有了分析任何"已知接触序列"足式系统的完整工具——这是通往真实 Cassie/Digit/四足控制的必经之路。
研究实践建议¶
给新手的建议(第一次接触混合系统)¶
1. 先吃透弹跳球,再碰双足。 本章所有抽象概念(\(\delta t\)、\(\Xi\)、单值矩阵、Floquet、Zeno)都能在竖直弹跳球这个 2 维玩具上完整地、手算地走一遍(练习 5.3.1、5.4.1、5.5.1、5.6.3)。不要急着上 Cassie——先在弹跳球上把每个公式推到底、算出数、画出图。弹跳球之于混合系统,就像单摆之于经典力学:最简单但包含全部本质。
2. 永远区分"物理病态"和"数值病态"。 这是本章最重要的工程素养(§5.6 反复强调)。\(\Xi\) 爆炸了——是 grazing(物理病态,要改步态/模型)还是浮点误差(数值病态,要换算法)?协方差发散了——是漏了 \(\Xi\) 的秩-1 项(理论错误)还是没对称化(数值问题)?养成"先诊断病因层次"的习惯,能省下大量在错误方向的调试时间。
3. 把"\(\Xi\) 替换 \(D\Delta\)"当作肌肉记忆。 本章一半的工程陷阱(SKF 过度自信、HiLQR 不收敛)都源于"在混合事件处用了 \(D\Delta\) 而非 \(\Xi\)"。无论做估计、控制还是仿真,只要跨越混合事件,第一反应就该是"这里要用 \(\Xi\),不是 \(D\Delta\)"。记住离地的反例(\(D\Delta=I\) 但 \(\Xi\neq I\))作为试金石。
4. 用对框架,别用 GST 砸核桃。 §5.1 的"用最小够用的框架"原则贯穿全章。分析单周期步态稳定性?用脉冲效应系统(最简洁)。证 Zeno/鲁棒性?才动用 GST。初学者常因"GST 最严格"而处处用它,结果被四件套和双指标淹没,看不清简单结论。
给有经验者的建议(已做过足式控制/估计)¶
1. 检查你现有系统里所有的"接触处导数"。 如果你已有一个足式 EKF/MPC/仿真器,回去审计:每一处跨越接触的线性化,用的是 \(D\Delta\) 还是 \(\Xi\)?很可能你的系统在某处悄悄用了 \(D\Delta\)(因为它"看起来对"),这正是落地后估计漂移/优化震荡的隐藏根源。这个审计往往能立竿见影地改善性能。
2. 把 grazing 监控做成在线指标。 在你的系统里实时计算并记录横截速度 \(\nabla g^\top F^-\)。它接近零时(软着陆、擦地、临界动作)就是你的估计器/优化器最脆弱的时刻。把它做成一个 dashboard 指标,能让你在事故发生前预警,也能解释"为什么某些动作总是估计不准/优化不收敛"。
3. 对称步态务必小心 codim-2。 如果你做双足同时落地、四足 trot 对角腿同时触地这类对称步态,标称轨迹上的"两脚合并成一次冲击"可能数值能跑,但它丢失了扰动改变触发顺序的一阶信息(§5.6)。要么用 B-导数严格处理,要么用 dithering,但要清楚后者是近似。这是对称步态分析的高频隐藏 bug。
4. 善用可微仿真自动算 \(\Xi\) 的零件。 \(\Xi\) 公式里的 \(D\Delta\)、\(\nabla g\)、\(F^\pm\) 全是导数,手写易错。专题 4 的可微仿真器能自动微分出这些零件,你只需按 \(\Xi=D\Delta+\dfrac{(F^+-D\Delta F^-)\nabla g^\top}{\nabla g^\top F^-}\) 组装。这能大幅减少手写导数的 bug,也让 \(\Xi\) 计算与你的仿真管线无缝衔接。
研究前沿的方向感¶
如果你想在这个方向做研究,几个活跃的开放问题:(1) grazing/codim-2 的鲁棒灵敏度——B-导数在工程中如何高效计算与使用,仍不成熟;(2) 混合系统的不确定性量化——uaSKF 是开端,但 guard/mode 不确定性的系统处理仍是开放问题;(3) 学习与混合结构的结合——如何让神经网络策略尊重 \(\Xi\) 的结构(专题 6);(4) 多接触、富接触操作——从足式(少而清晰的接触)走向灵巧操作(多而不确定的接触)时,显式 hybrid 与接触隐式方法如何融合。这些方向都建立在本章的 \(\Xi\) 理论之上。
版本信息速查¶
| 工具/库/概念 | 版本/年份 | 备注 |
|---|---|---|
| Saltation 矩阵原始出处 | Aizerman-Gantmakher 1958 | 继电器控制系统扰动传播 |
| GST 混合系统专著 | Goebel-Sanfelice-Teel 2012 | Princeton University Press |
| \(\Xi\) = B-导数 | Burden-Sastry-Koditschek-Revzen 2016 | SIADS |
| \(\Xi\) 权威教程(本章入口) | Kong-Payne-Zhu-Johnson 2024 | Proceedings of the IEEE,arXiv:2306.06862 |
| HZD 权威教科书 | Westervelt-Grizzle 等 2007 | CRC Press |
| HZD 奠基论文 | Westervelt-Grizzle-Koditschek 2003 | IEEE TAC |
| Salted Kalman Filter | Kong 等 2021 | Automatica,arXiv:2007.12233 |
| uaSKF | Payne-Kong-Johnson 2022 | IROS,arXiv:2202.12729 |
| Hybrid iLQR | Kong-Li-Council-Johnson 2021 | CDC,arXiv:2103.14584 |
| Hybrid iLQR MPC | Kong-Li-Johnson 2023 | IEEE T-RO,arXiv:2207.04591,Unitree A1 |
| Impact-Invariant Control | Yang-Posa 2021 / 2023 | IROS / Autonomous Robots,arXiv:2103.06907 |
| Contact-Implicit MPC | Kim 等 2025;Le Cleac'h 等 2021 | IJRR / arXiv:2312.08961、2107.05616 |
| 冲击映射经典 | Hurmuzlu-Marghitu 1994 | IJRR |
| 非光滑力学参考 | Brogliato 2016(3rd ed.) | Springer |
| 代码骨架语言 | Python 3 + SciPy solve_ivp |
事件驱动积分,仅演示用 |
本文档属于 Robotics Tutorial 项目,作者:Pengfei Guo,达妙科技。采用 CC BY 4.0 协议,转载请注明出处。