Luenberger Observer

一句话概括:
Luenberger Observer 是一种针对线性动态系统的状态估计器。
当系统内部状态 $x(t)$ 无法全部测量时,我们利用已知输入 $u(t)$、可测输出 $y(t)$ 和系统模型,构造一个“模拟系统”,并通过输出误差不断修正它,使估计状态 $\hat{x}(t)$ 收敛到真实状态 $x(t)$。

问题从哪里来?

在控制系统中,我们经常希望根据系统状态来设计控制律。

比如经典状态反馈:

$$
u(t) = -Kx(t)
$$

其中:

  • $x(t)$ 是系统状态;
  • $u(t)$ 是控制输入;
  • $K$ 是反馈增益矩阵。

如果我们知道完整状态 $x(t)$,很多控制问题会变得很清楚。

但是现实中,很多状态无法直接测量。

例如:

  • 电机系统中,位置可以测,速度未必方便测;
  • 加速器束流系统中,某些束流相空间变量无法直接实时测量;
  • 飞行器中,有些姿态角速度需要估计;
  • 电路系统中,有些电容电压、电感电流无法直接测。

于是问题来了:

如果我们只能测到输出 $y(t)$,能不能估计出完整状态 $x(t)$?

Luenberger Observer 就是为这个问题设计的。

线性系统的基本模型

先考虑连续时间线性时不变系统:

$$
\dot{x}(t) = Ax(t) + Bu(t)
$$

$$
y(t) = Cx(t)
$$

其中:

  • $x(t) \in \mathbb{R}^n$:系统状态;
  • $u(t) \in \mathbb{R}^m$:输入;
  • $y(t) \in \mathbb{R}^p$:输出;
  • $A \in \mathbb{R}^{n \times n}$:系统矩阵;
  • $B \in \mathbb{R}^{n \times m}$:输入矩阵;
  • $C \in \mathbb{R}^{p \times n}$:输出矩阵。

暂时先不考虑直接传递项 $D u(t)$,即:

$$
y(t) = Cx(t)
$$

如果有 $D$,模型就是:

$$
y(t) = Cx(t) + Du(t)
$$

这并不会改变核心思想。

最天真的想法:复制一个系统

既然系统模型是:

$$
\dot{x} = Ax + Bu
$$

那我们可以构造一个“估计系统”:

$$
\dot{\hat{x}} = A\hat{x} + Bu
$$

其中 $\hat{x}$ 是对真实状态 $x$ 的估计。

如果初始值刚好相同:

$$
\hat{x}(0) = x(0)
$$

那么显然:

$$
\hat{x}(t) = x(t)
$$

但现实中我们通常不知道 $x(0)$,所以 $\hat{x}(0)$ 往往不等于 $x(0)$。

定义估计误差:

$$
e(t) = x(t) - \hat{x}(t)
$$

真实系统:

$$
\dot{x} = Ax + Bu
$$

估计系统:

$$
\dot{\hat{x}} = A\hat{x} + Bu
$$

所以误差动态为:

$$
\dot{e}
= \dot{x} - \dot{\hat{x}}
$$

代入:

$$
\dot{e}
= (Ax + Bu) - (A\hat{x} + Bu)
$$

得到:

$$
\dot{e} = A(x - \hat{x})
$$

因此:

$$
\dot{e} = Ae
$$

误差是否会衰减,完全取决于 $A$ 的特征值。

如果 $A$ 本身稳定,那么误差会自然衰减。

但如果系统本身不稳定,误差会发散。

这说明:

仅仅复制一个系统是不够的。
我们需要利用测量输出 $y$ 来不断纠正估计值。

输出误差:我们到底能知道什么?

真实输出是:

$$
y = Cx
$$

估计输出是:

$$
\hat{y} = C\hat{x}
$$

两者之差为:

$$
y - \hat{y}
= Cx - C\hat{x}
$$

即:

