2、线性系统理论基础:状态空间方程、能控性与能观性
好,咱们进入正题。这一章是后面所有观测器设计的基石。说白了,你如果不懂状态空间方程,后面那些卡尔曼滤波、龙伯格观测器,你根本玩不转。我当年刚接触电机控制时,也跳过这部分直接看观测器,结果一头雾水,又乖乖回来补课。
2.1 状态空间方程——系统的“内部画像”
咱们做电机控制,传统上喜欢用传递函数。传递函数看的是输入输出关系,像个黑盒子。但状态空间方程不一样,它把系统内部的状态变量全给你亮出来了。
一个连续线性时不变系统,标准写法是这样的:
dx/dt = A·x + B·u
y = C·x + D·u
这里:
- x 是状态向量。比如电机的电流、转速、位置,这些都是状态。
- u 是输入向量。比如你给的电压指令。
- y 是输出向量。比如你传感器测到的电流值。
- A 是系统矩阵。描述状态之间怎么互相影响。
- B 是输入矩阵。描述输入怎么影响状态。
- C 是输出矩阵。描述哪些状态能被你看到。
- D 是前馈矩阵。大多数物理系统里它是0。
举个例子,一个直流电机的电枢回路:
状态变量:x = [i_a; ω] (电枢电流、转速)
输入:u = V_a (电枢电压)
输出:y = i_a (只测电流)
A = [-R/L -K_e/L; K_t/J -B/J]
B = [1/L; 0]
C = [1 0]
你看,A矩阵里 -R/L 是电流自衰减,-K_e/L 是反电动势对电流的影响。这些物理意义清清楚楚。我个人习惯,拿到一个新系统,第一件事就是把A、B、C矩阵写出来,心里就有底了。
2.2 能控性——你能“指挥”系统吗?
能控性,说白了就是:你能不能通过输入u,把系统从任意初始状态,拽到任意目标状态?
你想想看,如果你的电机堵转了,你还能不能通过电压指令让它转起来?如果能,那就是能控。如果不能,那就是失控了。
判断方法很简单,构造能控性矩阵:
Q_c = [B A·B A²·B ... Aⁿ⁻¹·B]
如果这个矩阵满秩(秩等于n,n是状态维数),那系统就是能控的。
我在项目中遇到过一件事。有一次设计一个双惯量系统的观测器,怎么调参数都不对。后来一算能控性矩阵,发现秩亏了。原来是我把两个惯量的位置都当成了状态,但输入只能作用在一个惯量上,另一个根本控不了。嗯,这就是典型的能控性不足。
2.3 能观性——你能“看到”系统吗?
能观性和能控性是对偶的。它问的是:通过一段时间的输出y和输入u,你能不能唯一确定系统的初始状态?
说白了,就是你的传感器够不够用。你只测了电流,能不能反推出转速?如果能,那转速就是能观的。
判断方法:构造能观性矩阵:
Q_o = [C; C·A; C·A²; ...; C·Aⁿ⁻¹]
满秩则能观。
我记得有一次做无速度传感器控制,只测电流,想观测转速。一开始模型建得挺漂亮,但仿真就是不对。一算能观性矩阵,发现在某些转速下矩阵接近奇异。这就是为什么无速度传感器控制在零速附近很难搞——能观性变差了。
2.4 离散化——从连续到数字
咱们的控制器是数字的,跑在DSP或MCU上。所以连续的状态空间方程要离散化。
标准做法:
x(k+1) = A_d·x(k) + B_d·u(k)
y(k) = C·x(k) + D·u(k)
其中:
- A_d = e^(A·T_s),T_s是采样周期
- B_d = ∫₀ᵀˢ e^(A·τ) dτ · B
实际工程中,没人手算这个。Matlab里用 c2d(sys, Ts, 'zoh') 就行。我建议用零阶保持器(zoh)方法,因为它最符合实际——你在一个采样周期内保持输出电压不变。
2.5 能控性能观性与采样周期的关系
这里有个容易被忽略的点:连续系统能控能观,离散后不一定。
比如一个连续系统,采样周期选得不好,刚好在某个模态的振荡周期整数倍上,那这个模态在离散域里就看不到了。这就是所谓的“采样盲区”。
我建议:
- 采样周期不要太大,避免丢失高频信息
- 采样周期也不要太小,否则计算量太大,而且数值稳定性会变差
- 一般取系统最小时间常数的1/5到1/10
好了,这一章的内容就这些。状态空间方程是工具,能控能观性是前提。后面讲观测器设计时,你会反复用到这些概念。下一章咱们就进入正题,讲龙伯格观测器——最经典的线性观测器。