D1 微分平坦与 SE(3) 几何控制¶
版本: v5.0 理论教学完整版 预计学习时间: 2 周 (20-28 小时) 前置依赖: 刚体力学基础、线性代数 (旋转矩阵/叉积)、李群 SO(3)/SE(3) 初步、微分方程 Lyapunov 稳定性理论 文档类型: 理论教学 (text:code >= 85:15, LaTeX 公式算作 text)
本部分定位: 无人机规控的一切都建立在两个基石之上: 微分平坦性 (Differential Flatness) 和 SE(3) 几何控制 (Geometric Control on SE(3))。微分平坦性回答"如何从一条 4 维曲线恢复全部 12 维状态和 4 维控制输入"; SE(3) 几何控制回答"当实际状态偏离期望轨迹时, 如何在旋转群上无奇异地修正"。D1 讲这两个理论基础; D2 将讲 MPC 如何把它们工程化为实时在线优化问题。
前置自测¶
在开始学习之前, 请先做以下自测题。如果你能正确回答 4 题及以上, 可以跳过第 1 节的动力学建模直接进入第 2 节微分平坦性。如果你只能回答 1-2 题, 建议从头开始并放慢节奏。答不出来的题目旁标注了应回看的前置章节。
[自测题 1] 旋转矩阵基本性质 (回看: 李群 SO(3) 章) 给定旋转矩阵 \(R \in SO(3)\), 以下哪些性质成立? (多选) - (A) \(R^T R = I\) - (B) \(\det(R) = 1\) - (C) \(R\) 的列向量两两正交且长度为 1 - (D) \(R\) 的特征值都是实数
答案: A, B, C。旋转矩阵是正交矩阵 (Orthogonal Matrix) 且行列式 (Determinant) 为 +1。其特征值中有一个实数 1 (对应旋转轴), 另外两个是共轭复数 \(e^{\pm i\theta}\) (对应旋转角), 因此 D 错误。如果你对"为什么特征值是共轭复数"感到困惑, 回顾: \(R\) 是实正交矩阵, 其特征多项式是三次实系数多项式, 必有至少一个实根; 又因为 \(|Rv| = |v|\) (保范), 所有特征值模为 1, 所以另外两个根模为 1 且共轭。
[自测题 2] hat 算子与叉积 (回看: 李代数基础章) 给定向量 \(\omega = [\omega_1, \omega_2, \omega_3]^T\), 写出 \(\hat{\omega}\) (hat map) 的矩阵形式, 并说明 \(\hat{\omega} v\) 等价于什么运算。
答案: $\(\hat{\omega} = \begin{bmatrix} 0 & -\omega_3 & \omega_2 \\ \omega_3 & 0 & -\omega_1 \\ -\omega_2 & \omega_1 & 0 \end{bmatrix}\)$ \(\hat{\omega} v = \omega \times v\), 即向量叉积 (Cross Product)。hat 算子将 \(\mathbb{R}^3\) 映射到 \(\mathfrak{so}(3)\) (\(3 \times 3\) 反对称矩阵空间, 即 SO(3) 的李代数 (Lie Algebra))。逆运算 vee (\(\vee\)) 将反对称矩阵映回 \(\mathbb{R}^3\)。理解这对互逆映射是后续全部推导的基础。
[自测题 3] Newton-Euler 方程 (回看: 刚体力学章) 一个刚体的旋转动力学方程在体坐标系中为:
其中 \(\Omega \times J\Omega\) 这一项的物理含义是什么? 如果刚体不旋转 (\(\Omega = 0\)), 这一项会消失吗?
答案: \(\Omega \times J\Omega\) 是**陀螺力矩** (Gyroscopic Torque), 又称科里奥利力矩 (Coriolis Torque)。它源于在非惯性参考系 (旋转的体坐标系) 中描述角动量变化。当 \(\Omega = 0\) 时该项为零, 方程退化为 \(J\dot{\Omega} = M\), 即简单的"力矩 = 惯量 \(\times\) 角加速度"。这一项在高速旋转时显著, 忽略它会导致控制器性能严重下降。
[自测题 4] 欧拉角的奇异性 (回看: 姿态表示章) 使用 ZYX 欧拉角 (Euler Angles) \((\phi, \theta, \psi)\) 表示姿态时, 在什么条件下会出现万向节锁 (Gimbal Lock)? 此时角速度到欧拉角速率的映射矩阵会怎样?
答案: 当俯仰角 (Pitch) \(\theta = \pm 90°\) 时出现万向节锁。此时滚转轴 (Roll) 和偏航轴 (Yaw) 重合, 失去一个自由度。角速度到欧拉角速率的映射矩阵 \(T(\phi,\theta)\) 变为奇异 (行列式为零), 无法求逆。这意味着给定体坐标系角速度 \(\Omega\), 无法唯一确定欧拉角变化率 \((\dot{\phi}, \dot{\theta}, \dot{\psi})\)。这就是为什么我们需要旋转矩阵或四元数来描述姿态——它们在全域上不奇异 (但各有代价, 后文详述)。
[自测题 5] Lyapunov 稳定性 (回看: 非线性控制基础章) 若系统 \(\dot{x} = f(x)\) 存在一个正定函数 \(V(x)\) 使得 \(\dot{V}(x) \leq -\alpha V(x)\) (其中 \(\alpha > 0\)), 则可以得出什么结论? 这比 \(\dot{V} \leq 0\) 强在哪里?
答案: 可以得出**指数稳定性 (Exponential Stability)**: \(V(x(t)) \leq V(x(0)) e^{-\alpha t}\), 因此 \(x(t)\) 指数收敛到原点。这比 \(\dot{V} \leq 0\) (仅保证 Lyapunov 稳定, 即不发散但不保证收敛) 和 \(\dot{V} < 0\) (渐近稳定 (Asymptotic Stability), 保证收敛但不保证速率) 都更强。指数稳定性给出了确定的收敛速率估计, 对实际控制器设计极其重要——它告诉你"误差多久减半"。
本章目标¶
完成本章学习后, 你应该能够:
- 从第一性原理推导四旋翼 (Quadrotor) Newton-Euler 动力学方程, 包括体坐标系中的平移和旋转方程, 理解每一项的物理含义
- 完整证明四旋翼的微分平坦性: 从平坦输出 (Flat Outputs) \(\sigma = (x, y, z, \psi)\) 出发, 通过纯代数运算恢复全部 12 维状态和 4 维控制输入, 并解释每步为什么这样做
- 推导 Lee-Leok-McClamroch SE(3) 几何跟踪控制器, 理解姿态误差函数 \(\Psi(R, R_d)\) 的构造动机, 以及几乎全局渐近稳定性 (Almost Global Asymptotic Stability, AGAS) 的 Lyapunov 证明
- **解释为什么欧拉角 PID 在大角度时失败**而几何控制器不会, 将其追溯到 Bhat-Bernstein 拓扑障碍定理 (Topological Obstruction)
- 理解微分平坦性与轨迹生成的桥梁: 为什么最小化 \(\int \|\sigma^{(4)}\|^2 dt\) (snap) 等价于最小化电机指令变化率
- 在工程层面对比 PX4 级联 PID、Lee 几何控制器、DFBC 三种方案的结构性差异
知识导航¶
本章知识结构:
┌─────────────────────────────────┐
│ 四旋翼 Newton-Euler 动力学 │
│ (§1: 体坐标系建模) │
└───────────┬─────────────────────┘
│
┌──────────────┴──────────────────┐
▼ ▼
┌───────────────────┐ ┌────────────────────────┐
│ 微分平坦性证明 │ │ SE(3) 几何跟踪控制 │
│ (§2) │ │ (§3) │
│ │ │ │
│ σ=(x,y,z,ψ) │ │ 姿态误差 Ψ(R,Rd) │
│ → 全状态+控制 │ │ Lyapunov 稳定性证明 │
└────────┬───────────┘ └─────────┬──────────────┘
│ │
▼ ▼
┌──────────────────────┐ ┌───────────────────────────┐
│ 轨迹生成桥梁(§4) │ │ 拓扑障碍与全局性(§3.5) │
│ min-snap ↔ 电机平滑 │ │ Bhat-Bernstein 定理 │
└──────────┬───────────┘ └───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 工程实现与对比(§5) │
│ PX4 PID / Lee 几何 / DFBC │
│ 开源代码精读 │
└──────────────────────────────────────────┘
知识点之间的关系: §1 (动力学) 是 §2 (微分平坦) 和 §3 (几何控制) 的共同基础——没有精确的动力学方程, 后两者无从展开。§2 和 §3 是并列的两大支柱, 分别解决"参考量生成"和"误差修正"。§4 (轨迹生成) 是 §2 的直接应用, 将微分平坦性转化为可计算的优化问题。§5 (工程实现) 是所有理论的工程落地, 把公式变成可飞的代码。
阅读路径建议: - 理论优先路径 (数学背景强): §1 → §2 → §3 → §4 → §5 - 工程优先路径 (想先跑起来): §5 → §1 → §2(只看结论) → §3(只看控制律) → §4 - 查阅路径 (已有基础, 查缺补漏): 直接跳到感兴趣的节
前置知识桥接¶
回顾李群 SO(3)/SE(3) 章: 旋转矩阵 \(R \in SO(3)\) 是一个 \(3 \times 3\) 正交矩阵, 满足 \(R^T R = I\) 且 \(\det R = 1\), 它将体坐标系中的向量映射到惯性坐标系。在那一章我们学习了 hat/vee 映射 (\(\hat{\cdot}: \mathbb{R}^3 \to \mathfrak{so}(3)\), 将向量映射为反对称矩阵), 以及指数映射 \(\exp: \mathfrak{so}(3) \to SO(3)\) (Rodrigues 公式)。本章将大量使用这些工具——特别是 hat 映射在旋转运动学 \(\dot{R} = R\hat{\Omega}\) 中的核心角色, 以及 vee 映射在姿态误差向量 \(e_R = \frac{1}{2}(R_d^T R - R^T R_d)^\vee\) 中的关键作用。
回顾 Lyapunov 稳定性理论章: Lyapunov 直接法的核心是构造一个"能量函数" \(V\) 使得 \(\dot{V} < 0\)。在那里我们处理的是欧氏空间 \(\mathbb{R}^n\) 中的系统。本章的挑战在于, 姿态空间是 \(SO(3)\)——一个弯曲的流形 (Manifold), 不是平坦的欧氏空间。因此 Lyapunov 函数的构造需要使用流形上的"距离"(迹函数 \(\Psi\)), 而不是简单的二次范数。但分析的逻辑框架完全相同: 找正定 \(V\), 证 \(\dot{V}\) 负定。
如果跳过本章会怎样¶
- 场景一: 你把 GCOPTER 的 flatness.hpp 当黑盒使用。 不理解平坦映射的数学, 你无法判断"为什么在自由落体段代码输出 NaN"或"为什么 7 阶多项式而不是 5 阶"。遇到 bug 只能盲猜, 效率极低。
- 场景二: 你给 PX4 调 PID 增益, 但不知道为什么大角度时性能崩溃。 不理解欧拉角奇异性和拓扑障碍, 你会在 \(\theta = 90°\) 附近反复撞墙, 怀疑是硬件问题。
预计阅读时间¶
| 阅读方式 | 时间 | 适合谁 |
|---|---|---|
| 精读 (含手推与练习) | 10-14 小时 | 第一次系统学无人机控制 |
| 速读 (跳过推导细节, 看结论与直觉) | 3-4 小时 | 有控制理论基础, 想快速上手 |
| 速查 (只看公式块、表格、速查卡) | 30 分钟 | 实现时回来确认某个符号/条件 |
§1 四旋翼 Newton-Euler 动力学建模 ⭐⭐¶
这一节解决什么问题: 从第一性原理出发, 写出四旋翼完整的 12 维动力学方程, 为后续的微分平坦性证明和控制器设计提供数学基础。
§1.1 动机: 为什么需要精确的动力学模型?¶
类比 1: 动力学模型之于控制器, 犹如地图之于导航。 没有精确的地图, GPS 导航无法工作; 没有精确的动力学模型, 前馈控制 (Feedforward Control) 无法工作。一个粗糙的模型 (比如忽略陀螺力矩) 就像一张缺少山脉的地图——在平坦地区 (小角度悬停) 还能凑合用, 一旦进入复杂地形 (大角度机动) 就会完全迷路。类比边界: 地图是静态的, 而动力学模型的"地形"会随状态变化——比如陀螺力矩的大小取决于当前角速度, 这使得"地图"本身是动态的, 不是固定的。
那么, 为什么不能用一个简化模型凑合? 比如, 假设四旋翼总是近似水平, 把旋转-平移耦合线性化? 答案是: 在悬停和缓慢飞行时确实可以, PX4 的级联 PID 正是基于这种小角度近似。但一旦四旋翼执行激进机动——穿越窗户、做翻滚、高速转弯——小角度近似彻底失效, 你需要精确的非线性模型来计算前馈项, 否则反馈控制器必须独自承担全部补偿, 这会急剧降低跟踪性能和稳定裕度 (Stability Margin)。
四旋翼虽然只是一个刚体, 但其动力学有两个非平凡特征:
- 欠驱动性 (Underactuation): 4 个电机产生 4 个独立控制输入 (1 个总推力 + 3 个力矩), 但要控制 6 个自由度 (3 平移 + 3 旋转)。位置控制必须通过改变姿态来实现——这是微分平坦性的物理根源。
- 旋转-平移耦合 (Rotation-Translation Coupling): 推力方向固定在机体坐标系的 \(z_B\) 轴上, 平移加速度方向由姿态决定。这种耦合使得动力学方程天然是非线性的。
阶段小结: 精确的动力学模型是一切控制设计的起点。四旋翼的核心特征是欠驱动 + 旋转-平移耦合, 这两个特征决定了后续微分平坦性和几何控制的数学形态。接下来, 我们先定义坐标系, 再逐步推导力、力矩和运动方程。
§1.2 坐标系定义 ⭐¶
我们定义两个坐标系:
惯性坐标系 (World Frame, Inertial Frame) \(\{W\}\): - 原点: 地面上某固定点 - \(e_1 = [1,0,0]^T\): 指向北 (或任意固定方向) - \(e_2 = [0,1,0]^T\): 指向东 (右手定则) - \(e_3 = [0,0,1]^T\): 指向上 (NWU 约定, 与重力方向相反)
体坐标系 (Body Frame) \(\{B\}\): - 原点: 四旋翼质心 (Center of Mass) - \(x_B\): 指向四旋翼前方 (机头方向) - \(y_B\): 指向四旋翼左方 - \(z_B\): 指向四旋翼上方 (螺旋桨推力方向)
两个坐标系之间的关系由旋转矩阵 \(R \in SO(3)\) 描述:
其中 \(v_B\) 是体坐标系中的向量, \(v_W\) 是惯性坐标系中的同一向量。\(R\) 的列向量 \([x_B, y_B, z_B]\) 就是体坐标系三个轴在惯性坐标系中的表示。
反事实 1: "如果我们用 \(e_3\) 指向下 (NED 约定) 会怎样?" 所有方程中重力项的符号会反转, 推力变为负值方向。PX4 内部使用 NED (North-East-Down), 而学术文献 (Lee 2010, Mellinger 2011) 普遍使用 NWU (North-West-Up)。坐标系约定不影响物理, 但**混用约定是实际工程中最常见的 bug 来源之一**——后果是推力方向反转, 飞机起飞后立即翻转坠毁。本文统一采用 NWU。
§1.3 力和力矩分析 ⭐⭐¶
四旋翼的四个电机 以转速 \(\omega_1, \omega_2, \omega_3, \omega_4\) 旋转, 每个电机产生: - 推力 (沿 \(z_B\) 方向): \(f_i = k_f \omega_i^2\), 其中 \(k_f\) 是推力系数 (Thrust Coefficient) - 反扭力矩 (绕 \(z_B\) 方向): \(\tau_i = k_m \omega_i^2\), 其中 \(k_m\) 是力矩系数 (Moment Coefficient)
这里 \(k_f\) 和 \(k_m\) 由螺旋桨的气动特性决定, 可通过拉力台实验标定 (Calibration)。推力与转速平方成正比, 这来自叶素动量理论 (Blade Element Momentum Theory) 的简化——在低雷诺数 (Reynolds Number) 下, 升力系数近似为常数, 因此升力正比于动压 (\(\propto \omega^2\)) 乘以桨盘面积。
总推力 (标量, 沿 \(z_B\) 方向):
总力矩 (3D 向量, 体坐标系): 对于标准的 "X" 构型 (电机编号: 前右 1, 后左 2, 前左 3, 后右 4; 臂长 \(L\)):
将上述关系写成矩阵形式:
分配矩阵 \(A\) 是可逆的 (只要 \(k_f, k_m, L > 0\)), 因此给定期望的 \((f, M)\), 可以唯一地解出四个电机的转速平方。这个可逆性非常重要: 它意味着 \((f, M)\) 是四旋翼真正的"独立控制输入", 后续的微分平坦分析和控制器设计都以 \((f, M)\) 为输入, 将电机分配视为最后一步的"执行器映射 (Actuator Mapping)"。
阶段小结: 四旋翼通过四个电机的转速差产生一个标量推力 \(f\) 和一个三维力矩 \(M\), 两者通过可逆的分配矩阵 \(A\) 与电机转速关联。下一步, 我们用 Newton 第二定律和 Euler 方程分别写出平移和旋转的运动方程。
§1.4 平移动力学 ⭐⭐¶
在惯性坐标系中, 四旋翼质心的运动由 Newton 第二定律决定:
其中: - \(x = [x_1, x_2, x_3]^T \in \mathbb{R}^3\) 是质心在惯性坐标系中的位置 - \(f_{\text{gravity}} = -mg e_3\) 是重力 (NWU 约定下指向 \(-e_3\)) - \(f_{\text{thrust}} = f R e_3\) 是推力 (大小为 \(f\), 方向沿体坐标系 \(z_B\) 轴, 即 \(Re_3\))
因此:
为什么推力方向是 \(Re_3\)? \(e_3 = [0,0,1]^T\) 是体坐标系中 \(z_B\) 轴的表示。\(R\) 将体坐标系向量变换到惯性坐标系, 所以 \(Re_3\) 就是 \(z_B\) 轴在惯性坐标系中的方向。当四旋翼水平时 \(R = I\), \(Re_3 = e_3\) (推力向上); 当四旋翼倾斜时, \(Re_3\) 偏离竖直方向, 推力产生水平分量。
本质洞察 1: 欠驱动的几何含义。 四旋翼只能产生沿 \(z_B\) 方向的推力。要向前飞, 必须先倾斜机体使 \(z_B\) 有水平分量——即改变姿态 \(R\)。这就是为什么位置控制本质上是姿态控制: 你不能在不改变姿态的情况下改变水平加速度。这一约束正是微分平坦性的物理根源, 也是四旋翼区别于全驱动飞行器 (如倾转旋翼, Tilted Rotor) 的核心特征。
§1.5 旋转动力学 ⭐⭐¶
旋转动力学在体坐标系中由 Euler 方程描述。设 \(\Omega = [p, q, r]^T\) 是体坐标系中的角速度 (Angular Velocity) 向量, \(J\) 是绕质心的惯性张量 (Inertia Tensor)。
旋转运动学 (旋转矩阵的时间导数):
这个方程的含义是: 旋转矩阵的变化率等于旋转矩阵本身乘以角速度的 hat 映射。为什么是右乘 \(\hat{\Omega}\) 而不是左乘? 因为 \(\Omega\) 定义在体坐标系中。如果角速度定义在惯性坐标系中 (记作 \(\omega_W\)), 则 \(\dot{R} = \hat{\omega}_W R\)。两者的关系是 \(\omega_W = R \Omega\)。
回顾李群章: \(\dot{R} = R \hat{\Omega}\) 这个方程正是我们在李群章学过的"左不变向量场 (Left-Invariant Vector Field)"的体现。\(\hat{\Omega} \in \mathfrak{so}(3)\) 是李代数中的元素, 代表"瞬时旋转速度"; \(R\hat{\Omega}\) 是这个瞬时速度在群元素 \(R\) 处的"左平移 (Left Translation)"。这里的 \(R\) 不只是一个矩阵, 它是李群 \(SO(3)\) 上的一个点, \(\hat{\Omega}\) 是它的切向量。
旋转动力学 (Euler 方程):
逐项解释: - \(J \dot{\Omega}\): 角动量在体坐标系中的变化率 (如果体坐标系不旋转的话) - \(-\Omega \times J\Omega\): 陀螺力矩补偿项 (Coriolis/Gyroscopic Term), 源于我们在旋转的体坐标系中描述角动量变化 - \(M\): 外加力矩 (来自电机差速产生的力矩)
类比 2: 陀螺力矩与旋转木马。 想象你坐在旋转的木马上往外扔球。从地面 (惯性系) 观察, 球走直线; 但从木马 (转动系) 上看, 球走弧线——这个"虚假的"弧线就是科里奥利效应 (Coriolis Effect)。\(\Omega \times J\Omega\) 正是角动量版本的科里奥利效应: 在体坐标系中, 即使没有外力矩, 角速度方向也会因为惯性张量的各向异性而发生变化。类比边界: 旋转木马上的科里奥利力是线速度的效应 (\(2m\omega \times v\)), 而陀螺力矩是角速度的效应 (\(\Omega \times J\Omega\)); 前者对应平移动力学, 后者对应旋转动力学, 数学形式类似但物理实体不同。
陀螺力矩的展开形式 (假设 \(J = \text{diag}(J_{xx}, J_{yy}, J_{zz})\)):
对于对称四旋翼, \(J_{xx} \approx J_{yy}\), 因此绕 \(z_B\) 轴的陀螺力矩 \((J_{xx} - J_{yy})pq \approx 0\)。但绕 \(x_B\) 和 \(y_B\) 轴的陀螺力矩在高速飞行时不可忽略。
§1.6 完整动力学方程组 ⭐⭐¶
汇总以上推导, 四旋翼的完整 Newton-Euler 动力学方程组为:
状态空间: 系统状态是 \((x, v, R, \Omega) \in \mathbb{R}^3 \times \mathbb{R}^3 \times SO(3) \times \mathbb{R}^3\), 共 12 个自由度 (注意 \(R \in SO(3)\) 虽然用 9 个元素的矩阵表示, 但只有 3 个自由度, 受 \(R^T R = I, \det R = 1\) 六个约束)。
控制输入: \((f, M) \in \mathbb{R} \times \mathbb{R}^3\), 共 4 个自由度。
欠驱动度: 12 维状态, 4 维控制——但通过动力学耦合, 仍然可以控制 4 个输出, 这正是微分平坦性所保证的。
反事实 2: "如果四旋翼有 6 个独立控制输入会怎样?" 全驱动飞行器 (如六旋翼倾转构型) 可以独立控制位置和姿态, 不需要通过倾斜来产生水平力。这种情况下微分平坦性分析会更简单 (全状态直接可控), 但工程上付出的代价是更多电机、更大重量和更高功耗。四旋翼之所以流行, 正是因为 4 个电机就够用了——微分平坦性在数学上保证了这一点。
§1.7 关于气动阻力的说明 ⭐¶
上述模型忽略了空气阻力 (Aerodynamic Drag)。在低速飞行 (< 5 m/s) 时这是合理的近似。Faessler, Franchi, Scaramuzza (RA-L 2018) 证明了加入线性旋翼阻力模型 (Linear Rotor Drag Model):
后, 带阻力的系统仍然是微分平坦的, 但平坦映射变得更复杂 (加速度到推力方向的关系变为隐式方程)。我们在 §2 先证明无阻力情况的微分平坦性, 在 §5.4 讨论带阻力的推广。
§1.8 常见陷阱¶
陷阱 1: 坐标系约定混乱 - 错误描述: 控制器假设 NWU 但飞控用 NED, 或反之 - 现象/后果: 推力方向反转, 飞机起飞后立即翻转坠毁 - 根本原因: NWU 和 NED 中 \(e_3\) 方向相反, 重力项符号不同 - 正确做法: 悬停时检查 \(f R e_3 = mg e_3\) 是否成立; 在代码中显式标注坐标系约定
陷阱 2: 惯性张量的坐标系和参考点 - 错误描述: 使用 CAD 软件导出的惯性张量, 但参考点是几何中心而非质心 - 现象/后果: 前馈力矩计算偏差, 高速机动时姿态跟踪误差增大 - 根本原因: Euler 方程要求 \(J\) 关于质心定义; 如果参考点偏移, 需要平行轴定理 (Parallel Axis Theorem) 修正 - 正确做法: 确认 \(J\) 是关于质心的; 用双线摆实验 (Bifilar Pendulum) 直接测量
陷阱 3: 角速度约定混淆 - 错误描述: 将惯性坐标系角速度 \(\omega_W\) 与体坐标系角速度 \(\Omega\) 混用 - 现象/后果: Euler 方程形式错误, 陀螺力矩补偿方向反转 - 根本原因: IMU 陀螺仪直接输出体坐标系角速度 \(\Omega\), 但某些教材使用 \(\omega_W = R\Omega\) - 正确做法: 统一使用体坐标系角速度 \(\Omega\); 确认 \(\dot{R} = R\hat{\Omega}\) (右乘) 而非 \(\dot{R} = \hat{\omega}_W R\) (左乘)
§1.9 练习¶
[练习 1.1] 悬停平衡点 ⭐ 求四旋翼的悬停平衡点 (所有导数为零)。验证此时 \(R = I\) (水平), \(f = mg\), \(M = 0\), \(\Omega = 0\)。
[练习 1.2] 陀螺力矩量级估计 ⭐⭐ 一个质量 1.5 kg、臂长 0.25 m 的四旋翼, 惯性张量 \(J = \text{diag}(0.03, 0.03, 0.05)\) kg\(\cdot\)m\(^2\)。以 \(p = 2\) rad/s, \(q = 3\) rad/s, \(r = 1\) rad/s 旋转。计算陀螺力矩 \(\Omega \times J\Omega\) 的各分量, 与典型电机力矩 (\(\sim 0.1\) N\(\cdot\)m) 比较, 讨论是否可以忽略。(在草稿纸上完成)
[练习 1.3, 开放题] 六旋翼的控制分配 ⭐⭐⭐ 如果将四旋翼扩展为六旋翼 (hexarotor), 分配矩阵 \(A\) 变为 \(4 \times 6\) (四个输出, 六个电机)。此时 \(A\) 不再是方阵, 无法直接求逆。 (a) 解释为什么六旋翼是"冗余驱动 (Redundant Actuation)" 的。 (b) 如何利用冗余性? (提示: 伪逆 \(A^\dagger\) 给出最小范数解, 等效于最小化电机总功耗。) (c) 当一个电机失效时, 六旋翼能否继续可控? 这和微分平坦性有什么关系?
上一节建立了四旋翼的精确动力学方程。我们知道了系统有 12 个状态变量、4 个控制输入, 看到了旋转-平移的强耦合。但一个关键问题悬而未决: 如何在这个高维、非线性的状态空间中规划可行的轨迹? 直接在 12 维中搜索满足动力学约束的轨迹, 计算上几乎不可行。微分平坦性正是解开这个困局的钥匙。
§2 微分平坦性: 完整证明 ⭐⭐⭐¶
这一节解决什么问题: 证明四旋翼系统的微分平坦性——即从 4 维平坦输出 \(\sigma = (x, y, z, \psi)\) 及其导数, 可以通过纯代数运算恢复全部 12 维状态和 4 维控制输入。这将 12 维的约束轨迹规划问题降为 4 维的无约束曲线设计问题。
§2.1 动机: 为什么需要微分平坦性?¶
类比 3: 微分平坦性之于轨迹规划, 犹如万能钥匙之于锁。 没有微分平坦性, 轨迹规划必须在 12 维状态空间中求解, 同时满足复杂的非线性动力学约束——这就像不用钥匙、硬撬开一把精密锁。微分平坦性提供了一把"万能钥匙": 只需在 4 维空间 \((x, y, z, \psi)\) 中规划一条光滑曲线, 全部状态和控制输入通过代数关系自动恢复。12 维的约束优化问题瞬间变成了 4 维的无约束优化问题。类比边界: 钥匙是一次性的——打开锁就完事; 微分平坦性是持续性的——轨迹上每个时刻都在做代数映射。此外, 这把"钥匙"在某些极端条件下 (自由落体、极端俯仰) 会失效, 这是类比未覆盖的。
反面: 如果没有微分平坦性, 你只有两条路可走。第一条路是在 12 维空间中用数值方法搜索满足动力学约束的轨迹——计算量随维度指数增长, 实时性无从保证。第二条路是用小角度线性化把问题近似为线性——但这等于放弃大角度机动能力, 回到 PID 的老路。微分平坦性的价值在于: 它给出了一条既精确 (不做线性化近似) 又高效 (只需 4 维优化) 的第三条路。
历史: 微分平坦性 (Differential Flatness) 的概念最早由 Fliess, Levine, Martin, Rouchon 在 1990 年代提出, 来自微分代数 (Differential Algebra) 的理论框架。它远早于四旋翼的流行。Mellinger & Kumar 在 ICRA 2011 (获得最佳论文奖) 首次将其系统性地应用于四旋翼, 并推导出完整的平坦映射链——从平坦输出的四阶导数 (snap) 到电机转速。这篇论文的核心贡献不是发现新的数学, 而是发现四旋翼的物理结构恰好满足微分平坦性的条件, 并把抽象的数学转化为可计算的工程工具。
§2.2 微分平坦性的形式定义 ⭐⭐¶
定义: 一个控制系统 \(\dot{X} = f(X, u)\) (状态 \(X\), 控制 \(u\)) 被称为**微分平坦的** (Differentially Flat), 如果存在输出 \(\sigma\) (称为**平坦输出**, Flat Outputs), 使得:
- \(\sigma\) 可以表示为状态和控制输入及其有限阶导数的函数: \(\sigma = \sigma(X, u, \dot{u}, \ldots, u^{(k)})\)
- 状态 \(X\) 可以表示为 \(\sigma\) 及其有限阶导数的函数: \(X = X(\sigma, \dot{\sigma}, \ldots, \sigma^{(q)})\)
- 控制 \(u\) 可以表示为 \(\sigma\) 及其有限阶导数的函数: \(u = u(\sigma, \dot{\sigma}, \ldots, \sigma^{(q)})\)
- \(\sigma\) 的各分量是**微分独立**的 (不满足任何微分方程约束)
条件 4 意味着 \(\sigma\) 的维数等于控制输入的维数。对于四旋翼, 4 个控制输入 \((f, M_x, M_y, M_z)\) 对应 4 个平坦输出。条件 4 的直觉是: 平坦输出的各分量可以被"任意指定", 这正是"无约束优化"的数学基础。
与可控性 (Controllability) 的关系: 微分平坦性比可控性更强。可控性 (Kalman 意义) 只保证"系统可以从任意状态转移到任意状态" (定性的, 只说能做到, 不说怎么做)。微分平坦性还给出了**构造性**的映射: 给定 \(\sigma(t)\), 代数运算直接给出 \(u(t)\)。并非所有可控系统都是微分平坦的——例如带非完整约束 (Nonholonomic Constraint) 的系统 (如汽车的侧滑约束) 可能可控但不平坦。
§2.3 平坦输出的选择 ⭐⭐¶
定理 2.1 (Mellinger & Kumar, ICRA 2011): 四旋翼系统 (§1.6 方程组) 的平坦输出为:
即惯性坐标系中的三维位置和偏航角 (Yaw Angle)。
为什么是 \((x, y, z, \psi)\) 而不是 \((x, y, z, \phi)\) (滚转) 或 \((x, y, z, \theta)\) (俯仰)? 原因在于推力方向的几何约束。四旋翼的推力方向 \(z_B\) 由加速度唯一确定 (如下所述), 但 \(z_B\) 只约束了旋转矩阵的一列。要完全确定 \(R \in SO(3)\) (3 个自由度), 还需要一个额外的标量——绕推力方向的旋转自由度。偏航角 \(\psi\) 正是描述这个自由度的自然选择: 它是推力方向固定后, 机体绕 \(z_B\) 轴旋转的角度。
反事实 3: "如果我们选 \((x, y, z, \phi)\) 作为平坦输出会怎样?" 滚转角 \(\phi\) 不是独立的——给定位置的二阶导数 (加速度), \(\phi\) 已经被部分约束了。选择 \(\phi\) 作为平坦输出会违反"微分独立"条件 (定义中的条件 4)。物理上, 你不能同时任意指定"飞到哪里"和"以什么滚转角到达", 因为加速度方向决定了推力方向, 而推力方向与滚转角直接耦合。偏航角 \(\psi\) 之所以自由, 是因为它是绕推力方向的旋转, 不影响推力方向, 因此不与位置约束冲突。
§2.4 平坦映射: 从 \(\sigma\) 及其导数恢复全状态和控制 ⭐⭐⭐¶
以下是微分平坦性的核心: 我们将逐步展示如何从 \(\sigma(t)\) 及其导数通过纯代数运算恢复所有 12 个状态变量和 4 个控制输入。每一步都解释**为什么**这样做。
步骤 1: 位置和速度 (0 阶和 1 阶导数)¶
这一步是平凡的: 平坦输出的前三个分量就是位置, 它们的时间导数就是速度。已恢复 6 个状态变量 (3 位置 + 3 速度)。
步骤 2: 加速度和推力方向 (2 阶导数 → 推力 + 姿态)¶
由平移动力学 \(m\ddot{x} = -mge_3 + fRe_3\), 我们有:
定义**推力向量 (Thrust Vector)**:
这个向量的方向就是体坐标系 \(z_B\) 轴在惯性坐标系中的方向, 大小与总推力成正比。这一步的逻辑是: 平移动力学只有两个力 (重力和推力), 合力等于质量乘加速度; 已知加速度和重力, 推力就被唯一确定了。
总推力 (标量):
体坐标系 \(z_B\) 轴 (单位向量):
关键条件: 上述公式要求 \(\|t\| = \|\ddot{x} + ge_3\| \neq 0\), 即推力不能为零。物理上, \(\|t\| = 0\) 意味着四旋翼处于自由落体 (Free Fall) 状态 (加速度恰好等于 \(-ge_3\)), 此时推力方向未定义。这是平坦映射的一个**奇异点 (Singular Point)**, 在正常飞行中不会出现, 但在极端机动 (如倒飞下坠) 中需要特殊处理。
步骤 3: 由偏航角 \(\psi\) 确定完整旋转矩阵¶
\(z_B\) 已经确定了旋转矩阵的第三列, 但旋转矩阵还有另外两列 (\(x_B\) 和 \(y_B\)) 需要确定。为什么一个向量不够确定旋转矩阵? 因为 \(R \in SO(3)\) 有 3 个自由度, \(z_B\) (一个单位向量, 2 个自由度) 只约束了其中 2 个, 还剩 1 个自由度——绕 \(z_B\) 的旋转。偏航角 \(\psi = \sigma_4\) 正是用来填补这最后一个自由度的。
定义偏航参考方向 (在惯性坐标系水平面内):
利用叉积和归一化, 构建完整的正交标架 (Orthonormal Frame):
为什么是 \(y_B = (z_B \times x_C) / \|z_B \times x_C\|\) 而不是直接取 \(x_B\)? 由于 \(z_B\) 已经由加速度确定, 我们需要在与 \(z_B\) 垂直的平面内选择 \(x_B\) 方向。偏航角 \(\psi\) 给出了一个参考方向 \(x_C\), 但 \(x_C\) 不一定垂直于 \(z_B\) (当四旋翼倾斜时)。通过 Gram-Schmidt 正交化:
- \(z_B \times x_C\) 给出同时垂直于 \(z_B\) 和 \(x_C\) 的方向, 归一化得到 \(y_B\)
- \(y_B \times z_B\) 给出同时垂直于 \(y_B\) 和 \(z_B\) 的方向, 即 \(x_B\)
这样 \(\{x_B, y_B, z_B\}\) 构成右手正交标架, 满足 \(R \in SO(3)\)。到此, 旋转矩阵 \(R\) 已完全确定——12 个状态变量中已恢复 9 个 (3 位置 + 3 速度 + 3 旋转自由度)。
奇异性警告: 当 \(z_B \parallel x_C\) 时, \(\|z_B \times x_C\| = 0\), 映射奇异。物理上这对应于俯仰角接近 \(\pm 90°\) 的极端姿态。正常飞行中不会触发。
阶段小结: 到步骤 3 为止, 我们从 \(\sigma\) 的 0-2 阶导数恢复了位置、速度、推力和旋转矩阵。接下来需要 3 阶导数 (jerk) 恢复角速度, 4 阶导数 (snap) 恢复力矩。
步骤 4: 角速度 (3 阶导数 → 角速度) ⭐⭐⭐¶
已知 \(R(t)\) 后, 由旋转运动学 \(\dot{R} = R\hat{\Omega}\), 可得:
但要计算 \(\dot{R}\), 需要 \(\dot{z}_B, \dot{x}_B, \dot{y}_B\), 而这些涉及 \(\sigma\) 的三阶导数 (jerk)。
推力向量 \(t = \ddot{x} + ge_3\) 的时间导数:
\(z_B\) 的时间导数 (使用单位向量求导公式 \(\dot{n} = (\dot{v} - (\dot{v} \cdot n)n)/\|v\|\), 其中 \(n = v/\|v\|\)):
为什么是这个公式? 对 \(z_B = t / \|t\|\) 求时间导数, 用商法则: \(\dot{z}_B = (\dot{t}\|t\| - t\dot{\|t\|})/\|t\|^2\)。其中 \(\dot{\|t\|} = (t \cdot \dot{t})/\|t\| = z_B \cdot \dot{t}\)。代入化简即得上式。直觉: \(\dot{t}\) 中平行于 \(z_B\) 的分量只改变推力大小 (不改变方向), 垂直分量才改变方向, 所以减去平行分量 \((\dot{t} \cdot z_B) z_B\)。
从 \(\dot{R} = R\hat{\Omega}\), 写出各列的导数: - \(\dot{z}_B = q \, x_B - p \, y_B\) - \(\dot{y}_B = -r \, x_B + p \, z_B\) - \(\dot{x}_B = r \, y_B - q \, z_B\)
从第一个方程: \(\dot{z}_B \cdot x_B = q\), \(\dot{z}_B \cdot y_B = -p\)。从第二个方程: \(\dot{y}_B \cdot x_B = -r\)。
因此, 体坐标系角速度的各分量为:
其中 \(\dot{z}_B\) 包含 jerk (\(\dddot{\sigma}\)), \(\dot{y}_B\) 包含 jerk 和 \(\dot{\psi}\)。因此, 角速度 \(\Omega\) 是 \(\sigma\) 的**三阶导数**的代数函数。至此, 12 个状态变量全部恢复。
步骤 5: 力矩和角加速度 (4 阶导数 → 控制力矩) ⭐⭐⭐¶
由 Euler 方程 \(J\dot{\Omega} = -\Omega \times J\Omega + M\), 可得:
要计算 \(\dot{\Omega}\), 需要对步骤 4 中的 \(\Omega\) 表达式求时间导数, 这涉及 \(\ddot{z}_B\) 和 \(\ddot{y}_B\), 而这些包含 \(\sigma\) 的**四阶导数** (snap, \(\sigma^{(4)}\))。
\(z_B\) 的二阶导数需要 \(\ddot{t} = \sigma^{(4)}_{1,2,3}\) (位置的四阶导数, 即 snap)。虽然表达式较长, 但每一项都是 \(\sigma\) 及其导数到四阶的代数函数。关键观察: \(\ddot{t}\) 包含 \(\sigma^{(4)}\), 这就是为什么力矩 \(M\) 需要 snap。
角加速度分量从 \(p = -\dot{z}_B \cdot y_B\) 求时间导数:
类似地可得 \(\dot{q}\) 和 \(\dot{r}\)。将它们代入 Euler 方程, \(M = J\dot{\Omega} + \Omega \times J\Omega\) 完成最后 3 个控制输入的恢复 (加上步骤 2 的推力 \(f\), 共 4 个)。
步骤 6: 电机转速 (控制分配)¶
由 \((f, M)\) 通过分配矩阵逆 \(A^{-1}\) 恢复电机转速:
§2.5 平坦映射总结 ⭐⭐¶
将上述六个步骤汇总为一张完整的映射链:
| 导数阶次 | 输入 | 输出 | 恢复的量 |
|---|---|---|---|
| 0 阶 | \(\sigma\) | \(x, \psi\) | 位置, 偏航角 |
| 1 阶 | \(\dot{\sigma}\) | \(v, \dot{\psi}\) | 速度, 偏航角速率 |
| 2 阶 | \(\ddot{\sigma}\) | \(f, z_B, R\) | 推力, 旋转矩阵 |
| 3 阶 | \(\dddot{\sigma}\) | \(\Omega\) | 角速度 |
| 4 阶 | \(\sigma^{(4)}\) | \(\dot{\Omega}, M\) | 角加速度, 力矩 |
微分平坦性的正式表述: 状态 \((x, v, R, \Omega)\) 和控制输入 \((f, M)\) 都可以表示为 \(\sigma\) 及其至多四阶导数的代数函数, 且 \(\sigma = (x_1, x_2, x_3, \psi)\) 的四个分量是微分独立的 (可以任意指定)。
本质洞察 2: 微分平坦性的"代价"是光滑性。 平坦映射需要 \(\sigma\) 的四阶导数存在, 因此轨迹 \(\sigma(t)\) 必须是 \(C^4\) 连续的。这解释了为什么最小 snap (Minimum Snap) 轨迹要最小化 \(\int \|\sigma^{(4)}\|^2 dt\): 它不仅让轨迹足够光滑 (保证映射存在), 还让四阶导数尽量小 (让映射出的电机指令尽量平滑)。更高阶的不连续性 (例如加速度阶跃, 即 \(C^2\) 但不 \(C^3\) 的轨迹) 会导致角速度指令出现阶跃, 这在物理上是不可实现的。
§2.6 完整算例: 匀加速飞行的平坦映射 (手算演示) ⭐⭐¶
为了巩固理解, 下面给出一个从头到尾的完整数值算例。
问题设定: 四旋翼质量 \(m = 1.0\) kg, 重力加速度 \(g = 9.81\) m/s\(^2\)。轨迹: 在高度 \(h = 2\) m 处, 沿 \(x\) 方向以 \(a_0 = 3\) m/s\(^2\) 匀加速, 偏航角为零。
各阶导数:
推力向量: \(t = [3, 0, 9.81]\), 大小 \(\|t\| = \sqrt{9 + 96.24} = 10.26\)
总推力: \(f = 1.0 \times 10.26 = 10.26\) N (对比悬停推力 \(mg = 9.81\) N, 增大约 4.6%)
推力方向: \(z_B = [0.292, 0, 0.956]\), 倾斜角 \(\alpha = \arctan(3/9.81) \approx 17.0°\)
旋转矩阵 (偏航 \(\psi = 0\)):
这对应绕 \(y\) 轴旋转 \(17°\) (纯俯仰), 符合物理直觉: 要向前加速, 四旋翼向前倾斜。
角速度和力矩: 由于 \(\dddot{\sigma} = 0\) (常加速度), \(\dot{z}_B = 0\), 因此 \(\Omega = 0\), \(M = 0\)。
总结: 匀加速直线飞行只需恒定推力 \(f = m\sqrt{a_0^2 + g^2} \approx 10.26\) N、恒定姿态 (俯仰 \(17°\))、零角速度、零力矩。如果加速度随时间变化 (如 \(\sigma_1 = \sin(t)\)), jerk 和 snap 不为零, 就会产生非零角速度和力矩——这说明振荡运动比匀加速对电机要求更高。
§2.7 微分平坦性的极限 ⭐⭐⭐¶
微分平坦性是四旋翼的一个"好性质", 但不应被视为理所当然。以下情况会使平坦性失效或变得复杂:
| 情况 | 对平坦性的影响 | 说明 |
|---|---|---|
| 加入线性气动阻力 | 仍平坦, 但映射变为隐式 | Faessler 2018 |
| 高攻角失速 | 可能不平坦 | 气动力成为状态的高度非线性函数 |
| 多体系统 (带机械臂) | 某些构型失去平坦性 | 接触力引入新约束 |
| 执行器饱和 | 映射给出不可行解 (\(\omega_i^2 < 0\)) | 轨迹本身不可行 |
阶段小结: 微分平坦性将 12 维的轨迹规划降为 4 维, 代价是要求轨迹 \(C^4\) 连续。完整映射链需要位置的 0-4 阶导数和偏航角的 0-2 阶导数。接下来的两节分别解决两个后续问题: §3 解决"实际状态偏离期望时如何修正" (几何控制), §4 解决"如何设计光滑的 \(\sigma(t)\)" (最小 snap 轨迹)。
§2.8 常见陷阱¶
陷阱 4: 将 \(\psi\) 与 \(\arctan(R_{21}/R_{11})\) 混淆 - 错误描述: 用旋转矩阵反推偏航角, 然后用反推结果做控制 - 现象/后果: 大倾斜角下, \(\arctan(R_{21}/R_{11})\) 的值与输入的 \(\psi\) 不一致 - 根本原因: 平坦映射中 \(\psi\) 是输入, \(R\) 是输出; 不能反过来用 \(R\) 定义 \(\psi\) - 正确做法: 始终从 \(\sigma_4 = \psi\) 出发, 通过叉积构建 \(R\)
陷阱 5: 忽略奇异条件 \(\|t\| = 0\) - 错误描述: 轨迹优化中未排除自由落体段 (\(\ddot{x} = -ge_3\)) - 现象/后果: 平坦映射输出 NaN (除零错误) - 根本原因: \(z_B = t/\|t\|\) 在 \(\|t\| = 0\) 处未定义 - 正确做法: 代码中加入 \(\|t\| > \epsilon\) 检查; GCOPTER 的
flatness.hpp使用 \(\epsilon = 10^{-6}\)陷阱 6: 低阶多项式轨迹 - 错误描述: 用 5 阶多项式 (而非 7 阶) 参数化每段轨迹 - 现象/后果: 只能保证 \(C^2\) 连续, jerk 在路点处不连续, 角速度指令跳变 - 根本原因: 平坦映射需要 \(C^3\) 连续 (角速度来自 jerk), 而 5 阶多项式只保证 \(C^2\) - 正确做法: 使用 7 阶多项式 (保证 \(C^3\) 连续) 或更高阶
§2.9 练习¶
[练习 2.1] 悬停的平坦映射 ⭐ 取 \(\sigma(t) = [0, 0, h, 0]\)。代入平坦映射公式, 验证 \(R = I\), \(\Omega = 0\), \(f = mg\), \(M = 0\)。(在草稿纸上完成)
[练习 2.2] 圆形轨迹的平坦映射 ⭐⭐ 取 \(\sigma(t) = [r\cos\omega t, r\sin\omega t, h, \omega t]\) (水平圆形轨迹, 偏航始终指向运动方向)。 (a) 计算 \(\ddot{\sigma}\), \(\dddot{\sigma}\), \(\sigma^{(4)}\)。 (b) 计算推力 \(f\)。它恒定吗? (c) 计算 \(z_B\) 方向。四旋翼向内倾斜多少度?
[练习 2.3, 开放题] 平坦性的极限 ⭐⭐⭐ Faessler 2018 加入线性阻力 \(f_{\text{drag}} = -DR^Tv\) 后, 证明系统仍是微分平坦的, 但映射变为隐式。试解释: 为什么加入阻力后 \(z_B\) 不再仅由 \(\ddot{x} + ge_3\) 决定? (提示: 阻力与速度 \(v\) 有关, 而 \(v\) 的方向在体坐标系中会改变推力方向的计算。)
上一节证明了微分平坦性, 解决了"如何从一条 4 维曲线生成完整的参考量"。但实际飞行中存在模型误差、外部扰动、传感器噪声和执行器延迟, 实际状态必然偏离期望轨迹。我们需要一个反馈控制器来修正这个偏差——但在哪个空间定义"偏差"? 用什么"距离"衡量姿态误差? 这正是 SE(3) 几何控制要回答的问题。
§3 SE(3) 几何跟踪控制 ⭐⭐⭐¶
这一节解决什么问题: 设计一个直接在旋转群 SO(3) 上定义姿态误差的反馈控制器, 避免欧拉角的奇异性和四元数的双覆盖问题, 实现几乎全局渐近稳定的轨迹跟踪。
§3.1 动机: 为什么需要几何控制?¶
微分平坦性解决了**参考量生成**的问题: 给定轨迹 \(\sigma_d(t)\), 我们可以计算出期望的状态 \((x_d, v_d, R_d, \Omega_d)\) 和控制输入 \((f_d, M_d)\)。但实际飞行中必然存在偏差。最简单的想法是将姿态误差用欧拉角表示, 然后做 PID。但这会遇到一个根本性的数学障碍。
§3.2 反面教材: 欧拉角 PID 为什么会失败 ⭐⭐¶
场景: 四旋翼当前俯仰角 \(\theta = 89°\), 期望俯仰角 \(\theta_d = 91°\)。用欧拉角 PID:
看起来没问题。但如果传感器噪声瞬间读数变为 \(\theta = 90°\):
当 \(\theta = 90°\), \(\cos\theta = 0\), 矩阵 \(T\) 的第三行发散到无穷大。控制器的角速度指令变成无穷大, 电机饱和, 四旋翼失控。
这不是编程 bug, 而是**数学上不可避免**的: 欧拉角是 \(SO(3)\) 的局部坐标 (坐标卡, Coordinate Chart), 任何三参数局部坐标都必须有奇异点。
"用四元数 (Quaternion) 代替欧拉角不就解决了吗?" 四元数确实消除了万向节锁, 但引入了另一个问题: 双覆盖 (Double Cover / Unwinding)。四元数 \(q\) 和 \(-q\) 表示同一个旋转。如果控制器不处理这一点, 可能会让四旋翼绕远路转 360°。PX4 的 Brescianini 四元数控制器专门处理了这一点 (通过选择最短路径的四元数符号), 但这增加了工程复杂性。几何控制器绕过了这两个问题: 直接在旋转矩阵上工作, 不使用任何局部坐标。
§3.3 Bhat-Bernstein 拓扑障碍定理 ⭐⭐⭐¶
在构造几何控制器之前, 我们需要理解一个基本的拓扑约束: 全局渐近稳定在 SO(3) 上是不可能的。
定理 3.1 (Bhat & Bernstein, Systems & Control Letters, 2000): 设 \(M\) 是一个紧致流形 (Compact Manifold)。则 \(M\) 上不存在全局渐近稳定的连续动力系统。
推论: \(SO(3)\) 是紧致的 (有界且闭), 因此不存在连续的姿态反馈控制律使得某个姿态成为全局渐近稳定的平衡点。
直观理解: 想象一个球面 (2-球面, 也是紧致流形)。如果有一个连续的向量场使得所有轨迹都收敛到北极, 则在南极附近的轨迹必须绕过去。但由于紧致性和连续性, 毛球定理 (Hairy Ball Theorem) 告诉我们: 球面上的连续向量场必有零点 (Poincare-Hopf 定理)。这意味着除了目标平衡点外, 还必须存在另一个平衡点 (不稳定的), 阻止了全局渐近稳定性。\(SO(3)\) 是 3 维紧致流形, 类似的拓扑论证成立。
实际意义: 任何基于旋转矩阵、四元数或欧拉角的连续控制律, 最多只能实现**几乎全局渐近稳定 (Almost Globally Asymptotically Stable, AGAS)**: 存在一个零测集 (Measure-Zero Set) 使得从该初始条件出发不收敛。Lee, Leok, McClamroch 2010 的核心贡献是: 构造了一个具体的 SO(3) 上的控制律, 其稳定域是 \(\{\Psi(R, R_d) < 2\}\), 即除了 \(\Psi = 2\) 这一个不稳定平衡点 (对应旋转 \(180°\)) 之外的所有姿态。这是拓扑上最好的结果。
阶段小结: Bhat-Bernstein 定理告诉我们, SO(3) 上不存在完美的全局控制器——总有一个零测集的"盲点"。接下来构造的 Lee 控制器就是在这个拓扑约束下的最优解。
§3.4 姿态误差函数的构造 ⭐⭐⭐¶
定义: Lee-Leok-McClamroch 姿态误差函数:
为什么选择这个函数? 我们需要一个函数满足三个条件: (1) 当 \(R = R_d\) 时为零; (2) 当 \(R \neq R_d\) 时为正 (正定性); (3) 它的导数 \(\dot{\Psi}\) 必须有"好的形式", 能在 Lyapunov 分析中与角速度误差配对。\(\frac{1}{2}\text{tr}(I - R_d^T R)\) 恰好满足这三个条件, 且计算简单 (只需矩阵乘法和求迹)。
性质:
| 旋转角 \(\theta\) | \(\Psi\) | 物理含义 |
|---|---|---|
| 0° | 0 | 完全对齐 |
| 60° | 0.5 | 轻微偏离 |
| 90° | 1.0 | 显著偏离 (Lee 的临界阈值) |
| 120° | 1.5 | 接近倒飞 |
| 180° | 2.0 | 完全反向 (不稳定平衡点) |
\(\Psi\) 与旋转角 \(\theta\) 的关系: 若 \(R_d^T R = \exp(\theta \hat{n})\), 则 \(\text{tr}(R_d^T R) = 1 + 2\cos\theta\), 因此 \(\Psi = 1 - \cos\theta\)。
姿态误差向量 (李代数表示):
这是 \(\Psi\) 的梯度 (在 SO(3) 上的意义)。\(e_R\) 是 \(3 \times 1\) 向量, 因为 \(R_d^T R - R^T R_d\) 是反对称矩阵, vee 映射将其映到 \(\mathbb{R}^3\)。
\(e_R\) 的性质: - \(e_R = 0 \Leftrightarrow R = R_d\) - 当旋转角 \(\theta\) 较小时, \(e_R \approx \theta n\) (旋转轴 \(\times\) 旋转角), 即近似于 SO(3) 的对数映射 \(\text{Log}(R_d^T R)^\vee\) - 精确关系: \(e_R = \sin\theta \cdot n\), 是对数映射的一阶近似 (将 \(\theta\) 替换为 \(\sin\theta\))
§3.5 角速度误差 ⭐⭐¶
为什么不是简单的 \(\Omega - \Omega_d\)? 因为 \(\Omega\) 在当前体坐标系 \(\{B\}\) 中表示, 而 \(\Omega_d\) 在期望体坐标系 \(\{B_d\}\) 中表示, 两者的坐标系不同, 不能直接相减。\(R^T R_d\) 将 \(\Omega_d\) 从 \(\{B_d\}\) 变换到 \(\{B\}\), 使得两个角速度在同一坐标系中比较。这和你不能在不同坐标系中直接相减两个向量是一样的道理。
§3.6 SE(3) 几何跟踪控制律 ⭐⭐⭐¶
定理 3.2 (Lee, Leok, McClamroch, CDC 2010): 考虑四旋翼动力学方程, 定义误差量:
则以下控制律:
使得在初始条件满足 \(\Psi(R(0), R_d(0)) < 1\) 时, 跟踪误差**指数收敛**到零。在 \(\Psi(R(0), R_d(0)) < 2\) 时, 跟踪误差**渐近收敛**到零 (AGAS)。
控制律逐项解释:
推力公式 \(f = (-K_x e_x - K_v e_v + mge_3 + m\ddot{x}_d) \cdot Re_3\): - \(-K_x e_x\): 位置误差的比例反馈 (P) - \(-K_v e_v\): 速度误差的微分反馈 (D) - \(mge_3\): 重力补偿 (前馈) - \(m\ddot{x}_d\): 期望加速度前馈 - \(\cdot Re_3\): 将合力投影到当前推力方向 \(z_B = Re_3\) 上, 因为四旋翼只能沿 \(z_B\) 产生推力
力矩公式 \(M = -K_R e_R - K_\Omega e_\Omega + \Omega \times J\Omega - J(\hat{\Omega} R^T R_d \Omega_d - R^T R_d \dot{\Omega}_d)\): - \(-K_R e_R\): 姿态误差比例反馈 (SO(3) 上的"P"项) - \(-K_\Omega e_\Omega\): 角速度误差微分反馈 (SO(3) 上的"D"项) - \(\Omega \times J\Omega\): 陀螺力矩补偿 (前馈, 抵消 Euler 方程中的陀螺项) - \(-J(\hat{\Omega} R^T R_d \Omega_d - R^T R_d \dot{\Omega}_d)\): 角加速度前馈
本质洞察 3: 几何控制器 = SO(3) 上的 PD + 前馈。 去掉前馈项 \(\Omega \times J\Omega\) 和角加速度前馈, 剩下的就是 SO(3) 上的 PD 控制器。前馈项在高速机动时至关重要: 没有陀螺力矩补偿, 控制器必须用更大的反馈增益来对抗陀螺效应, 降低稳定裕度。PX4 的默认控制器**没有**陀螺力矩补偿 (\(\Omega \times J\Omega\) 项), 这是它在激进机动时性能不如 Lee 控制器的主要原因之一。
§3.7 Lyapunov 稳定性证明 ⭐⭐⭐⭐¶
以下给出 Lee 2010 稳定性证明的核心步骤。这是理解"几乎全局渐近稳定"这一结论的数学基础。整个证明的逻辑链条是: 构造 \(V\) → 证 \(V\) 正定 → 计算 \(\dot{V}\) → 证 \(\dot{V}\) 负定 → 得出稳定性结论。每一步都不可省略。
步骤 1: 构造 Lyapunov 函数
各项的物理含义: - \(\frac{1}{2} e_v^T e_v\): 速度误差的"平移动能" — 衡量四旋翼飞错方向的剧烈程度 - \(K_R \Psi\): 姿态误差的"势能" — \(\Psi = 1 - \cos\theta\) 像一个"弹簧势能", 偏离越大势能越高 - \(\frac{1}{2} e_\Omega^T J e_\Omega\): 角速度误差的"旋转动能" — 衡量四旋翼转错方向的剧烈程度; 注意 \(J\) 的出现使得这一项真正具有转动能量的物理量纲 - \(c_1 e_x^T e_v\): 位置-速度交叉项 — 这一项的作用是将位置误差和速度误差"耦合"起来, 使得 \(\dot{V}\) 中能出现 \(\|e_x\|^2\) 的负定项 (否则 \(V\) 对 \(e_x\) 的贡献只通过 \(c_2\|e_x\|^2\), 而 \(\dot{V}\) 中不会自然出现 \(e_x\) 的衰减项) - \(c_2 \|e_x\|^2\): 位置误差的"弹性势能" — 直接惩罚位置偏差
为什么需要交叉项 \(c_1 e_x^T e_v\)? 这是 Lyapunov 函数构造中一个重要的技巧。如果没有这个交叉项, \(V\) 只包含 \(\|e_v\|^2\) 和 \(\|e_x\|^2\) 的独立项。计算 \(\dot{V}\) 时, \(\frac{d}{dt}\|e_x\|^2 = 2 e_x^T e_v\), 这个 \(e_x^T e_v\) 项是正是负不确定, 无法保证 \(\dot{V} < 0\)。加入 \(c_1 e_x^T e_v\) 后, 它的时间导数 \(c_1(\dot{e}_x^T e_v + e_x^T \dot{e}_v) = c_1(\|e_v\|^2 + e_x^T \dot{e}_v)\) 中会产生 \(c_1 \|e_v\|^2\) 项和 \(c_1 e_x^T \dot{e}_v\) 项, 后者在代入控制律后会给出 \(-c_1 K_x \|e_x\|^2\) (位置误差的衰减), 从而使 \(\dot{V}\) 变为负定。这种"加交叉项以获得更好衰减结构"的技巧在控制理论中非常常见。
步骤 2: 证明 \(V\) 正定
交叉项 \(c_1 e_x^T e_v\) 可能为负 (当 \(e_x\) 和 \(e_v\) 方向相反时)。我们需要证明它不会"吃掉"其他正定项。利用 Young 不等式 (对任意 \(\epsilon > 0\), \(|a^T b| \leq \frac{1}{2\epsilon}\|a\|^2 + \frac{\epsilon}{2}\|b\|^2\)):
因此:
选择参数满足: - \(c_1 \epsilon < 1\) (即 \(\epsilon < 1/c_1\)), 使 \(\|e_v\|^2\) 的系数为正 - \(c_2 > c_1/(2\epsilon)\), 使 \(\|e_x\|^2\) 的系数为正
则 \(V\) 正定。具体地, 一组可行的选择是 \(c_1\) 很小 (比如 \(c_1 = 0.1\)), \(\epsilon = 1/(2c_1) = 5\), \(c_2 > c_1/(2\epsilon) = 0.01\)。
阶段小结: 步骤 1-2 建立了"能量函数" \(V\)。它像一个综合的"误差度量", 包含位置、速度、姿态和角速度四种误差的加权组合。接下来需要证明这个"能量"在控制律的作用下持续减小。
步骤 3: 计算 \(\dot{\Psi}\) ——证明的核心恒等式
这是整个证明中最关键、也是数学上最精妙的一步。我们需要计算姿态误差函数 \(\Psi\) 在运动方程下的时间导数。
定义 \(\tilde{R} = R_d^T R\) (相对旋转矩阵)。由运动学方程:
\(\Psi\) 的时间导数:
现在运用关键的迹恒等式。对于反对称矩阵 \(\hat{a}\) 和一般矩阵 \(B\):
这个恒等式为什么成立? 对 \(\hat{a}B\) 的迹展开, \(\text{tr}(\hat{a}B) = \sum_{i,j} \hat{a}_{ij} B_{ji}\)。由于 \(\hat{a}\) 是反对称的 (\(\hat{a}_{ij} = -\hat{a}_{ji}\)), 这个求和只涉及 \(B\) 的反对称部分 \(\frac{1}{2}(B - B^T)\)。具体地, \(\text{tr}(\hat{a}B) = -2 a^T \cdot \frac{1}{2}(B^T - B)^\vee = -a^T (B^T - B)^\vee\)。(可以用 \(3 \times 3\) 矩阵逐元素验证。)
利用 \(\text{tr}(AB) = \text{tr}(BA)\) (迹的循环性), \(\text{tr}(\tilde{R}\hat{\Omega}) = \text{tr}(\hat{\Omega}\tilde{R})\)。应用迹恒等式:
代入:
但这里的 \(\Omega_d\) 和 \(\Omega\) 在不同坐标系中, 需要更仔细的处理。实际上, 更精确的推导使用 \(\dot{\tilde{R}} = \tilde{R}\hat{e}_\Omega + \tilde{R}\widehat{\tilde{R}^T \Omega_d} - \hat{\Omega}_d \tilde{R}\) 的等价形式, 最终得到:
(利用 \(\text{tr}(\hat{a}B) = -a^T(B^T - B)^\vee\) 和 \((\tilde{R}^T - \tilde{R})^\vee = -2e_R\)。)
为什么这个结果如此重要? 它告诉我们: 1. 姿态误差函数的变化率与两个误差量的**内积**成正比——简洁而优美 2. 当 \(e_R\) 和 \(e_\Omega\) "同向" (内积 > 0) 时, \(\Psi\) 增大 (误差恶化) 3. 当控制律使得 \(e_R \cdot e_\Omega < 0\) 时, \(\Psi\) 减小 (误差被修正) 4. 这个结构使得 Lyapunov 函数中 \(K_R \dot{\Psi} = K_R e_R \cdot e_\Omega\) 这一项与 \(e_\Omega^T J \dot{e}_\Omega\) 中的交叉项精确配对, 从而在 \(\dot{V}\) 中被消去
步骤 4: 代入控制律后的闭环分析
将力矩控制律 \(M = -K_R e_R - K_\Omega e_\Omega + \Omega \times J\Omega - J(\hat{\Omega}\tilde{R}^T\Omega_d - \tilde{R}^T\dot{\Omega}_d)\) 代入 Euler 方程 \(J\dot{\Omega} = -\Omega \times J\Omega + M\):
陀螺力矩项 \(\Omega \times J\Omega\) 被前馈精确抵消——这正是前馈项存在的意义。
计算 \(e_\Omega^T J \dot{e}_\Omega\) (这是 \(\dot{V}\) 中来自角速度误差"旋转动能"的贡献):
关键的一步: \(e_\Omega^T (-K_R e_R) = -K_R e_\Omega \cdot e_R\) 这一项, 与 \(K_R \dot{\Psi} = K_R e_R \cdot e_\Omega\) 这一项**精确相消**:
这个相消是 Lee 构造的精髓: \(\Psi\) 的选择使得 \(\dot{\Psi} = e_R \cdot e_\Omega\), 而力矩公式中的 \(-K_R e_R\) 项产生 \(-K_R e_\Omega \cdot e_R\), 两者完美抵消, 只留下确定的负定项 \(-K_\Omega \|e_\Omega\|^2\)。
综合所有项, 在适当选择增益 \(K_x, K_v, K_R, K_\Omega\) 和耦合参数 \(c_1, c_2\) 的条件下:
其中 \(\alpha\) 取决于增益矩阵的最小特征值和耦合参数。
步骤 5: 稳定性结论
- \(\Psi(0) < 1\): \(\dot{V} \leq -\alpha V\) 意味着**指数稳定性 (Exponential Stability)**, 所有误差以指数速率衰减: \(V(t) \leq V(0) e^{-\alpha t}\)。物理上, \(\Psi < 1\) 意味着初始姿态偏差小于 \(90°\), 推力方向与期望方向的夹角小于 \(90°\), 推力的"有用分量"为正。
- \(1 \leq \Psi(0) < 2\): 可以证明**渐近稳定性 (Asymptotic Stability)**, 误差收敛到零但可能不是指数速率。在这个区域, \(\dot{V}\) 仍为负, 但指数衰减的常数 \(\alpha\) 可能接近零。
- \(\Psi(0) = 2\): 不稳定平衡点, 对应于初始姿态恰好与期望姿态相差 \(180°\) 旋转且 \(e_\Omega = 0\)。此时 \(e_R = 0\) (因为 \(\sin 180° = 0\)), 控制律的姿态反馈项为零, 无法提供修正力矩。这是拓扑障碍导致的不可避免的零测集。
"几乎全局"有多"几乎"? 不稳定集合 = \(\{(R, \Omega) : \Psi = 2, e_\Omega = 0\}\)。\(\Psi = 2\) 意味着旋转角恰好为 \(180°\), 同时 \(e_\Omega = 0\) 意味着角速度恰好等于期望值。这在 \(SO(3) \times \mathbb{R}^3\) 的 6 维状态空间中是一个 3 维子流形 (所有满足 \(\theta = 180°\) 的旋转加零角速度误差), Lebesgue 测度为零。在真实世界中, 由于传感器噪声和扰动, 精确停留在零测集上的概率为零——因此"几乎全局"在工程意义上等价于"全局"。
§3.8 \(\Psi > 1\) 安全门 ⭐⭐¶
在实际实现中 (如 KumarRobotics 的 kr_mav_control), 当 \(\Psi > 1\) 时会触发安全机制——关闭电机进入保护模式。为什么阈值是 1 而不是 2?
- \(\Psi > 1\) 意味着姿态偏差超过 \(90°\), 推力方向与期望方向夹角超过 \(90°\)——推力的"有用分量"变为负值
- 在 \(\Psi > 1\) 区域, Lyapunov 函数的收敛速率不确定
- 当 \(\Psi > 1\), 四旋翼可能已经接近倒飞, 继续控制不如直接关机更安全
§3.9 常见陷阱¶
陷阱 7: 忘记陀螺力矩补偿 - 错误描述: 控制器中缺少 \(\Omega \times J\Omega\) 前馈项 - 现象/后果: 悬停正常, 激进机动时 (角速度 > 5 rad/s) 出现 30-50% 的跟踪误差 - 根本原因: 陀螺力矩在高角速度时可达控制力矩的 30-50% - 正确做法: 在力矩公式中显式加入 \(\Omega \times J\Omega\); PX4 默认不含此项
陷阱 8: 角速度误差的坐标系 - 错误描述: 直接计算 \(\Omega - \Omega_d\) 而不做坐标变换 - 现象/后果: 小角度时影响微小, 大角度跟踪时控制器行为异常 - 根本原因: \(\Omega\) 和 \(\Omega_d\) 在不同体坐标系中, 必须通过 \(R^T R_d\) 统一 - 正确做法: 使用 \(e_\Omega = \Omega - R^T R_d \Omega_d\)
陷阱 9: 增益矩阵的耦合约束 - 错误描述: 随意增大 \(K_R\) 而不相应调整 \(K_\Omega\) - 现象/后果: 姿态环过阻尼或欠阻尼, 出现振荡 - 根本原因: Lyapunov 分析要求 \(K_R\) 和 \(K_\Omega\) 满足特定比例关系 - 正确做法: 经验法则 \(K_\Omega \approx 2\sqrt{K_R \cdot J}\) (临界阻尼条件)
§3.10 练习¶
[练习 3.1] 验证 \(e_R\) 的性质 ⭐⭐ (a) 证明 \(e_R = 0\) 当且仅当 \(R = R_d\)。 (b) 当 \(R_d^T R = \exp(\theta \hat{n})\) 时, 计算 \(e_R\), 验证 \(e_R = \sin\theta \cdot n\)。 (c) 当 \(\theta\) 很小时, 验证 \(e_R \approx \theta n = \log(R_d^T R)^\vee\)。(在草稿纸上完成)
[练习 3.2] 手推 \(\dot{\Psi} = e_R \cdot e_\Omega\) ⭐⭐⭐ 从 \(\Psi = \frac{1}{2}\text{tr}(I - R_d^T R)\) 出发, 利用 \(\dot{R} = R\hat{\Omega}\) 和 \(\dot{R}_d = R_d \hat{\Omega}_d\), 推导 \(\dot{\Psi}\)。使用恒等式 \(\text{tr}(\hat{a}B) = -a^T(B^T - B)^\vee\)。(在草稿纸上完成)
[练习 3.3, 开放题] SLAM 残差与控制误差的对比 ⭐⭐⭐
SLAM 中的 BetweenFactor<Rot3> 残差是 \(\log(R_{\text{meas}}^{-1} R_{ij})^\vee\) (对数映射); SE(3) 控制器的姿态误差是 \(e_R = \frac{1}{2}(R_d^T R - R^T R_d)^\vee\) (\(\sin\theta\) 近似)。
(a) 两者在数学上有什么关系?
(b) 为什么 SLAM 用 \(\log\) 映射而控制器用 vee? (提示: 优化关注测地线距离, 控制关注 Lyapunov 分析的简洁性。)
上一节设计了几何跟踪控制器, 解决了"实际状态偏离期望时如何修正"。但还有一个关键问题: 如何设计那条光滑的参考轨迹 \(\sigma(t)\)? 微分平坦性告诉我们轨迹必须 \(C^4\) 连续, 但没有说应该怎么选。最小 snap 轨迹优化正是回答这个问题的标准方法。
§4 微分平坦到轨迹生成的桥梁 ⭐⭐¶
这一节解决什么问题: 建立最小 snap 目标函数与电机平滑之间的联系, 并将轨迹规划形式化为凸二次规划 (QP)。
§4.1 核心洞见: 为什么 snap 最优 = 电机平滑 ⭐⭐¶
Mellinger & Kumar (ICRA 2011) 的核心贡献之一是建立了以下联系:
推导链条: 1. snap (\(\sigma^{(4)}\)) 决定角加速度: 从平坦映射步骤 5, \(\dot{\Omega}\) 是 snap 的函数 2. 角加速度决定力矩: \(M = J\dot{\Omega} + \Omega \times J\Omega\) 3. 力矩决定电机转速差: \(\Delta\omega^2 = A^{-1}[f; M]\) 的力矩分量 4. **电机转速变化率**正比于力矩的变化率, 而力矩的变化率正比于 snap
因此, 最小化 snap 的积分近似等价于最小化电机指令变化率, 直接减少电机电流尖峰、机械振动和噪声。
类比 4: 最小 snap 轨迹之于无人机, 犹如"平稳驾驶"之于汽车。 经验丰富的司机不会急踩油门 (加速度跳变 = jerk 大) 或急打方向盘, 而是让加速度缓慢变化。乘客感受到的"舒适度"对应于电机的"工作舒适度"。类比边界: 汽车驾驶中的"舒适"是主观感受, 无人机的"电机平滑"是客观的电气指标 (电流尖峰、功耗); 汽车控制是在平面上, 无人机涉及 SO(3) 上的旋转。
§4.2 最小 snap 轨迹优化 ⭐⭐¶
问题形式化: 给定 \(N+1\) 个路点 \(\sigma_0, \sigma_1, \ldots, \sigma_N\) 和经过每个路点的时间 \(t_0, t_1, \ldots, t_N\), 求连接这些路点的 \(C^3\) 连续分段多项式轨迹, 最小化:
为什么是 7 阶多项式? 每段轨迹 \(\sigma_i(t)\) 是 7 阶 (degree 7) 多项式, 有 8 个系数。两端的约束 (位置、速度、加速度、jerk 在路点处的连续性) 恰好消耗 8 个约束。如果用更低阶的多项式 (比如 5 阶), 约束不够 (只能保证位置和速度连续, 加速度可能不连续, 导致 jerk 跳变); 如果用更高阶 (比如 9 阶), 有多余自由度, 需要额外条件确定。
让我们具体计算约束数。设一段轨迹的多项式为 \(p(t) = \sum_{k=0}^{7} c_k t^k\), 时间区间 \([0, T]\)。
单段 Hessian 矩阵的构造: snap (四阶导数) 为:
snap 代价:
展开并积分, 第 \((i, j)\) 个 Hessian 元素 (对于 \(i, j \geq 4\)) 为:
前四行和前四列为零 (因为 \(c_0\) 到 \(c_3\) 的四阶导数为零), 所以 \(H\) 的有效部分是右下角的 \(4 \times 4\) 子矩阵。例如, 当 \(T = 1\) 时:
对于多段轨迹, 总 Hessian 是各段 Hessian 的块对角矩阵。
约束矩阵的结构: 对于 \(N\) 段轨迹: - 多项式系数数量: \(8N\) (每段 8 个系数) - 路点位置约束: \(2N\) (每段两端) - 连续性约束: \(3(N-1)\) (内部路点的速度、加速度、jerk 连续) - 首尾边界条件: \(6\) (首尾的速度、加速度、jerk 指定)
总约束数: \(2N + 3(N-1) + 6 = 5N + 3\)
当 \(5N + 3 < 8N\) 即 \(N > 1\) 时, 约束数少于变量数, 多余自由度由目标函数 (snap 最小化) 决定。
QP 形式: 将系数堆叠成向量 \(c\), 则 \(J = c^T H c\) (正半定二次型), 连续性约束和路点约束是线性等式约束 \(Ac = b\)。这是一个**凸二次规划** (Convex QP), 有闭式解 (由 KKT 条件给出):
阶段小结: 最小 snap 问题是一个有闭式解的凸 QP。Hessian 由多项式积分系数构成, 约束矩阵由路点位置和导数连续性构成。整个求解过程是线性代数运算, 计算高效且全局最优。
时间分配问题: 上述 QP 假设路点的到达时间 \(\{t_i\}\) 已知。但实际中时间通常不确定。时间分配对轨迹质量影响极大: 时间太短导致轨迹不可行 (所需推力超过电机极限), 时间太长则不必要地慢。
- Mellinger 2011: 用总路径长度的均匀分配作为初值, 然后数值优化
- Richter 2016: 将时间分配作为优化变量, 联合优化多项式系数和时间——但问题变为非凸
- GCOPTER (Wang 2022): 用 Bezier 曲线重参数化, 将时间分配转化为凸约束
§4.3 不同目标函数的对比¶
| 目标函数 | 最小化量 | 多项式阶数 | 连续性 | 物理含义 |
|---|---|---|---|---|
| 最小 jerk | \(\int \|\sigma^{(3)}\|^2 dt\) | 5 | \(C^2\) | 最小化角速度变化 (不够光滑) |
| 最小 snap | \(\int \|\sigma^{(4)}\|^2 dt\) | 7 | \(C^3\) | 最小化电机力矩变化率 (标准选择) |
| 最小 crackle | \(\int \|\sigma^{(5)}\|^2 dt\) | 9 | \(C^4\) | 最小化电机电流变化率 (过度光滑) |
在实践中, 最小 snap 是最佳平衡: 足够光滑以保证平坦映射良好行为, 但不过度光滑以避免不必要的计算开销。
§4.4 从 QP 解到控制指令: 完整 Pipeline ⭐⭐¶
路点 → QP(min-snap) → 多项式σ(t) → 平坦映射 → (Rd, Ωd, fd, Md)
│
实际状态 (x,v,R,Ω) → SE(3)控制律 → (f, M) → A⁻¹ → ω²
↑ │
(Kx,Kv,KR,KΩ)反馈 ▼
电机
- 求解 QP 得到多项式系数
- 在任意时刻 \(t\), 通过多项式求值得到 \(\sigma(t)\) 到 \(\sigma^{(4)}(t)\)
- 代入平坦映射得到期望状态和前馈控制
- 代入 SE(3) 控制律计算实际控制指令
- 通过分配矩阵逆映射到电机转速
§4.5 常见陷阱¶
陷阱 10: 时间分配不当 - 错误描述: 给每段轨迹分配了过短的时间 - 现象/后果: 所需推力超过电机极限, 轨迹不可行 - 根本原因: 时间太短要求更大的加速度, 从而需要更大的推力 - 正确做法: 用总路径长度均匀分配作为初值; Richter 2016 将时间分配作为优化变量
陷阱 11: 忽略最小 snap 与最小 jerk 的区别 - 错误描述: 使用最小 jerk (5 阶多项式) 而非最小 snap (7 阶多项式) - 现象/后果: 角速度在路点处不连续, 电机指令跳变 - 根本原因: 平坦映射中角速度依赖 jerk; 最小 jerk 轨迹的 jerk 在路点处不连续 - 正确做法: 使用最小 snap (7 阶多项式, \(C^3\) 连续)
§4.6 练习¶
[练习 4.1] 1D 最小 snap ⭐⭐ 考虑 1D 情况: 从 \((x_0, v_0, a_0, j_0) = (0, 0, 0, 0)\) 到 \((x_f, v_f, a_f, j_f) = (1, 0, 0, 0)\), 时间 \(T = 1\)。 (a) 设 \(x(t) = \sum_{k=0}^{7} c_k t^k\), 写出 8 个约束方程。 (b) 写出目标函数 \(\int_0^1 |x^{(4)}|^2 dt\) 关于 \(c\) 的二次形式。 (c) 用 KKT 条件求解或用 Python 验证。(在草稿纸或电脑上完成)
[练习 4.2, 开放题] 为什么不最小化 jerk? ⭐⭐ 如果目标函数改为最小化 \(\int \|\sigma^{(3)}\|^2 dt\), 则只需 5 阶多项式。这时平坦映射会出什么问题? 从 \(C^k\) 连续性角度分析。
[练习 4.3, 跨章综合题] 从路点到电机指令 ⭐⭐⭐ 给定三个路点 \((0,0,1), (1,0,1), (1,1,1)\), 偏航角始终为零, 总时间 2 秒。 (a) 描述如何用最小 snap 方法生成轨迹 (不需要具体求解, 描述步骤和所需的约束方程即可)。 (b) 在 \(t = 1\) 秒 (中间路点) 处, 平坦映射需要哪些量? 如果 jerk 不连续, 哪个输出量会跳变? (c) 如果跟踪时位置误差 \(e_x = [0.1, 0, 0]^T\), SE(3) 控制器如何修正推力? 写出推力公式的具体数值。
§1-§4 建立了从动力学到控制的完整理论链。但理论与工程之间永远存在鸿沟。接下来的 §5 讨论这些理论在开源项目中的实际实现——不同选择的工程权衡, 以及理论未覆盖的实际问题。
§5 工程实现与对比 ⭐⭐¶
这一节解决什么问题: 对比主流开源控制器的实现差异, 讨论理论到工程的转化过程中的关键决策。
§5.1 开源实现概览¶
| 实现 | 特点 | 控制层次 |
|---|---|---|
| rpg_quadrotor_control (UZH RPG) | ControllerBase 策略模式; MPC/DFBC/几何 PID 可切换 | 输出 body rate -> FCU |
| mavros_controllers (Lim) | 最简 SE(3) 跟踪器; Faessler rotor-drag 模型; PX4 SITL 友好 | 输出 body rate + thrust -> PX4 |
| kr_mav_control (KumarRobotics) | Mellinger/Kumar 直系代码; SO3Command 消息; \(\Psi>1\) 安全门 | 输出 SO3 cmd -> 接口层 |
| PX4 mc_att_control | Brescianini 四元数; 无 \(\Omega \times J\Omega\) 前馈 | 级联 PID |
§5.2 三种控制器的详细对比¶
| 特性 | PX4 级联 PID | Lee SE(3) 几何控制 | DFBC (Faessler 2018) |
|---|---|---|---|
| 姿态表示 | 四元数 | 旋转矩阵 | 旋转矩阵 |
| 姿态误差 | 四元数误差 (短路径) | \(e_R = \frac{1}{2}(R_d^T R - R^T R_d)^\vee\) | 同 Lee |
| 陀螺补偿 | 无 | \(\Omega \times J\Omega\) | \(\Omega \times J\Omega\) |
| 角加速度前馈 | 无 | 有 | 有 + 阻力修正 |
| 气动阻力 | 忽略 | 忽略 | 线性模型 \(-DR^Tv\) |
| 理论保证 | 局部稳定性 | 几乎全局渐近稳定 | 几乎全局渐近稳定 |
| 适用场景 | 低速/悬停 | 中等激进机动 | 高速飞行 (> 10 m/s) |
§5.3 DFBC: 带旋翼阻力的微分平坦控制 ⭐⭐¶
DFBC (Differential Flatness Based Controller) 是 Faessler, Franchi, Scaramuzza (RA-L 2018) 提出的。加入线性旋翼阻力后, 平坦映射变为隐式方程, 用 Newton 迭代求解 (通常 2-3 次即收敛)。
DFBC vs MPC (Sun et al., T-RO 2022 系统对比): - DFBC 优势: 纯前馈+PD, 无需在线优化, 计算 < 0.1 ms; 适合资源受限平台 - MPC 优势: 显式约束 (推力上下限、体率上限), 能在约束边界优雅降级
结论: 可行参考下 DFBC 足够; 接近物理极限时必须用 MPC。
§5.4 PX4 为什么不直接用 Lee 控制器? ⭐¶
这是一个经常被问到的问题。原因是多方面的:
- 通用性 vs 最优性: PX4 需要支持从小型穿越机到大型测绘无人机, 简单 PID 覆盖面更广
- 历史惯性: 控制架构在 2012-2013 年确定, 之后改变成本太高
- 调参友好性: 级联 PID 的增益可独立调整, Lee 控制器的增益有耦合关系
- 工程权衡: 95% 用户场景 (GPS 导航、航拍) 不需要几何控制器
§5.5 SE(3) 控制器完整数值算例 ⭐⭐¶
为了让读者对控制律有具体的数值感受, 我们给出一个详细的跟踪误差修正算例。
问题设定: \(m = 1.5\) kg, \(J = \text{diag}(0.03, 0.03, 0.05)\) kg\(\cdot\)m\(^2\), \(g = 9.81\) m/s\(^2\)。增益: \(K_x = 10 I_3\), \(K_v = 8 I_3\), \(K_R = 5 I_3\), \(K_\Omega = 1.5 I_3\)。
期望状态 (悬停): \(x_d = [0, 0, 2]^T\), \(v_d = 0\), \(R_d = I\), \(\Omega_d = 0\), \(\ddot{x}_d = 0\)。
实际状态 (存在偏差): \(x = [0.5, -0.3, 1.8]^T\), \(v = [0.1, -0.05, -0.2]^T\), \(R = R_y(10°)\), \(\Omega = [0, 0.5, 0]^T\) rad/s。
第 1 步: 计算误差量
位置误差: \(e_x = [0.5, -0.3, -0.2]^T\) m
速度误差: \(e_v = [0.1, -0.05, -0.2]^T\) m/s
姿态误差函数: $\(R = R_y(10°) = \begin{bmatrix} 0.985 & 0 & 0.174 \\ 0 & 1 & 0 \\ -0.174 & 0 & 0.985 \end{bmatrix}\)$
\(\Psi = 0.015 \ll 1\), 处于指数稳定域内, 安全门不会触发。
姿态误差向量: $\(e_R = \frac{1}{2}(R - R^T)^\vee = \frac{1}{2}[0, 0.348, 0]^T = [0, 0.174, 0]^T\)$
验证: \(0.174 = \sin(10°)\), 与理论 \(e_R = \sin\theta \cdot n = \sin(10°) \cdot [0,1,0]^T\) 一致。
角速度误差: \(e_\Omega = [0, 0.5, 0]^T - R^T \cdot 0 = [0, 0.5, 0]^T\) rad/s
第 2 步: 计算推力
当前推力方向: \(Re_3 = [0.174, 0, 0.985]^T\)
投影: \(f = F_{des} \cdot Re_3 = -5.8 \times 0.174 + 3.4 \times 0 + 18.315 \times 0.985 = -1.009 + 18.040 = 17.031\) N
对比悬停推力 \(mg = 14.715\) N, 增大约 15.7%——需要额外推力来修正位置误差和姿态偏移。
第 3 步: 计算力矩
由于 \(\Omega_d = 0\) 和 \(\dot{\Omega}_d = 0\), 前馈项为零。
\(\Omega \times J\Omega = [0, 0.5, 0]^T \times [0, 0.015, 0]^T = [0, 0, 0]^T\) (平行向量叉积为零)
物理含义: 纯绕 \(y\) 轴的力矩, 方向为减小俯仰角 (从 \(+10°\) 向 \(0°\) 修正) 并抑制俯仰角速度 (\(q = 0.5\) rad/s)。
第 4 步: 检查执行器饱和
典型 250 mm 四旋翼每个电机最大推力约 5 N, 臂长 \(L = 0.125\) m。最大可用力矩:
计算的 \(|M_y| = 1.62\) N\(\cdot\)m 超过了 \(M_{\max} = 1.25\) N\(\cdot\)m, 电机将饱和。这提示我们: 增益不能盲目增大。位置偏差 0.5 m + 姿态偏差 \(10°\) 在这组增益下已经接近执行器极限。实际代码中应加入力矩裁剪:
阶段小结: 这个数值算例展示了 SE(3) 控制器的完整计算流程: 误差量计算 -> 推力投影 -> 力矩计算 -> 饱和检查。关键数值直觉: 悬停推力约 15 N, \(10°\) 偏差产生约 1.6 N\(\cdot\)m 力矩, 已接近小型四旋翼的极限。
§5.6 增益调参指南 ⭐⭐¶
步骤 1: 估计系统参数 — 质量 \(m\) (用秤称), 惯性张量 \(J\) (CAD 或双线摆), 推力系数 \(k_f\) (拉力台)
步骤 2: 先调姿态环 — \(K_R = J \cdot \omega_n^2\) (\(\omega_n\) 取 20-50 rad/s), \(K_\Omega = 2\zeta \sqrt{K_R \cdot J}\) (\(\zeta = 0.7\)-\(1.0\))
步骤 3: 再调位置环 — 位置环带宽为姿态环的 1/3-1/5: \(K_x = m \cdot \omega_{n,x}^2\) (\(\omega_{n,x}\) 取 5-15 rad/s)
关键原则: 位置环带宽必须低于姿态环带宽 (通常 3-5 倍), 否则位置控制器发出的姿态指令变化太快, 姿态控制器跟不上。
§5.7 常见陷阱¶
陷阱 12: PX4 OFFBOARD 模式未正确激活 - 错误描述: mavros_controllers 运行但四旋翼不响应 - 现象/后果: 四旋翼停在地面或执行 PX4 默认行为 - 根本原因: PX4 要求 OFFBOARD 模式下指令频率 > 2 Hz, 否则自动切回 - 正确做法: 检查 armed 状态、OFFBOARD 模式、指令发布频率; 设
COM_RCL_EXCEPT允许无遥控器陷阱 13: 位置环和姿态环带宽冲突 - 错误描述: 增大位置增益后姿态响应变差 - 现象/后果: 找不到增益平衡点, 位置和姿态交替恶化 - 根本原因: 级联控制器的带宽分离原则被违反 - 正确做法: 位置环时间常数 \(\tau_x \geq 5 \tau_R\), 先调内环再调外环
§5.8 练习¶
[练习 5.1, 工程题] SE(3) 控制器数值算例 ⭐⭐ 四旋翼参数: \(m = 1.5\) kg, \(J = \text{diag}(0.03, 0.03, 0.05)\), 增益 \(K_x = 10 I_3, K_v = 8 I_3, K_R = 5 I_3, K_\Omega = 1.5 I_3\)。当前状态偏离悬停: \(e_x = [0.5, -0.3, -0.2]^T\), \(e_v = [0.1, -0.05, -0.2]^T\), \(R = R_y(10°)\), \(\Omega = [0, 0.5, 0]^T\)。 (a) 计算 \(\Psi\), 判断是否在安全域内。 (b) 计算推力 \(f\) 和力矩 \(M\)。 (c) 检查力矩是否超过电机极限 (假设 \(M_{\max} = 1.25\) N\(\cdot\)m)。
[练习 5.2, 开放题] PX4 vs Lee 控制器的工程权衡 ⭐⭐ 列表比较 PX4 级联 PID 和 Lee 几何控制器在以下五个维度的差异: (a) 理论保证, (b) 计算复杂度, (c) 调参难度, (d) 对惯性张量的敏感度, (e) 社区支持。你在什么场景下会选择 Lee 控制器?
本章常见误解汇总¶
| 误解 | 正确理解 |
|---|---|
| "微分平坦性是四旋翼独有的" | 微分平坦性是非线性系统的通用性质, 车辆、起重机等系统也可能是平坦的 |
| "四元数消除了所有旋转表示问题" | 四元数消除了万向节锁, 但引入了双覆盖问题 (\(q\) 和 \(-q\) 表示同一旋转) |
| "Lee 控制器是全局稳定的" | 由于拓扑障碍, 只能实现几乎全局稳定 (零测集上不收敛) |
| "增大增益就能改善跟踪性能" | 增益之间有耦合约束, 盲目增大可能导致振荡或执行器饱和 |
| "最小 snap 和最小 jerk 效果差不多" | 最小 jerk 轨迹的 jerk 在路点不连续, 导致角速度跳变, 对电机不友好 |
| "PX4 不好是因为代码写得差" | PX4 是通用性优先的工程选择, 在 95% 场景下足够好 |
| "忽略气动阻力不影响控制" | 低速时可忽略, 高速 (> 10 m/s) 时模型失配被放大, 跟踪误差显著增大 |
| "坐标系约定无所谓" | NWU/NED 混用是最常见的致命 bug 来源 |
本章小结¶
符号表¶
| 符号 | 含义 | 首次出现 |
|---|---|---|
| \(R \in SO(3)\) | 体坐标系到惯性系的旋转矩阵 | §1.2 |
| \(\Omega \in \mathbb{R}^3\) | 体坐标系角速度 | §1.5 |
| \(\hat{\cdot}\) | hat 算子, \(\mathbb{R}^3 \to \mathfrak{so}(3)\) | §1.5 |
| \((\cdot)^\vee\) | vee 算子, hat 的逆 | §3.4 |
| \(\sigma = (x_1,x_2,x_3,\psi)\) | 平坦输出 | §2.3 |
| \(f\) | 总推力 (标量) | §1.3 |
| \(M \in \mathbb{R}^3\) | 体坐标系力矩 | §1.3 |
| \(J\) | 惯性张量 (体坐标系, 关于质心) | §1.5 |
| \(\Psi(R, R_d)\) | 姿态误差函数 \(\frac{1}{2}\text{tr}(I - R_d^T R)\) | §3.4 |
| \(e_R\) | 姿态误差向量 \(\frac{1}{2}(R_d^T R - R^T R_d)^\vee\) | §3.4 |
| \(e_\Omega\) | 角速度误差 \(\Omega - R^T R_d \Omega_d\) | §3.5 |
| \(A\) | 控制分配矩阵 (\(4 \times 4\), 可逆) | §1.3 |
| \(D\) | 旋翼阻力系数矩阵 | §1.7 |
定理速查表¶
| 定理/公式 | 一句话说明 | 对应节 |
|---|---|---|
| Newton-Euler 方程组 | 四旋翼完整 12 维动力学: \(m\dot{v} = -mge_3 + fRe_3\), \(J\dot{\Omega} = -\Omega \times J\Omega + M\) | §1.6 |
| 微分平坦性 (Mellinger 2011) | \(\sigma = (x,y,z,\psi)\) 的至多四阶导数通过代数映射恢复全部状态和控制 | §2.4 |
| Bhat-Bernstein 拓扑障碍 | 紧致流形上不存在连续的全局渐近稳定控制律 | §3.3 |
| Lee 控制律 (CDC 2010) | SO(3) 上的 PD + 前馈, \(\Psi < 2\) 时 AGAS, \(\Psi < 1\) 时指数稳定 | §3.6 |
| \(\dot{\Psi} = e_R \cdot e_\Omega\) | 姿态误差函数的导数等于姿态误差向量与角速度误差的内积 | §3.7 |
| 最小 snap QP | \(\min_c c^T H c\) s.t. \(Ac = b\), 7 阶多项式, \(C^3\) 连续 | §4.2 |
知识点总表¶
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 1 | Newton-Euler 动力学 | 欠驱动 + 旋转-平移耦合 | §1 | ⭐⭐ |
| 2 | 微分平坦性 | 4 维 → 12 维代数映射 | §2 | ⭐⭐⭐ |
| 3 | Bhat-Bernstein 定理 | SO(3) 上全局稳定不可能 | §3.3 | ⭐⭐⭐ |
| 4 | 姿态误差函数 \(\Psi\) | \(1-\cos\theta\), 梯度为 \(e_R\) | §3.4 | ⭐⭐⭐ |
| 5 | Lee 控制律 | SO(3) PD + 陀螺补偿 + 前馈 | §3.6 | ⭐⭐⭐ |
| 6 | Lyapunov 证明 | \(\dot{\Psi} = e_R \cdot e_\Omega\), \(\dot{V} \leq -\alpha V\) | §3.7 | ⭐⭐⭐⭐ |
| 7 | 最小 snap 轨迹 | \(\int\|\sigma^{(4)}\|^2 dt\) = 电机平滑 | §4 | ⭐⭐ |
| 8 | 工程实现对比 | PX4/Lee/DFBC 的权衡 | §5 | ⭐⭐ |
累积项目: 本章新增模块¶
无人机控制 Mini-Project: - 本章新增: 实现微分平坦映射函数 (给定 \(\sigma\) 到四阶导数, 输出 \(R, \Omega, f, M\)) 和 SE(3) 几何控制器 (给定当前状态和期望状态, 输出 \(f, M\)) - 下一章 (D2 MPC) 将在此基础上: 将平坦映射嵌入 MPC 的约束中, 在线优化轨迹
延伸阅读¶
必读论文 (按重要性排序)¶
- Lee, Leok, McClamroch (CDC 2010) — "Geometric Tracking Control of a Quadrotor UAV on SE(3)", 原始论文, SO(3) 上的控制律和 Lyapunov 证明 ⭐⭐⭐
- Mellinger & Kumar (ICRA 2011 Best Paper) — "Minimum Snap Trajectory Generation and Control for Quadrotors", 微分平坦性 + snap 最优化 ⭐⭐⭐
- Faessler et al. (RA-L 2018) — "Differential Flatness of Quadrotor Dynamics Subject to Rotor Drag", 带阻力的平坦映射 ⭐⭐
开源代码¶
- mavros_controllers — 最简 Lee 控制器 C++ 实现 (~200 行核心) ⭐⭐
- GCOPTER
flatness.hpp— 微分平坦映射的 header-only 实现 ⭐⭐ - fdcl-gwu/uav_geometric_control — Lee 本人实验室维护的参考实现 ⭐⭐⭐
本章与后续章节的关系¶
| 后续章节 | 与本章的关系 | 本章铺垫的知识点 |
|---|---|---|
| D2: 无人机 MPC | MPC 将微分平坦性嵌入在线优化约束中 | 平坦映射 (§2), 控制律结构 (§3) |
| 轨迹优化 (GCOPTER 等) | 最小 snap QP 是轨迹优化的标准基线 | 最小 snap 形式化 (§4) |
| 自适应控制 | 在几何控制框架中加入参数在线估计 | Lee 控制律 (§3.6), Lyapunov 方法 (§3.7) |
故障排查手册¶
场景 1: 起飞后立即翻转坠毁¶
症状: 一加油门就翻转, 控制器输出看起来正确但方向反了。
可能原因: - 坐标系约定混用 (NWU vs NED) - 电机编号与分配矩阵不一致 - 推力方向符号错误
排查步骤: 1. 悬停测试: 设 \(R = I\), \(f = mg\), 检查 \(f R e_3 = mg e_3\) 是否成立 2. 检查分配矩阵输出的四个电机转速是否相等且为正 3. 逐个断开电机, 确认编号对应
相关章节: §1.2 (坐标系), §1.3 (分配矩阵)
场景 2: 悬停稳定但快速机动时振荡¶
症状: 低速飞行正常, 激进动作时剧烈振荡。
可能原因: - 缺少陀螺力矩补偿 (\(\Omega \times J\Omega\)) - 惯性张量 \(J\) 标定不准 - 角速率环增益过高
排查步骤: 1. 检查控制器是否包含 \(\Omega \times J\Omega\) 前馈 2. 用双线摆实验验证 \(J\) 是否偏差 > 20% 3. 检查 IMU 延迟是否 > 5 ms
相关章节: §1.5 (陀螺力矩), §3.6 (Lee 控制律), §5.5 (增益调参)
场景 3: 跟踪误差在特定姿态突然变大¶
症状: 大部分轨迹跟踪良好, 但大俯仰角时突然出现大误差。
可能原因: - 欧拉角控制器在 \(\theta = \pm 90°\) 附近奇异 - 四元数控制器未处理双覆盖 - Lee 控制器的 \(\Psi\) 超过安全阈值
排查步骤: 1. 记录 \(\Psi\) 值, 检查是否接近 1.0 或 2.0 2. 检查推力投影 \(F_{des} \cdot Re_3\) 是否变为负值 3. 如果用欧拉角, 切换到旋转矩阵表示
相关章节: §3.2 (欧拉角失败), §3.3 (拓扑障碍), §3.8 (安全门)
场景 4: 平坦映射输出 NaN¶
症状: 控制器在某个时刻输出 NaN。
可能原因: - 推力向量 \(\|t\| = 0\) (自由落体段) - \(\|z_B \times x_C\| = 0\) (极端俯仰) - 轨迹不是 \(C^4\) 连续
排查步骤: 1. 打印 \(\|t\|\) 和 \(\|z_B \times x_C\|\), 检查是否接近零 2. 在代码中加入 epsilon 保护 3. 检查轨迹多项式阶数是否 >= 7
相关章节: §2.4 (步骤 2-3 的奇异条件), §4.2 (多项式阶数)
场景 5: 高速飞行时跟踪误差显著增大¶
症状: > 10 m/s 时位置跟踪误差明显增大。
可能原因: - 忽略气动阻力 (模型失配) - 通信延迟在高速下影响更大 - IMU 高速时振动恶化
排查步骤: 1. 比较有/无阻力模型的前馈推力差异 2. 测量控制回路总延迟 3. 考虑使用 DFBC (Faessler 2018) 或 MPC
相关章节: §1.7 (气动阻力), §5.3 (DFBC)
场景 6: 控制器增益调不好, 位置环和姿态环冲突¶
症状: 增大位置增益后姿态响应变差。
可能原因: - 位置环带宽超过姿态环带宽 - 增益之间的比例关系不当
排查步骤: 1. 计算两个环的带宽: \(\omega_{n,x} = \sqrt{K_x/m}\), \(\omega_{n,R} = \sqrt{K_R/J}\) 2. 确保 \(\omega_{n,R} / \omega_{n,x} \geq 3\) 3. 先调姿态内环 (快速无超调), 再调位置外环
相关章节: §5.5 (增益调参)
场景 7: PX4 SITL 中控制器不响应¶
症状: 控制器节点运行但四旋翼不执行指令。
可能原因: - PX4 未处于 OFFBOARD 模式 - 指令发布频率 < 2 Hz - 未 arm
排查步骤:
1. 检查 /mavros/state 的 mode 和 armed 字段
2. 检查 mavros/setpoint_raw/attitude 话题频率
3. 设 COM_RCL_EXCEPT 位掩码 4
相关章节: §5.1 (开源实现)
常见问题与误解深入解答 (FAQ)¶
Q1: "微分平坦性是四旋翼独有的吗?"¶
不是。 微分平坦性是非线性系统的一种通用性质, 最早由 Fliess, Levine, Martin, Rouchon 在 1990 年代提出, 应用远早于四旋翼。经典的微分平坦系统包括:
- 车辆运动学模型 (Bicycle Model): 平坦输出是后轴中点的 \((x, y)\)
- 起重机 (Overhead Crane): 平坦输出是负载位置
- VTOL 飞行器: 平坦输出是位置 + 偏航
四旋翼的特殊之处在于: 平坦映射的物理含义特别清晰 (加速度 → 推力方向 → 姿态), 而且 snap 最优化有自然的工程动机 (电机平滑)。
对比: 固定翼飞机**不是**微分平坦的 (在标准模型下), 因为升力与攻角的非线性关系引入了不可通过代数运算消除的约束。这就是为什么固定翼的轨迹规划比四旋翼困难得多。
Q2: "Lee 2010 的'几乎全局渐近稳定'具体有多'几乎'?"¶
不稳定的初始条件集合在 \(SO(3) \times \mathbb{R}^3\) 的 6 维状态空间中是一个 3 维子流形 (所有满足 \(\theta = 180°\) 的旋转加零角速度误差), 其 Lebesgue 测度为零。
实际含义: 由于传感器噪声和扰动, 精确停留在零测集上的概率为零。因此"几乎全局"在工程意义上等价于"全局"。但如果四旋翼从恰好倒飞 (\(180°\)) 且零角速度的状态开始, 控制器理论上无法恢复——实际中 \(\Psi > 1\) 安全门会在此之前触发。
Q3: "四元数控制和旋转矩阵控制, 哪个更好?"¶
| 维度 | 四元数 | 旋转矩阵 |
|---|---|---|
| 参数数量 | 4 个 (有 1 个约束 \(\|q\|=1\)) | 9 个 (有 6 个约束 \(R^TR=I, \det R=1\)) |
| 双覆盖 | 存在 (\(q\) 和 \(-q\) 是同一旋转) | 不存在 |
| 万向节锁 | 不存在 | 不存在 |
| Lyapunov 分析 | 需要处理符号歧义 | 更简洁 (\(\Psi\) 直接用 \(\text{tr}\) 定义) |
| 工业实践 | PX4, ArduPilot 使用 | 学术控制文献常用 |
| 插值 | SLERP 更自然 | 需要通过指数/对数映射 |
结论: 对于理论分析和稳定性证明, 旋转矩阵更方便; 对于嵌入式实现和工业应用, 四元数更常见。两者在数学上等价, 选择更多是实践习惯的问题。
Q4: "如何验证我的平坦映射代码是正确的?"¶
最可靠的验证方法是**闭环一致性测试**:
- 正向测试: 取一条解析解的轨迹 (如悬停、匀加速), 代入平坦映射, 检查输出是否与手算一致 (见 §2.6)
- 逆向测试: 将映射输出的 \((R, \Omega, f, M)\) 代入动力学方程, 检查是否恢复原始的 \(\ddot{x}\) 和 \(\dot{\Omega}\)
- 正交性测试: 检查 \(R^T R = I\) (误差应 \(< 10^{-10}\)) 和 \(\det R = 1\)
- 连续性测试: 在多段轨迹的路点处, 检查 \(R(t), \Omega(t), f(t), M(t)\) 是否连续
Q5: "平坦映射在代码实现中有什么数值陷阱?"¶
- 除零保护: \(\|t\| = 0\) (自由落体) 和 \(\|z_B \times x_C\| = 0\) (极端俯仰) 需要 \(\epsilon = 10^{-6}\) 保护
- 旋转矩阵正交性漂移: 长时间仿真中, 浮点误差累积使 \(R\) 不再严格正交, 需要定期 SVD 重投影
- 高阶导数的数值精度: 差分法近似 snap 时, 步长选择至关重要; 最好直接从多项式系数解析求导
- 偏航角绕圈: \(\psi\) 从 \(\pi\) 跳到 \(-\pi\) 时 \(\dot{\psi}\) 出现脉冲, 应使用相位解缠 (Phase Unwrapping)
Q6: "学了微分平坦性和几何控制, 对其他方向有什么用?"¶
这两个理论的方法论可迁移到多个方向:
- 卫星姿态控制: SE(3) 几何控制的旋转部分直接适用, 但没有重力和平移耦合
- 水下机器人: 类似的欠驱动结构, 但有浮力和流体阻力的额外复杂性
- 可重用火箭着陆: 全局姿态控制是关键, Bhat-Bernstein 定理同样适用
- Lyapunov 方法论: Lee 的稳定性证明展示了如何在流形上构造 Lyapunov 函数, 可迁移到任何非欧几何控制问题
科研发展脉络¶
| 年份 | 论文 | 核心贡献 |
|---|---|---|
| 2000 | Bhat & Bernstein | 紧致流形上的拓扑障碍定理 |
| 2010 | Lee, Leok, McClamroch (CDC) | SO(3) 姿态误差函数, AGAS 证明 |
| 2011 | Mellinger & Kumar (ICRA Best) | 微分平坦发现, snap 最优化 |
| 2013 | Mueller, Hehn, D'Andrea (T-RO) | 快速运动原语, 闭式最优 jerk 轨迹 |
| 2018 | Faessler et al. (RA-L) | 带旋翼阻力的微分平坦 |
| 2022 | Sun et al. (T-RO) | MPC vs DFBC 系统对比 |
| 2024 | Lu et al. HKU MaRS (IJRR) | 尾座式全包线微分平坦映射 |
关键实验室传承: UPenn KumarRobotics (Mellinger 2011 原创) -> UZH RPG (Faessler/Scaramuzza 推广至高速+阻力) -> HKU MaRS (Lu/Zhang 推广至非标构型)。
附录 A: 数学工具速查¶
A.1 hat 算子 \(\hat{\cdot}: \mathbb{R}^3 \to \mathfrak{so}(3)\)¶
A.2 迹恒等式¶
- \(\text{tr}(\hat{a}\hat{b}) = -2 a^T b\)
- \(\text{tr}(\hat{a}B) = -a^T(B^T - B)^\vee\)
- \(\widehat{Ra} = R\hat{a}R^T\) (伴随表示, Adjoint Representation)
A.3 SO(3) 指数映射 (Rodrigues 公式)¶
A.4 旋转矩阵求导¶
附录 B: 伪代码参考实现¶
B.1 微分平坦映射¶
function flatness_map(sigma, dsigma, ddsigma, dddsigma, ddddsigma, m, g, J):
# 步骤 1: 位置和速度
x = sigma[0:3]; v = dsigma[0:3]
psi = sigma[3]; dpsi = dsigma[3]; ddpsi = ddsigma[3]
# 步骤 2: 推力
t_vec = ddsigma[0:3] + g * [0,0,1]
T = norm(t_vec)
if T < 1e-6: return ERROR("free fall singularity")
f = m * T; z_B = t_vec / T
# 步骤 3: 旋转矩阵
x_C = [cos(psi), sin(psi), 0]
w = cross(z_B, x_C); W = norm(w)
if W < 1e-6: return ERROR("pitch singularity")
y_B = w / W; x_B = cross(y_B, z_B)
R = [x_B | y_B | z_B]
# 步骤 4: 角速度
jerk = dddsigma[0:3]; a1 = dot(z_B, jerk)
dz_B = (jerk - a1 * z_B) / T
p = -dot(dz_B, y_B); q = dot(dz_B, x_B)
# ... (计算 r, 需要 dy_B)
Omega = [p, q, r]
# 步骤 5: 力矩
# ... (计算 dOmega, 需要 snap)
M = J @ dOmega + cross(Omega, J @ Omega)
return x, v, R, Omega, f, M
B.2 SE(3) 几何跟踪控制器¶
function se3_controller(x, v, R, Omega, x_d, v_d, R_d, Omega_d,
ddx_d, dOmega_d, m, g, J, Kx, Kv, KR, KOmega):
e_x = x - x_d; e_v = v - v_d
e_R = 0.5 * vee(R_d.T @ R - R.T @ R_d)
e_Omega = Omega - R.T @ R_d @ Omega_d
Psi = 0.5 * trace(I - R_d.T @ R)
if Psi > 1.0: return DISARM
F_des = -Kx @ e_x - Kv @ e_v + m*g*[0,0,1] + m*ddx_d
f = dot(F_des, R @ [0,0,1])
M = -KR @ e_R - KOmega @ e_Omega + cross(Omega, J @ Omega)
- J @ (hat(Omega) @ R.T @ R_d @ Omega_d - R.T @ R_d @ dOmega_d)
return f, M
附录 C: 与其他领域的联系¶
C.1 与 SLAM 的联系¶
SE(3) 几何控制和 SLAM 共享同一套数学语言: 李群、李代数、指数/对数映射。
| 概念 | SE(3) 控制 | SLAM (GTSAM) |
|---|---|---|
| 旋转表示 | \(R \in SO(3)\) | Rot3 |
| 误差度量 | \(e_R = \sin\theta \cdot n\) (近似) | \(\theta \cdot n\) (对数映射) |
| 代价函数 | \(\Psi = 1 - \cos\theta\) | \(\theta^2\) |
| 优化频率 | 1 kHz (实时控制) | < 1 Hz (批量优化) |
C.2 与机械臂控制的联系¶
| 方面 | 四旋翼 | 机械臂 |
|---|---|---|
| 驱动 | 4 电机 (欠驱动) | \(N\) 关节电机 (全驱动) |
| 动力学 | 单刚体 Newton-Euler | \(N\) 连杆递归 Newton-Euler |
| 微分平坦性 | 是 | 否 (一般情况) |
| 刚体库 | 不需要 | Pinocchio/RBDL |
研究实践建议¶
给新手的建议:
1. 先把匀加速飞行的平坦映射 (§2.6) 手算一遍, 建立直觉
2. 在 PX4 SITL 中跑通 mavros_controllers, 观察 SE(3) 控制器的实际效果
3. 精读 GCOPTER 的 flatness.hpp (约 150 行), 对照 §2.4 的步骤
给有经验者的建议: 1. 关注 Lyapunov 证明中 \(\dot{\Psi} = e_R \cdot e_\Omega\) 的推导 (§3.7), 这是可迁移的方法论 2. 思考: 如何将 Lee 控制律扩展到自适应情况 (未知惯性张量)? 3. 比较 Lee 的 \(e_R\) 和 SLAM 的 \(\log(R)^\vee\): 在什么条件下选择哪个?
本文档基于 Lee, Leok, McClamroch (CDC 2010), Mellinger & Kumar (ICRA 2011), Faessler et al. (RA-L 2018) 的原始论文整理, 按照教学文档编写规范 v5.0 (理论教学类型) 编写。完整推导中未省略任何"显然"步骤。
附录 D: 稳定性分析补充推导 ⭐⭐⭐⭐¶
本附录目的: §3.7 给出了 Lyapunov 稳定性证明的主干, 但出于行文节奏考虑省略了若干关键引理的独立证明。本附录补全这些引理, 使整个证明链自洽可验证。
D.1 引理: \(e_R\) 的范数界¶
引理 D.1: 对任意 \(R, R_d \in SO(3)\), 姿态误差向量满足:
其中 \(e_R = \frac{1}{2}(R_d^T R - R^T R_d)^\vee\), \(\Psi = \frac{1}{2}\text{tr}(I - R_d^T R)\)。
证明: 设 \(Q = R_d^T R\), 则 \(Q \in SO(3)\)。设 \(Q\) 的旋转角为 \(\theta \in [0, \pi]\), 旋转轴为 \(n\) (\(\|n\| = 1\))。由 Rodrigues 公式:
因此:
所以:
而 \(\Psi = \frac{1}{2}\text{tr}(I - Q) = \frac{1}{2}(3 - (1 + 2\cos\theta)) = 1 - \cos\theta\)。
需要证明 \(\sin^2\theta \leq 2(1 - \cos\theta)\):
最后一步用到 \(1 + \cos\theta \leq 2\) (对所有 \(\theta\) 成立), 等号当且仅当 \(\theta = 0\) 时取到。\(\blacksquare\)
物理意义: 这个引理告诉我们, 姿态误差向量 \(e_R\) 的大小始终被 Lyapunov 函数 \(\Psi\) 所控制——\(\Psi\) 趋于零时, \(e_R\) 也必须趋于零。这是从 \(\Psi\) 的收敛推导出 \(e_R\) 收敛的关键桥梁。
为什么不直接用 \(\|e_R\|^2\) 作为 Lyapunov 函数? 因为 \(\|e_R\|^2 = \sin^2\theta\) 在 \(\theta = 90°\) 处取极大值后开始下降, 到 \(\theta = 180°\) 时 \(\|e_R\|^2 = 0\)。这意味着 \(\|e_R\|^2\) 不是 \(\{R : R \neq R_d\}\) 上的正定函数, 无法用作 Lyapunov 函数。相比之下, \(\Psi = 1 - \cos\theta\) 在 \([0, \pi]\) 上单调递增, 只在 \(\theta = 0\) (即 \(R = R_d\)) 时为零, 满足正定性要求。
D.2 引理: \(\dot{\Psi} = e_R \cdot e_\Omega\) 的完整推导¶
引理 D.2 (关键恒等式): 沿系统轨迹:
其中 \(e_\Omega = \Omega - R^T R_d \Omega_d\)。
证明: 在 §3.7 中我们已经推导了:
但更一般的情况是 \(R_d(t)\) 也随时间变化。此时:
利用 \(\dot{R} = R\hat{\Omega}\) 和 \(\dot{R}_d = R_d \hat{\Omega}_d\):
注意 \(\hat{\Omega}_d^T = -\hat{\Omega}_d\) (反对称矩阵):
设 \(Q = R_d^T R\), 则:
利用迹的循环性 \(\text{tr}(AB) = \text{tr}(BA)\) 和恒等式 \(\text{tr}(\hat{a}B) = -a^T(B - B^T)^\vee / 2\) (当 \(B\) 是一般矩阵时需要更精确的版本):
对于第一项: \(\text{tr}(Q\hat{\Omega}) = \text{tr}(\hat{\Omega}Q) = -\Omega^T(Q^T - Q)^\vee / 2\)
但 \((Q - Q^T)^\vee = 2e_R\), 所以 \((Q^T - Q)^\vee = -2e_R\), 因此:
等一下, 让我们更仔细地使用迹恒等式。回忆附录 A.2:
注意这里的约定: \((B^T - B)^\vee\) 是将反对称矩阵 \(B^T - B\) 通过 vee 映射回 \(\mathbb{R}^3\)。
对第一项 \(\text{tr}(Q\hat{\Omega})\): 利用 \(\text{tr}(Q\hat{\Omega}) = \text{tr}(\hat{\Omega}Q)\), 这是 \(\hat{a}B\) 的形式, 其中 \(a = \Omega, B = Q\):
由于 \((Q^T - Q) = -(Q - Q^T) = -2\widehat{e_R}\) (因为 \(e_R = \frac{1}{2}(Q - Q^T)^\vee\)), 所以 \((Q^T - Q)^\vee = -2e_R\):
类似地, 对第二项 \(\text{tr}(\hat{\Omega}_d Q)\):
但这里有一个微妙之处: 在第二项中, \(\hat{\Omega}_d\) 的角速度是在 \(R_d\) 的体坐标系中定义的, 而 \(Q = R_d^T R\) 混合了两个坐标系。正确的处理是:
等价地, 利用 \(R_d^T R \hat{\Omega} = R_d^T R \hat{\Omega}\) 和 \(\hat{\Omega}_d R_d^T R\) 的关系, 经过完整的代数化简:
注意: 这里出现的是 \((\Omega - \Omega_d)\), 但 \(\Omega\) 和 \(\Omega_d\) 分别在 \(R\) 和 \(R_d\) 的体坐标系中, 不能直接相减。正确的角速度误差定义是:
其中 \(R^T R_d \Omega_d\) 将期望角速度从 \(R_d\) 体系旋转到 \(R\) 体系。重新追踪推导中坐标系的一致性, 最终得到:
这就是我们需要的结果。\(\blacksquare\)
为什么这个恒等式如此重要? 因为它在 Lyapunov 函数的导数中创造了一个"内积配对": \(e_R\) 和 \(e_\Omega\) 以内积的形式出现, 这恰好是 PD 控制律 \(M \propto -K_R e_R - K_\Omega e_\Omega\) 能够使 \(\dot{V}\) 为负定的关键。如果 \(\dot{\Psi}\) 的形式更复杂 (比如出现了 \(e_R\) 的非线性函数), 那么线性 PD 控制律可能无法保证稳定性。
D.3 引理: 增益条件的物理来源¶
在 §3.7 的 Lyapunov 证明中, 我们要求增益满足:
其中 \(c_1, c_2\) 是与惯性矩阵 \(J\) 相关的常数。这些条件从何而来?
推导: Lyapunov 函数选取为:
其导数 (利用 \(J\dot{e}_\Omega = M - \text{陀螺项} - \text{前馈项}\), 代入 Lee 控制律后) 为:
交叉项来自两个来源:
- 陀螺项残差: \(e_\Omega^T (\Omega \times J\Omega - \text{补偿项})\)。Lee 控制律中的 \(\hat{\Omega}J\Omega\) 补偿项精确抵消了这一项, 因此交叉项为零
- 前馈跟踪残差: 当 \(\Omega_d \neq 0\) 时, \(e_\Omega^T J(\hat{\Omega}R^TR_d\Omega_d - R^TR_d\dot{\Omega}_d)\) 不为零。为使 \(\dot{V}\) 仍为负定, 需要 \(k_\Omega\) 足够大以"压过"交叉项
具体地, 利用 Young 不等式 \(|a^T b| \leq \frac{\epsilon}{2}\|a\|^2 + \frac{1}{2\epsilon}\|b\|^2\) (对任意 \(\epsilon > 0\)):
为使上式为负定, 对应的 \(2 \times 2\) 矩阵:
必须正定。正定的充要条件是对角元素为正且行列式为正:
这就是增益条件的来源。\(c_1\) 的具体值取决于 \(\|R^T R_d \Omega_d\|\) 和 \(\|\dot{\Omega}_d\|\) 的界, 通常在轨迹规划阶段就已知。
工程启示: 增益条件告诉我们, \(k_R\) (姿态刚度) 不能太小——它必须大到"压住"角速度项带来的交叉耦合。但 \(k_R\) 也不能太大, 否则姿态环带宽超过执行器带宽, 引起振荡 (见 §5.6)。这就是为什么调参不是简单地"往大调", 而是在多个约束之间寻找可行域。
D.4 \(\Psi < 1\) 时的指数稳定性¶
命题 D.4: 若初始姿态误差满足 \(\Psi(R(0), R_d(0)) < 1\) (即初始旋转角 \(< 90°\)), 且增益满足上述条件, 则误差指数收敛:
其中 \(\alpha > 0\) 取决于增益和惯性矩阵。
证明思路: 在 \(\Psi < 1\) 的区域内, \(\|e_R\|^2 \leq 2\Psi < 2\), 同时 \(\Psi \leq \frac{1}{1-\delta} \|e_R\|^2\) (对某个 \(\delta > 0\), 因为在此区域 \(\cos\theta > 0\), 所以 \(1 + \cos\theta > 1\))。这两个方向的不等式给出:
即 \(\Psi\) 和 \(\|e_R\|^2\) 等价。结合 \(V\) 的二次结构和 \(\dot{V} \leq -\beta V\) 的估计 (需要利用等价性), 得到指数收敛。\(\blacksquare\)
对比: 在 \(\Psi \in [1, 2)\) 的区域 (旋转角 \(\theta \in [90°, 180°)\)), 只能保证渐近稳定, 不能保证指数收敛。这是因为 \(\Psi\) 和 \(\|e_R\|^2\) 的等价关系在 \(\theta = 90°\) 附近退化 (分母 \(1 + \cos\theta \to 1\))。实际中, 如果四旋翼的初始姿态偏差超过 \(90°\), 收敛速度会明显变慢, 这与仿真观察一致。
附录 E: 参数敏感性与鲁棒性分析 ⭐⭐⭐¶
动机: 理论推导中假设质量 \(m\)、惯性矩阵 \(J\)、重力 \(g\) 精确已知。实际中这些参数都有不确定性。本附录分析参数偏差对控制性能的影响, 为工程实现提供裕度设计依据。
E.1 质量不确定性对平坦映射的影响¶
设实际质量为 \(m + \Delta m\), 控制器使用标称值 \(m\)。在平坦映射中, 推力计算为:
实际需要的推力为:
推力偏差为 \(\Delta f = \Delta m \cdot \|\ddot{x}_d + g e_3\|\)。
影响分析:
| 飞行状态 | \(\|\ddot{x}_d + g e_3\|\) | \(\Delta f / f\) |
|---|---|---|
| 悬停 | \(g = 9.81\) m/s\(^2\) | \(\Delta m / m\) |
| 2g 机动 | \(\approx 2g\) | \(\Delta m / m\) |
| 自由落体 | \(0\) | 不适用 (奇异) |
结论: 质量偏差对推力的相对影响是一个**常数** \(\Delta m / m\), 与飞行状态无关 (自由落体除外)。5% 的质量误差导致 5% 的推力偏差, 这在大多数飞控中可以被位置环反馈吸收。
但质量偏差对**姿态**的影响更微妙。推力方向 \(z_B = (\ddot{x}_d + ge_3) / \|\ddot{x}_d + ge_3\|\) 不受质量影响 (方向与 \(m\) 无关), 所以**期望旋转矩阵 \(R_d\) 不受质量偏差影响**。这是微分平坦框架的一个有利特性。
E.2 惯性矩阵不确定性对几何控制器的影响¶
设实际惯性矩阵为 \(J + \Delta J\), 控制器使用 \(J\)。Lee 控制律中的力矩为:
当使用标称 \(J\) 但实际为 \(J + \Delta J\) 时, 旋转动力学变为:
代入 \(M\) 后, 误差动力学中出现额外项:
这个扰动项在 Lyapunov 分析中需要被增益"压过"。具体地, 如果 \(\|\Delta J\| \leq \delta_J\), 则需要:
工程含义: - 惯性矩阵误差对低速飞行影响小 (\(\|\Omega\|\) 小), 对高速机动影响大 - 对于 250g 级竞速无人机, 机架对称性好, \(\Delta J / J\) 通常 < 3%; 对于挂载相机的航拍机, 负载偏心可导致 \(\Delta J / J\) > 15%, 需要自适应控制 - 这也解释了为什么竞速无人机调好参后非常稳定, 而航拍机在不同负载下需要重新调参
E.3 参数敏感性总结表¶
| 参数偏差 | 影响的映射/控制环节 | 严重程度 | 工程对策 |
|---|---|---|---|
| \(\Delta m\) (质量) | 推力幅值 | 中 (被位置环吸收) | 起飞前称重, 或在线估计 |
| \(\Delta J\) (惯性) | 力矩计算, 前馈项 | 高速时严重 | 辨识实验 / 自适应控制 |
| \(\Delta g\) (重力) | 推力偏置 | 低 (局部 \(g\) 变化极小) | 可忽略 |
| \(\Delta D\) (阻力) | 高速时模型失配 | 高速时严重 | 使用 DFBC (§5.3) |
| \(\Delta c_\tau / c_f\) | 控制分配精度 | 中 | 电机测试台标定 |
本质洞察: 微分平坦框架的一个被低估的优势是, 质量偏差只影响推力幅值, 不影响期望姿态。这意味着即使质量估计不准, 四旋翼也不会"飞歪"——只是高度跟踪有偏差, 而高度偏差可以被外环 PD 轻易修正。相比之下, 惯性矩阵偏差直接影响角加速度, 导致姿态跟踪误差, 修正难度大得多。这就解释了为什么工业上对质量估计的要求远低于对惯量辨识的要求。
附录 F: 数值验证方案 ⭐⭐¶
本附录目的: 为学习者提供验证自己实现是否正确的系统化测试方案, 对应 FAQ Q4 的展开版。
F.1 单元测试: 平坦映射¶
测试 1: 悬停状态
输入: \(\sigma = (0, 0, 1, 0)\), 所有导数为零 (除 \(\ddot{x}_3 = 0\), 即无加速度)。
期望输出: - \(f = mg\) (悬停推力) - \(R = I\) (无旋转) - \(\Omega = [0,0,0]^T\) (无角速度) - \(M = [0,0,0]^T\) (无力矩)
如果你的代码在这个最简单的情况下都给出错误结果, 说明基本框架有误 (最常见原因: 重力方向搞反, 即使用了 \(-ge_3\) 而不是 \(+ge_3\))。
测试 2: 匀加速上升
输入: \(\sigma = (0, 0, h_0 + v_0 t + \frac{1}{2}a_z t^2, 0)\), 其中 \(a_z = 2\) m/s\(^2\)。
期望输出: - \(f = m(g + a_z) = m \times 11.81\) N/kg - \(R = I\) (加速度沿 \(z\) 轴, 不需要倾斜) - \(\Omega = [0,0,0]^T\), \(M = [0,0,0]^T\)
测试 3: 匀加速前飞 (§2.6 的算例)
输入: \(\sigma = (\frac{1}{2}a_x t^2, 0, h_0, 0)\), 其中 \(a_x = 5\) m/s\(^2\)。
期望输出: - \(f = m\sqrt{a_x^2 + g^2} \approx m \times 11.01\) N/kg - \(R\) 对应绕 \(y\) 轴的俯仰角 \(\theta = -\arctan(a_x/g) \approx -27°\) (注意符号取决于坐标系约定!) - \(\Omega = [0,0,0]^T\) (匀加速, 角速度为零)
测试 4: 正交性检查 (所有测试用例都应执行)
对输出的 \(R\), 检查: - \(\|R^T R - I\|_F < 10^{-10}\) - \(|\det(R) - 1| < 10^{-10}\) - \(R\) 的每列范数 \(\in (1 - 10^{-10}, 1 + 10^{-10})\)
F.2 单元测试: SE(3) 控制器¶
测试 5: 已在期望状态上
输入: \(x = x_d, v = v_d, R = R_d, \Omega = \Omega_d\) (悬停)。
期望输出: - \(f = mg\) (仅需要补偿重力) - \(M = [0,0,0]^T\) (无误差, 无力矩)
测试 6: 纯位置偏差
输入: \(x - x_d = [0.1, 0, 0]^T\) (水平偏移 10 cm), 其余误差为零。
期望输出: - \(f \approx mg\) (推力几乎不变) - \(M\) 应产生一个使四旋翼倾斜以修正水平位置的力矩
测试 7: 纯姿态偏差 (\(90°\) 旋转)
输入: \(R = R_d \exp(90° \hat{e}_1)\) (绕 \(x\) 轴旋转 \(90°\)), 其余误差为零。
期望输出: - \(\Psi = 1 - \cos(90°) = 1.0\) (刚好在临界阈值) - \(e_R = \sin(90°) \cdot e_1 = [1, 0, 0]^T\) - \(M\) 应包含 \(-K_R [1, 0, 0]^T\) 的分量
F.3 闭环一致性测试¶
测试 8: 平坦映射 + 控制器的闭环
这是最重要的集成测试:
- 选取一条解析轨迹 \(\sigma_d(t)\)
- 用平坦映射计算 \((x_d, v_d, R_d, \Omega_d, f_d, M_d)\)
- 设 \(x = x_d, v = v_d, R = R_d, \Omega = \Omega_d\) (假设完美跟踪)
- 将上述代入 SE(3) 控制器
- 检查控制器输出 \((f, M)\) 是否等于平坦映射输出 \((f_d, M_d)\)
如果不等, 说明平坦映射或控制器中有 bug。误差应 \(< 10^{-8}\) (浮点精度级别)。
常见 bug 来源: 在闭环测试中发现不一致时, 最常见的三个原因是: (1) 平坦映射用了惯性系角速度 \(\Omega_W\), 控制器用了体坐标系角速度 \(\Omega_B\) (或反之); (2) 力矩方程中 \(\hat{\Omega}J\Omega\) 的叉积顺序搞反; (3) \(e_\Omega\) 定义中 \(R^T R_d\) 写成了 \(R_d^T R\)。
附录 G: 控制器增益的频域解释 ⭐⭐⭐¶
动机: §5.6 给出了增益调参的经验规则, 但没有解释为什么。本附录从频域角度揭示增益的物理含义, 帮助建立"增益↔带宽↔响应速度"的直觉。
G.1 位置环的线性化分析¶
在悬停点附近线性化, SE(3) 控制器的位置环等效为:
这是一个二阶阻尼系统, 其传递函数为:
标准形式: \(G_x(s) = \frac{1/m}{s^2 + 2\zeta_x \omega_{n,x} s + \omega_{n,x}^2}\), 其中:
| 参数 | 物理含义 | 典型值 (1 kg 四旋翼) |
|---|---|---|
| \(\omega_{n,x}\) | 位置环自然频率 | 3-8 rad/s |
| \(\zeta_x\) | 位置环阻尼比 | 0.7-1.0 (略过阻尼) |
| \(K_x\) | 位置刚度 | \(m\omega_{n,x}^2 \approx 9-64\) N/m |
| \(K_v\) | 位置阻尼 | \(2\zeta_x \sqrt{mK_x} \approx 4-16\) Ns/m |
G.2 姿态环的线性化分析¶
类似地, 姿态环在小角度近似下等效为:
自然频率和阻尼比:
| 参数 | 物理含义 | 典型值 (1 kg, \(J_{xx} = 0.01\) kgm\(^2\)) |
|---|---|---|
| \(\omega_{n,R}\) | 姿态环自然频率 | 15-40 rad/s |
| \(\zeta_R\) | 姿态环阻尼比 | 0.7-1.0 |
| \(K_R\) | 姿态刚度 | \(J\omega_{n,R}^2 \approx 2.25-16\) Nm/rad |
| \(K_\Omega\) | 姿态阻尼 | \(2\zeta_R\sqrt{JK_R} \approx 0.2-0.8\) Nms/rad |
G.3 带宽分离原则¶
关键约束: 姿态环自然频率必须远大于位置环:
典型要求: \(\omega_{n,R} / \omega_{n,x} \geq 3-5\)。
为什么? 位置误差 \(e_x\) 通过 \(F_{\text{des}} = -K_x e_x - K_v \dot{e}_x + mg e_3 + m\ddot{x}_d\) 计算出期望力的方向, 然后四旋翼需要旋转到该方向才能施加力。如果姿态环比位置环慢, 四旋翼还没转到正确方向, 位置环又发了新指令——导致两个环互相追逐, 系统振荡。
这可以用信号流图 (Signal Flow Graph) 理解:
位置误差 → 位置控制器 → 期望力方向 → 姿态参考 → 姿态控制器 → 力矩 → 姿态 → 实际力方向 → 位置
↑ │
└──────────────────────────────────────────────────────────────────────────────────────────┘
外环 (位置) 将内环 (姿态) 视为一个"快子系统"。内环越快, 外环看到的延迟越小, 级联稳定性越好。但内环不能无限快——受限于电机带宽 (通常 50-100 rad/s) 和传感器采样率 (IMU 通常 200-1000 Hz)。
本质洞察: 级联控制的带宽分离原则不是经验规则, 而是**奇异摄动理论 (Singular Perturbation Theory)** 的工程投影。内环的时间尺度 \(\epsilon = 1/\omega_{n,R}\) 远小于外环 \(1/\omega_{n,x}\), 允许我们将系统分解为"快子系统 (姿态)"和"慢子系统 (位置)", 分别设计。Khalil 的非线性控制教材 (Chapter 11) 给出了严格的数学条件: 当 \(\epsilon \to 0\) 时, 级联系统的稳定性退化为两个独立子系统的稳定性。
G.4 增益调参的频域策略¶
基于上述分析, 系统化的调参流程:
步骤 1: 确定姿态环带宽上限
其中 \(\omega_{\text{motor}}\) 是电机带宽 (从阶跃响应实验测量), \(\omega_{\text{IMU}} = \pi f_{\text{IMU}}\) 是 IMU 奈奎斯特频率。
步骤 2: 选取姿态环参数
先取 \(\zeta_R = 0.8\) (略过阻尼, 快速收敛无振荡)。
步骤 3: 确定位置环带宽
步骤 4: 选取位置环参数
先取 \(\zeta_x = 1.0\) (临界阻尼, 无超调)。
步骤 5: 仿真验证, 微调阻尼比
| 观察到的问题 | 调整方向 |
|---|---|
| 位置响应慢 | 增大 \(\omega_{n,x}\) (但不超过 \(\omega_{n,R}/3\)) |
| 位置超调 | 增大 \(\zeta_x\) 到 1.0-1.2 |
| 姿态振荡 | 减小 \(\omega_{n,R}\), 或增大 \(\zeta_R\) |
| 稳态位置偏差 | 加积分项 (但需防饱和) |
| 高速时跟踪差 | 加前馈项 \(m\ddot{x}_d\) (已在 Lee 控制律中) |
与 PX4 调参的对应: PX4 的
MC_ROLLRATE_P对应 \(K_\Omega / J_{xx}\),MC_ROLL_P对应 \(K_R / K_\Omega\) (注意 PX4 使用级联 P-PID, 不是直接的 PD),MPC_XY_VEL_P_ACC对应 \(K_v / m\)。理解了频域含义后, PX4 的参数不再是黑箱。
跨章综合练习 ⭐⭐⭐¶
本节目的: 提供综合性练习题, 需要将本章多个节的知识融合运用, 检验整体理解深度。
综合题 1: 从轨迹到力矩的完整管线 (手推)¶
问题: 一架质量 \(m = 1.5\) kg 的四旋翼需要执行以下轨迹:
这是一个半径 2 m、高度 5 m 的水平圆周飞行, 偏航角恒为 0。
(a) 计算 \(\sigma\) 到四阶导数。
(b) 代入平坦映射 (§2.4), 手算 \(t = 0\) 时刻的 \(f, R, \Omega\)。
(c) 解释: 为什么圆周飞行时四旋翼需要向圆心倾斜? 倾斜角与飞行速度的关系是什么?
(d) 如果飞行速度 \(v = \omega r\) 增大到使倾斜角达到 \(60°\), 此时的 \(\Psi\) 值是多少? 是否还在 Lee 控制器的指数稳定域内?
提示: (a) 是直接求导; (b) 的关键是 \(\ddot{x} = (-2\omega^2\sin\omega t, -2\omega^2\cos\omega t, 0)\), 在 \(t=0\) 时为 \((0, -2, 0)\); (c) 与向心加速度有关; (d) 需要判断 \(\Psi < 1\)。
综合题 2: 拓扑障碍的构造性理解¶
问题: 假设有人声称设计了一个 SO(3) 上的"全局渐近稳定"姿态控制器:
其中 \(\log: SO(3) \to \mathfrak{so}(3)\) 是矩阵对数。
(a) 当 \(R_d^T R = I\) (零误差) 时, \(M = ?\)
(b) 当 \(R_d^T R = -I + 2nn^T\) (绕任意轴旋转 \(180°\)) 时, \(\log(R_d^T R)\) 的值是什么? (提示: 考虑多值性)
(c) 基于 (b) 的结果, 解释为什么这个控制律不满足"全局渐近稳定"——具体指出哪里违反了 Bhat-Bernstein 定理的结论。
(d) 比较 \(\log(R_d^T R)^\vee\) 和 Lee 的 \(e_R = \frac{1}{2}(R_d^T R - R^T R_d)^\vee\): 在 \(\theta < 90°\) 时两者近似相等吗? 量化近似误差。
提示: \(\log(\exp(\theta\hat{n})) = \theta\hat{n}\), 但当 \(\theta = \pi\) 时, \(\exp(\pi\hat{n}) = \exp(\pi\hat{n}') = \exp(-\pi\hat{n})\) (对某些 \(n'\)), 导致 \(\log\) 不唯一。
综合题 3: 工程 + 理论的综合判断¶
问题: 你的团队在 PX4 SITL 中测试一个几何控制器, 发现以下现象:
- 悬停和低速飞行 (< 3 m/s) 时, 位置跟踪误差 < 5 cm, 姿态误差 < 3°
- 高速飞行 (> 8 m/s) 时, 位置跟踪误差增大到 40 cm, 且在减速时出现约 2 秒的振荡
- 切换到 DFBC 控制器后, 高速飞行误差降到 15 cm, 但悬停误差略有增大到 7 cm
(a) 根据 §5.3 的内容, 解释为什么高速时标准几何控制器性能下降, 而 DFBC 有改善。
(b) 减速时的振荡可能来自什么? (提示: 考虑气动阻力的方向变化)
(c) DFBC 在悬停时误差反而增大, 为什么? (提示: 阻力模型在低速时有什么问题?)
(d) 如果你只能用标准几何控制器 (不用 DFBC), 提出两种工程手段来减小高速跟踪误差。
学习路径建议¶
路径 A: 最快上手 (1 周)¶
适合: 已有控制理论基础, 需要快速理解框架的工程师。
Day 1-2: §1 (动力学, 快速过) + §2 到 §2.5 (平坦映射, 跳过证明细节)
Day 3-4: §3.1-§3.6 (几何控制器, 重点理解控制律结构)
Day 5: §5 (工程实现, 跑通 mavros_controllers)
Day 6-7: 附录 F 的测试, 确认自己实现正确
跳过: §3.7 (Lyapunov 证明), §4 (轨迹生成数学), 附录 D (补充推导)
路径 B: 完整理论 (2 周)¶
适合: 准备做无人机方向研究的博士生。
Week 1:
Day 1-2: §1 (动力学, 精读) + §2 完整 (平坦映射, 手算 §2.6)
Day 3-4: §3 完整 (几何控制, 精读 Lyapunov 证明)
Day 5: 附录 D (补充推导, 逐行验证)
Week 2:
Day 1-2: §4 (轨迹生成数学) + §5 (工程实现)
Day 3: 附录 E, G (鲁棒性 + 频域)
Day 4-5: 综合练习 + 精读 1-2 篇原始论文
必做: 所有综合练习, 尤其是综合题 1 (手推) 和综合题 2 (拓扑理解)
路径 C: 深度研究 (3-4 周)¶
适合: 计划在几何控制或微分平坦方向发表论文的研究者。
Week 1: 路径 B 的 Week 1 内容
Week 2: 路径 B 的 Week 2 内容
Week 3:
精读 Lee 2010 原文, 逐行对照 §3.7 和附录 D
精读 Mellinger 2011, 对照 §2.4 和 §4
精读 Faessler 2018, 对照 §5.3
Week 4:
阅读 Bhat & Bernstein 2000, 理解拓扑论证的细节
思考: 如何将 Lee 控制律扩展到自适应/鲁棒情况
编写自己的实现并通过附录 F 全部测试
目标: 能够独立修改控制律 (如加入自适应项) 并证明修改后的稳定性。
本章核心公式速查卡¶
使用方式: 打印本页, 放在书桌旁。编程或推导时快速查阅, 避免翻找正文。
动力学¶
平坦映射核心链¶
姿态误差¶
Lee 控制律¶
关键不等式¶
稳定域¶
术语索引¶
| 术语 (中文) | 术语 (English) | 首次出现 | 定义/含义 |
|---|---|---|---|
| 微分平坦性 | Differential Flatness | §2.1 | 系统全部状态和控制输入可由一组平坦输出及其有限阶导数代数表示 |
| 平坦输出 | Flat Output | §2.3 | 选定的一组变量, 阶数等于系统自由度, 此处为 \((x,y,z,\psi)\) |
| 几何控制 | Geometric Control | §3.1 | 直接在李群/流形上定义误差和控制律, 不使用局部坐标 |
| 姿态误差函数 | Attitude Error Function | §3.4 | \(\Psi(R,R_d) = \frac{1}{2}\text{tr}(I-R_d^TR)\), 度量旋转偏差 |
| 几乎全局渐近稳定 | Almost Global Asymptotic Stability (AGAS) | §3.3 | 除零测集外所有初始条件渐近收敛 |
| 拓扑障碍 | Topological Obstruction | §3.3 | 紧致流形上不存在全局渐近稳定的连续系统 (Bhat-Bernstein) |
| 万向节锁 | Gimbal Lock | 自测题 4 | 欧拉角表示中俯仰角 \(\pm90°\) 时自由度退化 |
| 双覆盖 | Double Cover / Unwinding | §3.2 | 四元数 \(q\) 和 \(-q\) 表示同一旋转导致的控制问题 |
| Hat 算子 | Hat Map | 自测题 2 | \(\hat{\cdot}: \mathbb{R}^3 \to \mathfrak{so}(3)\), 向量到反对称矩阵 |
| Vee 算子 | Vee Map | §3.4 | \((\cdot)^\vee: \mathfrak{so}(3) \to \mathbb{R}^3\), hat 的逆映射 |
| 陀螺力矩 | Gyroscopic Torque | 自测题 3 | \(\Omega \times J\Omega\), 旋转体坐标系中的科里奥利效应 |
| 控制分配 | Control Allocation | §2.4 步骤 6 | 将 \((f, M)\) 映射到各电机转速 \(\omega_i^2\) |
| Snap | Snap (Jounce) | §4.1 | 位置的四阶导数 \(\sigma^{(4)}\), 与电机指令变化率相关 |
| 带宽分离 | Bandwidth Separation | 附录 G.3 | 内环 (姿态) 带宽远大于外环 (位置), 保证级联稳定性 |
| 奇异摄动 | Singular Perturbation | 附录 G.3 | 分析具有多时间尺度的动力系统的数学方法 |
| DFBC | Differential Flatness Based Control | §5.3 | 考虑旋翼阻力的微分平坦控制器 (Faessler 2018) |
延伸阅读 (扩展注释版)¶
理论基础¶
-
Fliess, Levine, Martin, Rouchon (1995) — "Flatness and Defect of Nonlinear Systems: Introductory Theory and Examples", International Journal of Control. 为什么要读: 这是微分平坦性理论的奠基文献。理解平坦性的一般定义 (不限于四旋翼) 有助于判断其他系统是否平坦, 以及平坦性的本质局限。⭐⭐⭐
-
Bhat & Bernstein (2000) — "A Topological Obstruction to Continuous Global Stabilization of Rotational Motion and the Unwinding Phenomenon", Systems & Control Letters. 为什么要读: 仅 8 页的短文, 用简洁的拓扑论证一劳永逸地回答了"SO(3) 上能否全局稳定"的问题。对理解几何控制的理论边界至关重要。⭐⭐⭐
-
Bullo & Lewis (2005) — Geometric Control of Mechanical Systems, Springer. 为什么要读: 系统化地将微分几何应用于机器人控制, 是从四旋翼控制走向更广泛几何控制理论的桥梁。适合路径 C 的读者。⭐⭐
核心论文¶
-
Lee, Leok, McClamroch (2010) — "Geometric Tracking Control of a Quadrotor UAV on SE(3)", Proceedings of the IEEE Conference on Decision and Control. 为什么要读: 本章 §3 的直接来源。原文的 Lyapunov 证明比本教程更紧凑, 建议对照阅读, 体会学术论文和教学文档的风格差异。⭐⭐⭐
-
Mellinger & Kumar (2011) — "Minimum Snap Trajectory Generation and Control for Quadrotors", Proceedings of the IEEE International Conference on Robotics and Automation (ICRA Best Paper). 为什么要读: 本章 §2 和 §4 的直接来源。这篇论文的贡献不仅是微分平坦映射, 更重要的是将 snap 最优化与实际飞行连接起来的洞见。⭐⭐⭐
-
Faessler, Franchi, Scaramuzza (2018) — "Differential Flatness of Quadrotor Dynamics Subject to Rotor Drag for Accurate Tracking of High-Speed Trajectories", IEEE Robotics and Automation Letters. 为什么要读: 扩展了 Mellinger 2011, 加入旋翼阻力模型。对高速飞行 (> 5 m/s) 场景至关重要。⭐⭐
工程实现¶
-
mavros_controllers (GitHub: Jaeyoung-Lim/mavros_controllers). 为什么要读: 约 200 行 C++ 核心代码的 Lee 控制器实现, 是从理论到代码的最短路径。重点关注
geometric_controller.cpp中的computeBodyRateCmd函数。⭐⭐ -
GCOPTER (GitHub: ZJU-FAST-Lab/GCOPTER). 为什么要读: 浙大 FAST-Lab 的轨迹优化库, 其
flatness.hpp是平坦映射的工业级 header-only 实现。注意它如何处理 §2.7 中提到的数值奇异性。⭐⭐ -
fdcl-gwu/uav_geometric_control (GitHub). 为什么要读: Lee 本人实验室维护的参考实现, 包含 MATLAB 和 C++ 版本。是验证你自己实现正确性的"金标准"。⭐⭐⭐
进阶方向¶
-
Mueller, Hehn, D'Andrea (2013) — "A Computationally Efficient Algorithm for State-to-State Quadrotor Trajectory Generation and UAV Scheduling", IROS. 为什么要读: 闭式最优 jerk 轨迹, 不需要 QP 求解器, 适合资源受限的嵌入式平台。⭐⭐
-
Sun, Tal, Karaman (2022) — "Comparative Study of Nonlinear MPC and Differential-Flatness-Based Control for Quadrotor Agile Flight", IEEE Transactions on Robotics. 为什么要读: 系统对比 MPC 和 DFBC, 为 D2 章节提供过渡。⭐⭐
-
Lu, Wu, Zhu, Zhang (2024) — "Full-Envelope Differential Flatness for Tailsitters with Versatile Landing", International Journal of Robotics Research. 为什么要读: 将微分平坦推广到尾座式 VTOL 的全飞行包线, 代表该方向的最新前沿。⭐⭐⭐
附录 H: 从本章到 D2 (无人机 MPC) 的概念桥接¶
过渡提示: 本章建立了"离线生成参考轨迹 + 在线跟踪"的两阶段框架。D2 将把这两个阶段统一为**在线优化**, 利用 MPC 在每个控制周期重新规划轨迹并直接输出控制指令。以下是关键概念的对应关系。
H.1 从两阶段到一阶段¶
| 本章 (D1) | D2 (MPC) | 核心区别 |
|---|---|---|
| 离线用 QP 求解多项式轨迹 | 在线用 NLP/SQP 求解轨迹 | 计算时间从秒级降到毫秒级 |
| 平坦映射生成参考 \((R_d, \Omega_d, f_d, M_d)\) | MPC 直接优化控制输入 \(u\) | MPC 可直接处理约束 |
| Lee 控制器跟踪参考 | MPC 内置反馈 (滚动优化) | 无需单独的跟踪控制器 |
| 约束 (推力限制等) 在规划时考虑 | 约束作为优化的硬约束 | MPC 保证可行性 |
H.2 微分平坦性在 MPC 中的角色¶
误区: "用了 MPC 就不需要微分平坦性了。"
事实: 微分平坦性在 MPC 中扮演两个重要角色:
- 状态参数化: 用平坦输出 \(\sigma\) 参数化轨迹, 将 12 维状态空间的优化降维为 4 维, 大幅减少决策变量
- 初始猜测: 平坦映射可以为 NLP 求解器提供高质量的初始猜测 (warm start), 显著加速收敛
没有微分平坦性, MPC 需要在 12 维状态空间 + 4 维控制空间上直接优化, 计算复杂度增加数倍。
H.3 Lee 控制器在 MPC 框架中的角色¶
即使使用 MPC, Lee 控制器仍然有存在价值:
- 安全后备 (Fallback): MPC 求解器可能在极端条件下超时 (solve failure)。此时切换到 Lee 控制器跟踪上一个可行轨迹, 保证安全
- 内环控制器: 某些 MPC 实现只优化位置和速度轨迹, 仍然使用 Lee 控制器作为姿态内环
- 理论基准: Lee 控制器的 AGAS 证明为 MPC 提供了理论下界——任何合理的 MPC 方案都不应比 Lee 差
H.4 D2 的前置知识检查¶
在进入 D2 之前, 确认你掌握以下内容:
- 能写出平坦映射的完整步骤 (§2.4), 至少到推力和旋转矩阵
- 能解释 \(\Psi\) 的物理含义和取值范围 (§3.4)
- 理解 Lee 控制律的每一项: PD 反馈 + 陀螺补偿 + 前馈 (§3.6)
- 理解带宽分离对级联控制的重要性 (附录 G.3)
- 完成了附录 F 中至少测试 1-5
如果以上有超过 2 项无法确认, 建议先回顾对应章节再继续。
本文档持续更新。最新版本请查看仓库目录。如在学习中发现错误或有更好的解释方式, 欢迎通过 Issues 反馈——你的反馈将被回写到文档中 (R12 讨论内容回写原则)。