$$
y - \hat{y} = C(x - \hat{x})
$$

因此:

$$
y - \hat{y} = Ce
$$

这个量非常关键。

虽然我们不知道完整的误差 $e = x - \hat{x}$,但我们能通过输出差看到它的一部分:

$$
y - C\hat{x}
$$

这个量告诉我们:

当前估计状态产生的输出,与真实测量输出之间相差多少。

如果这个差不为零,说明估计状态有问题。

于是自然想到:

能不能把输出误差反馈回估计系统,用来修正 $\hat{x}$?

这就是 Luenberger Observer 的核心思想。

Luenberger Observer 的构造

我们在简单复制系统的基础上加入修正项:

$$
\dot{\hat{x}} = A\hat{x} + Bu + L(y - \hat{y})
$$

其中:

$$
\hat{y} = C\hat{x}
$$

所以:

$$
\dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x})
$$

这就是连续时间 Luenberger Observer:

$$
\boxed{
\dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x})
}
$$

其中 $L$ 称为 observer gain,观测器增益矩阵。

维度为:

$$
L \in \mathbb{R}^{n \times p}
$$

因为:

  • $y - C\hat{x} \in \mathbb{R}^{p}$;
  • $\dot{\hat{x}} \in \mathbb{R}^{n}$;

所以 $L$ 要把输出误差映射成状态修正量。

误差动力学推导

现在我们推导估计误差 $e = x - \hat{x}$ 的动态。

真实系统:

$$
\dot{x} = Ax + Bu
$$

观测器:

$$
\dot{\hat{x}}
= A\hat{x} + Bu + L(y - C\hat{x})
$$

因为:

$$
y = Cx
$$

所以:

$$
\dot{\hat{x}}
= A\hat{x} + Bu + L(Cx - C\hat{x})
$$

即:

$$
\dot{\hat{x}}
= A\hat{x} + Bu + LC(x - \hat{x})
$$

也就是:

$$
\dot{\hat{x}}
= A\hat{x} + Bu + LCe
$$

误差为:

$$
e = x - \hat{x}
$$

所以:

$$
\dot{e} = \dot{x} - \dot{\hat{x}}
$$

代入:

$$
\dot{e}
= (Ax + Bu)

(A\hat{x} + Bu + LC(x - \hat{x}))
$$

展开:

$$
\dot{e}
= Ax + Bu - A\hat{x} - Bu - LC(x - \hat{x})
$$

消去 $Bu$:

$$
\dot{e}
= A(x - \hat{x}) - LC(x - \hat{x})
$$

所以:

$$
\dot{e}
= (A - LC)(x - \hat{x})
$$

即:

$$
\boxed{
\dot{e} = (A - LC)e
}
$$

这就是 Luenberger Observer 最核心的公式。

关键目标:让误差收敛到零

我们希望:

$$
\lim_{t \to \infty} e(t) = 0
$$

也就是说:

$$
\lim_{t \to \infty} \hat{x}(t) = x(t)
$$

误差系统是:

$$
\dot{e} = (A - LC)e
$$

其解为:

$$
e(t) = e^{(A - LC)t} e(0)
$$

因此,只要矩阵 $A - LC$ 是稳定的,误差就会收敛。

连续时间系统中,稳定意味着:

$$
\operatorname{Re}(\lambda_i(A - LC)) < 0
$$

也就是说,$A - LC$ 的所有特征值都必须在复平面的左半平面。

所以设计 observer 的问题变成:

选择 $L$,使得 $A - LC$ 的特征值位于我们希望的位置。

这与状态反馈控制很像。

状态反馈中,我们选择 $K$,使:

$$
A - BK
$$

稳定。

观测器中,我们选择 $L$,使:

$$
A - LC
$$

稳定。

二者具有对偶关系。

一个直观类比

状态反馈控制:

$$
u = -Kx
$$

闭环系统:

