NDI 与 INDI 以及变体
## 非线性动态逆 (NDI) —— 从模型直接反解控制量
### 直觉
飞行控制的本质是:给定一个期望的运动(比如"我希望飞机以 30°/s 的速率滚转"),你要算出舵面该打多少度。
NDI 的做法很直接——把飞机的动力学模型"反过来用"。如果模型是准确的,那么从期望运动反推出的舵面指令就能精确实现目标。
### 推导
我们先把飞机写成一个**仿射系统**。仿射的意思是:状态的变化速率可以写成"仅与状态有关的部分 + 与控制输入成线性关系的部分":
$$
\begin{align*}
\dot x &= f(x) + g(x) \, u \tag{1}\\
y &= h(x) \tag{2}
\end{align*}
$$
这里的符号:$x$ 是飞机的状态(速度、姿态角等),$u$ 是控制输入(舵面偏角、油门等),$y$ 是我们关心的输出(比如滚转速率)。
对输出求导,看看 $y$ 的变化由什么决定:
$$
\dot y = \frac{\partial h}{\partial x} \dot x
= \frac{\partial h}{\partial x} f(x) + \frac{\partial h}{\partial x} g(x) \, u \tag{3}
$$
这个式子的结构很清晰:$\dot y$ 由两部分组成——一部分是飞机自身动力学贡献的($\frac{\partial h}{\partial x}f(x)$),另一部分是舵面贡献的($\frac{\partial h}{\partial x}g(x)u$)。
现在给定一个**期望的输出变化率** $\dot y_{\text{des}} \triangleq v$,我们就可以反解出 $u$:
$$
u = \left( \frac{\partial h}{\partial x} g \right)^{-1}
\bigl( v - \frac{\partial h}{\partial x} f(x) \bigr) \tag{4}
$$
这个公式的含义很直观:先用 $v$ 减去飞机自身动力学的贡献($v - \frac{\partial h}{\partial x}f(x)$),剩下的就是"需要舵面来产生的那部分效果",再除以舵面的控制效能($\frac{\partial h}{\partial x}g$),就得到了舵面指令。
### NDI 的两个硬性要求
从 (4) 可以直接看出:
1. 模型必须精确——$f(x)$ 和 $g(x)$ 如果差得远,算出的 $u$ 自然不准;
2. 系统必须是仿射的——$\frac{\partial h}{\partial x}g$ 必须可逆,如果 $u$ 不是线性进来的(非仿射),(4) 式根本没法写。
> 实际飞行器的动力学往往不能完美地写成仿射形式——比如气动系数本身就是舵面的非线性函数。这时候就需要另一种思路:**INDI**。
---
## 增量非线性动态逆 (INDI) —— 不去硬算全部,只修正"差多少"
### 直觉
NDI 的痛点是:你必须精确知道 $f(x)$(飞机自身动力学)才能反解。如果模型不准,算出来的 $u$ 可能一塌糊涂。
INDI 换个思路:**我不从零开始算控制量,我只需要知道"比现在多打或少打多少舵面"就够了。** 这个"增量"可以靠传感器反馈来修正,大幅降低对模型的依赖。
### 推导
先写出更一般的系统(允许非仿射):
$$
\begin{align*}
\dot x &= F(x, u) = f(x) + g(x, u) \tag{5}\\
y &= h(x) \tag{6}
\end{align*}
$$
对输出求导:
$$
\dot y = \frac{\partial h}{\partial x} \dot x
= \frac{\partial h}{\partial x} f(x) + \frac{\partial h}{\partial x} g(x, u)
= a(x) + b(x, u) \tag{7}
$$
这里关键的区别在于 $b(x, u) = \frac{\partial h}{\partial x}g(x, u)$——$u$ 不一定是线性出现的。
- 如果系统恰好是仿射的,$b(x,u) = \frac{\partial h}{\partial x}g(x)u$,依然可以像 NDI 那样直接求逆;
- 如果不是仿射的,$b(x,u)$ 对 $u$ 的依赖关系太复杂,直接求逆走不通。
这就是 INDI 要解决的问题。
---
设定期望输出变化率 $\dot y_{\text{des}} \triangleq v$,则有 $v = a(x) + b(x, u)$。
INDI 的核心思路是:**在当前工作点 $(x_0, u_0)$ 附近做泰勒展开,只保留一阶项**。这相当于用一条切线去近似原来的曲线——不太准,但在工作点附近够用了:
$$
\begin{align*}
v &\approx v_0+ \left. \frac{\partial (a + b)}{\partial x} \right|_{x_0, u_0} (x - x_0)+ \left. \frac{\partial b}{\partial u}\right|_{x_0, u_0} (u - u_0) \triangleq v_0 + A_0 (x - x_0) + B_0 (u - u_0) \tag{8}
\end{align*}
$$
其中:
$$
A_0 = \left. \frac{\partial (a + b)}{\partial x} \right|_{x_0, u_0},
B_0 = \left. \frac{\partial b}{\partial u} \right|_{x_0, u_0}
$$
这里 $A_0$ 刻画了"状态变化对输出变化率的影响",$B_0$ 刻画了"控制输入变化对输出变化率的影响"——也就是控制效能。
从 (8) 反解 $u$:
$$
u = u_0 + B_0^{-1} \bigl( v - v_0 - A_0 (x - x_0) \bigr) \tag{9}
$$
这个式子的含义是:**基准控制量 $u_0$ 加上一个修正量**。修正量里包含了三项信息——期望的变化 ($v$)、当前的变化 ($v_0$)、以及状态偏移可能带来的影响 ($A_0(x-x_0)$)。
### 关键简化:一个周期内状态变化很小
在飞控的典型采样周期(毫秒级)内,飞机状态不会突变,所以 $x \approx x_0$。令 $x - x_0 = 0$,(9) 大幅简化为:
$$
\boxed{ u = u_0 + B_0^{-1} (v - v_0) } \tag{10}
$$
这就是 INDI 的核心公式。 它只需要知道三样东西:
- $u_0$:上一时刻的控制输入(已知);
- $v_0$:当前输出变化率的估计(可以通过传感器或模型获得);
- $B_0$:当前的控制效能(可以从模型近似或在线辨识获得)。
跟 NDI 的 (4) 式对比:NDI 需要完整的 $f(x)$ 和 $g(x)$,而 INDI 只需要 $B_0$ 和 $v_0$。**模型依赖度大幅降低**。
---
## INDI 和 NDI 什么时候等价?