$$
\dot{x} = (A - BK)x
$$

通过 $K$ 改变系统极点。

Luenberger Observer:

$$
\dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x})
$$

误差系统:

$$
\dot{e} = (A - LC)e
$$

通过 $L$ 改变误差系统极点。

所以:

问题 控制器 观测器
目标 让状态稳定 让估计误差稳定
设计矩阵 $K$ $L$
闭环矩阵 $A - BK$ $A - LC$
需要条件 $(A,B)$ 可控 $(A,C)$ 可观

什么是可观测性?

我们不能凭空估计状态。

如果某些状态完全不会影响输出 $y$,那无论观测器怎么设计,都不可能估计它。

例如:

$$
\dot{x}_1 = x_1
$$

$$
\dot{x}_2 = x_2
$$

$$
y = x_1
$$

这里 $x_2$ 完全不影响输出。

你只能看到 $x_1$,永远看不到 $x_2$ 的任何痕迹。

因此 $x_2$ 不可观测。

可观测矩阵

对于系统:

$$
\dot{x} = Ax
$$

$$
y = Cx
$$

输出的导数包含更多状态信息。

首先:

$$
y = Cx
$$

一阶导数:

$$
\dot{y} = C\dot{x} = CAx
$$

二阶导数:

$$
\ddot{y} = CA\dot{x} = CA^2x
$$

继续下去:

$$
y^{(k)} = CA^k x
$$

如果我们能从:

$$
y, \dot{y}, \ddot{y}, \cdots, y^{(n-1)}
$$

中恢复出 $x$,系统就是可观测的。

把这些方程堆叠起来:

$$
\begin{bmatrix}
y \
\dot{y} \
\ddot{y} \
\vdots \
y^{(n-1)}
\end{bmatrix}

\begin{bmatrix}
C \
CA \
CA^2 \
\vdots \
CA^{n-1}
\end{bmatrix}
x
$$

定义可观测矩阵:

$$
\mathcal{O}

\begin{bmatrix}
C \
CA \
CA^2 \
\vdots \
CA^{n-1}
\end{bmatrix}
$$

如果:

$$
\operatorname{rank}(\mathcal{O}) = n
$$

那么系统完全可观测。

也就是说:

$$
\boxed{
(A,C) \text{ observable}
\iff
\operatorname{rank}
\begin{bmatrix}
C \
CA \
\vdots \
CA^{n-1}
\end{bmatrix}
= n
}
$$

只有在这个条件满足时,我们才能任意配置 $A-LC$ 的极点。

为什么 $L$ 能改变误差系统的极点?

误差系统是:

$$
\dot{e} = (A - LC)e
$$

我们希望配置:

$$
\lambda(A - LC)
$$

这里 $L$ 的作用类似控制增益。

使用对偶性可以更清楚地看。

矩阵 $A - LC$ 的转置为:

$$
(A - LC)^T = A^T - C^T L^T
$$

令:

$$
\tilde{A} = A^T
$$

$$
\tilde{B} = C^T
$$

$$
\tilde{K} = L^T
$$

那么:

$$
A^T - C^T L^T

\tilde{A} - \tilde{B}\tilde{K}
$$

这就是一个状态反馈极点配置问题。

因此观测器极点配置问题:

$$
A - LC
$$

等价于控制问题:

$$
A^T - C^T L^T
$$

所以只要 $(A^T, C^T)$ 可控,就能配置极点。

而:

$$
(A^T, C^T) \text{ controllable}
\iff
(A,C) \text{ observable}
$$

这就是控制与观测的对偶性。

一个二阶例子:从位置估计速度

考虑一个最经典的二阶系统。

状态:

$$
x =
\begin{bmatrix}
x_1 \
x_2
\end{bmatrix}
$$

其中:

  • $x_1$ 是位置;
  • $x_2$ 是速度。

系统为:

$$
\dot{x}_1 = x_2
$$

$$
\dot{x}_2 = u
$$

写成矩阵:

$$
\dot{x}

\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix}
x
+
\begin{bmatrix}
0 \
1
\end{bmatrix}
u
$$

输出只测位置:

$$
y = x_1
$$

因此:

$$
C =
\begin{bmatrix}
1 & 0
\end{bmatrix}
$$

也就是:

$$
A =
\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix},
\quad
B =
\begin{bmatrix}
0 \
1
\end{bmatrix},
\quad
C =
\begin{bmatrix}
1 & 0
\end{bmatrix}
$$

我们只能测位置 $x_1$,不能直接测速度 $x_2$。

目标:

通过位置测量 $y$ 和输入 $u$,估计速度 $x_2$。

检查可观测性

可观测矩阵为:

$$
\mathcal{O}

\begin{bmatrix}
C \
CA
\end{bmatrix}
$$

计算:

$$
C =
\begin{bmatrix}
1 & 0
\end{bmatrix}
$$

$$
CA =
\begin{bmatrix}
1 & 0
\end{bmatrix}
\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix}

\begin{bmatrix}
0 & 1
\end{bmatrix}
$$

所以:

$$
\mathcal{O}

\begin{bmatrix}
1 & 0 \
0 & 1
\end{bmatrix}
$$

显然:

$$
\operatorname{rank}(\mathcal{O}) = 2
$$

所以系统可观测。

这说明:

虽然速度 $x_2$ 没有直接测量,但它会影响位置变化,因此可以从位置历史中估计出来。

构造观测器

设:

$$
L =
\begin{bmatrix}
l_1 \
l_2
\end{bmatrix}
$$

观测器为:

$$
\dot{\hat{x}}

A\hat{x} + Bu + L(y - C\hat{x})
$$

展开:

$$
\begin{bmatrix}
\dot{\hat{x}}_1 \
\dot{\hat{x}}_2
\end{bmatrix}

\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix}
\begin{bmatrix}
\hat{x}_1 \
\hat{x}_2
\end{bmatrix}
+
\begin{bmatrix}
0 \
1
\end{bmatrix}
u
+
\begin{bmatrix}
l_1 \
l_2
\end{bmatrix}
(y - \hat{x}_1)
$$

因此:

$$
\dot{\hat{x}}_1

\hat{x}_2 + l_1(y - \hat{x}_1)
$$

$$
\dot{\hat{x}}_2

u + l_2(y - \hat{x}_1)
$$

这非常直观。

  • 如果估计位置 $\hat{x}_1$ 比真实测量 $y$ 小,那么 $y-\hat{x}_1>0$;
  • 观测器会调整位置估计和速度估计;
  • $l_1$ 决定位置估计修正强度;
  • $l_2$ 决定速度估计修正强度。

误差系统

误差系统为:

$$
\dot{e} = (A - LC)e
$$

计算:

$$
LC

\begin{bmatrix}
l_1 \
l_2
\end{bmatrix}
\begin{bmatrix}
1 & 0
\end{bmatrix}

\begin{bmatrix}
l_1 & 0 \
l_2 & 0
\end{bmatrix}
$$

因此:

$$
A - LC

\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix}

\begin{bmatrix}
l_1 & 0 \
l_2 & 0
\end{bmatrix}
$$

得到:

$$
A - LC

\begin{bmatrix}
-l_1 & 1 \
-l_2 & 0
\end{bmatrix}
$$

其特征方程为:

$$
\det(sI - (A-LC)) = 0
$$

先写:

$$
sI - (A-LC)

\begin{bmatrix}
s & 0 \
0 & s
\end{bmatrix}

\begin{bmatrix}
-l_1 & 1 \
-l_2 & 0
\end{bmatrix}
$$

所以:

$$
sI - (A-LC)

\begin{bmatrix}
s+l_1 & -1 \
l_2 & s
\end{bmatrix}
$$

行列式:

$$
\det
\begin{bmatrix}
s+l_1 & -1 \
l_2 & s
\end{bmatrix}

(s+l_1)s - (-1)l_2
$$

即:

$$
s^2 + l_1s + l_2
$$

所以观测误差特征方程为:

$$
\boxed{
s^2 + l_1s + l_2 = 0
}
$$

如果我们希望观测器极点为:

$$
s = -\alpha, \quad s = -\beta
$$

则目标特征多项式为:

$$
(s+\alpha)(s+\beta)

s^2 + (\alpha+\beta)s + \alpha\beta
$$

比较系数:

$$
l_1 = \alpha + \beta
$$

$$
l_2 = \alpha\beta
$$

例如希望极点在:

$$
-5,\ -6
$$

则:

$$
l_1 = 11
$$

$$
l_2 = 30
$$

于是:

$$
L =
\begin{bmatrix}
11 \
30
\end{bmatrix}
$$

观测器为:

$$
\dot{\hat{x}}_1

\hat{x}_2 + 11(y-\hat{x}_1)
$$

$$
\dot{\hat{x}}_2

u + 30(y-\hat{x}_1)
$$

估计误差将按照极点 $-5$ 和 $-6$ 对应的速度衰减。

极点应该放在哪里?

一个常见经验是:

观测器极点通常比控制器极点快 2 到 10 倍。

原因是:

  • 如果观测器太慢,状态估计滞后,控制器会用错误状态;
  • 如果观测器太快,会放大测量噪声;
  • 太快的极点会让 $L$ 很大,导致噪声敏感和数值问题。

假设控制闭环极点大约在:

$$
-1,\ -2
$$

可以把观测器极点放在:

$$
-5,\ -6
$$

或者:

$$
-10,\ -12
$$

但不是越快越好。

噪声问题:为什么不能把 $L$ 取得无限大?

观测器修正项是:

$$
L(y - C\hat{x})
$$

如果测量中有噪声:

$$
y = Cx + v
$$

其中 $v$ 是测量噪声。

那么修正项变成:

$$
L(Cx + v - C\hat{x})
$$

即:

$$
LC(x-\hat{x}) + Lv
$$

噪声会被 $L$ 放大。

如果 $L$ 很大,那么即使 $v$ 很小,$Lv$ 也可能很大。

所以:

  • 大 $L$:收敛快,但噪声敏感;
  • 小 $L$:噪声不敏感,但收敛慢。

这就是 observer 设计的基本权衡。

如果要系统地处理噪声,通常会进一步引入 Kalman Filter。

可以粗略理解为:

Luenberger Observer 是确定性状态观测器;
Kalman Filter 是在随机噪声假设下最优选择 $L$ 的观测器。

离散时间 Luenberger Observer

很多实际控制系统是数字控制,因此需要离散时间形式。

离散系统:

$$
x_{k+1} = Ax_k + Bu_k
$$

$$
y_k = Cx_k
$$

构造观测器:

$$
\boxed{
\hat{x}_{k+1}

A\hat{x}_k + Bu_k + L(y_k - C\hat{x}_k)
}
$$

误差:

$$
e_k = x_k - \hat{x}_k
$$

则:

$$
e_{k+1}

x_{k+1} - \hat{x}_{k+1}
$$

代入:

$$
e_{k+1}

(Ax_k + Bu_k)

(A\hat{x}_k + Bu_k + L(Cx_k - C\hat{x}_k))
$$

得到:

$$
e_{k+1}

(A - LC)(x_k-\hat{x}_k)
$$

即:

$$
\boxed{
e_{k+1} = (A - LC)e_k
}
$$

离散时间稳定条件为:

$$
|\lambda_i(A - LC)| < 1
$$

也就是说,所有观测器误差极点必须在单位圆内。

带直接传递项 $D$ 的情况

如果系统为:

$$
\dot{x} = Ax + Bu
$$

$$
y = Cx + Du
$$

那么估计输出为:

$$
\hat{y} = C\hat{x} + Du
$$

观测器为:

$$
\dot{\hat{x}}

A\hat{x} + Bu + L(y - \hat{y})
$$

也就是:

$$
\boxed{
\dot{\hat{x}}

A\hat{x} + Bu + L(y - C\hat{x} - Du)
}
$$

误差动态仍然是:

$$
\dot{e} = (A - LC)e
$$

因为真实输出和估计输出中的 $Du$ 会相互抵消。

与状态反馈组合:Observer-Based Control

如果我们本来希望用状态反馈:

$$
u = -Kx
$$

但测不到 $x$,则可以使用估计状态:

$$
u = -K\hat{x}
$$

于是系统变成:

$$
\dot{x} = Ax + Bu
$$

$$
u = -K\hat{x}
$$

观测器:

$$
\dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x})
$$

这就是基于观测器的控制。

一个重要结论叫 分离原理

分离原理

对于线性系统,如果:

  • $(A,B)$ 可控;
  • $(A,C)$ 可观;

那么可以分别设计:

  1. 状态反馈增益 $K$,使 $A-BK$ 稳定;
  2. 观测器增益 $L$,使 $A-LC$ 稳定。

二者可以分开设计。

闭环整体系统的极点由两部分组成:

$$
\lambda(A-BK)
\quad \text{和} \quad
\lambda(A-LC)
$$

因此控制器和观测器可以相对独立地调参。

分离原理的简单推导

系统:

$$
\dot{x} = Ax + Bu
$$

控制律:

$$
u = -K\hat{x}
$$

所以:

$$
\dot{x} = Ax - BK\hat{x}
$$

由于:

$$
e = x - \hat{x}
$$

所以:

$$
\hat{x} = x - e
$$

代入:

$$
\dot{x}

Ax - BK(x-e)
$$

得到:

$$
\dot{x}

(A-BK)x + BKe
$$

另一方面,误差动态仍然是:

$$
\dot{e} = (A-LC)e
$$

于是组合系统为:

$$
\frac{d}{dt}
\begin{bmatrix}
x \
e
\end{bmatrix}

\begin{bmatrix}
A-BK & BK \
0 & A-LC
\end{bmatrix}
\begin{bmatrix}
x \
e
\end{bmatrix}
$$

这个矩阵是上三角块矩阵。

因此整体特征值为:

$$
\lambda(A-BK)
\cup
\lambda(A-LC)
$$

这说明控制极点和观测器极点可以分开设计。

Luenberger Observer 的本质

从本质上看,Luenberger Observer 做了两件事:

第一,模型预测

如果没有测量误差修正,它只是根据系统模型往前推:

$$
A\hat{x} + Bu
$$

这叫 model prediction。

第二,输出误差校正

它计算:

$$
y - C\hat{x}
$$

然后用:

$$
L(y - C\hat{x})
$$

修正估计状态。

所以可以把它理解成:

$$
\text{估计更新}

\text{模型预测}
+
\text{测量校正}
$$

这和 Kalman Filter 的结构非常像。

为什么不是直接用 $C^{-1}y$?

有人可能会问:

既然:

$$
y = Cx
$$

那能不能直接:

$$
x = C^{-1}y
$$

通常不行。

原因有三点。

第一,$C$ 往往不是方阵

如果状态维度 $n=4$,输出只有 $p=1$,那么:

$$
C \in \mathbb{R}^{1 \times 4}
$$

根本不可逆。

第二,瞬时输出不包含完整状态

虽然某一时刻 $y$ 不足以恢复 $x$,但一段时间内的输出变化可能包含状态信息。

这就是可观测性的思想。

第三,噪声会让直接反演很糟糕

直接求逆通常对噪声极其敏感。

Observer 相当于利用动态模型对噪声进行了一定滤波。

和 Kalman Filter 的关系

Luenberger Observer:

$$
\dot{\hat{x}}

A\hat{x} + Bu + L(y - C\hat{x})
$$

Kalman Filter 的结构也类似:

$$
\dot{\hat{x}}

A\hat{x} + Bu + K_f(y - C\hat{x})
$$

区别在于:

  • Luenberger Observer 中 $L$ 通常通过极点配置等方法人工设计;
  • Kalman Filter 中 $K_f$ 根据过程噪声和测量噪声统计特性计算得到。

如果系统噪声模型为:

$$
\dot{x} = Ax + Bu + w
$$

$$
y = Cx + v
$$

其中:

  • $w$ 是过程噪声;
  • $v$ 是测量噪声;

Kalman Filter 会在给定噪声协方差 $Q, R$ 的情况下,选择一个最优增益,使估计误差协方差最小。

因此可以说:

Kalman Filter 是带随机最优意义的 Luenberger Observer。

常见设计步骤

设计 Luenberger Observer 的一般流程如下。

Step 1:建立状态空间模型

写出:

$$
\dot{x} = Ax + Bu
$$

$$
y = Cx
$$

Step 2:检查可观测性

构造:

$$
\mathcal{O}

\begin{bmatrix}
C \
CA \
\vdots \
CA^{n-1}
\end{bmatrix}
$$

检查:

$$
\operatorname{rank}(\mathcal{O}) = n
$$

Step 3:选择观测器极点

选择目标极点:

$$
p_1, p_2, \cdots, p_n
$$

连续系统要求:

$$
\operatorname{Re}(p_i) < 0
$$

离散系统要求:

$$
|p_i| < 1
$$

Step 4:求解 $L$

使:

$$
\lambda(A-LC) = {p_1,p_2,\cdots,p_n}
$$

Step 5:实现观测器

连续时间:

$$
\dot{\hat{x}} = A\hat{x} + Bu + L(y-C\hat{x})
$$

离散时间:

$$
\hat{x}_{k+1}

A\hat{x}_k + Bu_k + L(y_k-C\hat{x}_k)
$$

Python 小例子:位置测量估计速度

下面是一个简单仿真,展示如何用 Luenberger Observer 从位置测量估计速度。

系统:

$$
\dot{x}_1 = x_2
$$

$$
\dot{x}_2 = u
$$

测量:

$$
y = x_1
$$

观测器极点选:

$$
-5, -6
$$

所以:

$$
L =
\begin{bmatrix}
11 \
30
\end{bmatrix}
$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import numpy as np
import matplotlib.pyplot as plt

dt = 0.001
T = 5.0
N = int(T / dt)

A = np.array([[0, 1],
[0, 0]], dtype=float)

B = np.array([[0],
[1]], dtype=float)

C = np.array([[1, 0]], dtype=float)

L = np.array([[11],
[30]], dtype=float)

x = np.array([[1.0],
[0.0]])

xhat = np.array([[0.0],
[2.0]])

xs = []
xhats = []
ts = []

for k in range(N):
t = k * dt

u = np.array([[np.sin(2 * np.pi * 0.5 * t)]])

y = C @ x

# true system
xdot = A @ x + B @ u

# observer
yhat = C @ xhat
xhat_dot = A @ xhat + B @ u + L @ (y - yhat)

x = x + dt * xdot
xhat = xhat + dt * xhat_dot

ts.append(t)
xs.append(x.flatten())
xhats.append(xhat.flatten())

xs = np.array(xs)
xhats = np.array(xhats)

plt.figure(figsize=(10, 6))

plt.subplot(2, 1, 1)
plt.plot(ts, xs[:, 0], label="true position x1")
plt.plot(ts, xhats[:, 0], "--", label="estimated position xhat1")
plt.legend()
plt.grid(True)

plt.subplot(2, 1, 2)
plt.plot(ts, xs[:, 1], label="true velocity x2")
plt.plot(ts, xhats[:, 1], "--", label="estimated velocity xhat2")
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

你会看到,即使初始估计是错的,$\hat{x}_1$ 和 $\hat{x}_2$ 也会逐渐追上真实状态。

这个例子的物理直觉

真实系统是:

$$
\dot{x}_1 = x_2
$$

如果只能测 $x_1$,那么速度其实隐藏在位置变化率里。

观测器做的事情类似于:

  1. 根据当前速度估计 $\hat{x}_2$ 预测位置变化;
  2. 发现预测位置 $\hat{x}_1$ 和真实测量位置 $y$ 有差;
  3. 用这个差反过来修正速度估计 $\hat{x}_2$。

如果预测位置总是落后真实位置,说明速度估计可能偏小;

如果预测位置总是超前真实位置,说明速度估计可能偏大。

因此即使速度没被直接测量,也能通过位置误差逐渐估计出来。

Luenberger Observer 的局限

Luenberger Observer 非常优雅,但也有局限。

1. 依赖模型准确性

如果 $A,B,C$ 模型误差很大,估计也会偏。

2. 对噪声没有最优处理

它可以处理一定噪声,但 $L$ 的设计不是统计最优。

3. 标准形式主要针对线性系统

非线性系统需要扩展形式,比如:

  • Extended Kalman Filter;
  • Extended Luenberger Observer;
  • High-gain Observer;
  • Sliding Mode Observer;
  • Moving Horizon Estimator。

4. 必须满足可观测性

不可观测状态无法被估计。

一个更抽象的理解

Luenberger Observer 可以看成是在状态空间中运行的一个动态滤波器。

它不是简单地从当前输出 $y(t)$ 算出 $x(t)$,而是利用整个动态过程:

$$
u(\tau), y(\tau), \quad 0 \le \tau \le t
$$

来逐渐恢复状态。

更深一点说:

  • 输出 $y$ 是状态 $x$ 的投影;
  • 系统矩阵 $A$ 会让状态在不同方向之间耦合;
  • 随着时间演化,不可直接测量的状态会通过动力学影响可测输出;
  • 观测器利用这种影响,把隐藏状态“反推”出来。

这就是“观测”的本质。

最核心公式总结

系统:

$$
\dot{x} = Ax + Bu
$$

$$
y = Cx
$$

观测器:

$$
\boxed{
\dot{\hat{x}}

A\hat{x}
+
Bu
+
L(y-C\hat{x})
}
$$

估计误差:

$$
e = x - \hat{x}
$$

误差动态:

$$
\boxed{
\dot{e}

(A-LC)e
}
$$

收敛条件:

$$
\boxed{
\operatorname{Re}(\lambda_i(A-LC)) < 0
}
$$

可观测性条件:

$$
\boxed{
\operatorname{rank}
\begin{bmatrix}
C \
CA \
CA^2 \
\vdots \
CA^{n-1}
\end{bmatrix}
= n
}
$$

离散时间观测器:

$$
\boxed{
\hat{x}_{k+1}

A\hat{x}_k
+
Bu_k
+
L(y_k-C\hat{x}_k)
}
$$

离散误差动态:

$$
\boxed{
e_{k+1}

(A-LC)e_k
}
$$

离散稳定条件:

$$
\boxed{
|\lambda_i(A-LC)| < 1
}
$$

最后用一句话重新理解

Luenberger Observer 的思想可以压缩成一句话:

用系统模型预测状态,用输出误差修正预测,使估计误差按照人为设计的稳定动态衰减。

或者更口语一点:

我先根据模型猜系统内部现在是什么状态;
再看这个猜测产生的输出和真实测量差多少;
然后按一定增益把这个差反馈回去修正猜测;
只要系统可观测、增益设计合理,猜测就会越来越接近真实状态。

这就是 Luenberger Observer。