想象一个冬夜,你开车回家。你心里其实同时装着两个数:车在路的哪个位置,以及现在开得多快。这两个数合在一起,才是你掌握的全部“行车状态”。如果只看“踩油门到家的时间”,那是只看头尾的粗浅视角;真正让你能应对弯道、坡道和红灯的,是盯着“位置+速度”这张全景仪表盘来判断下一步——这就是状态空间的视角。 这篇文章用“开车回家”这条主线,一步步带你认识:状态空间表示(给行车状态拍一张完整快照)、能控性(你的手脚能不能掌控所有状态)、能观性(仪表盘不全时还能不能猜出全局)、状态反馈(按照全景信息决定踩多少油门)、状态观测器(用心灵模型补上盲区)、稳定性判据(证明你不会越开越偏)以及 LQR 最优控制(在省油与准时之间找到最优解)。学完你会发现,这些名字虽然吓人,但本质就是把老司机脑子里的直觉,翻译成一套数学语言。

岗位关联

对 AI 与机器人从业者而言,状态空间控制是打通“感知-建模-决策-执行”全链路的地基。看懂状态、能控能观、会配反馈、敢用观测器,你才能让机器人在真实世界里稳稳地动起来。

目录
  1. 可视化演示
  2. 状态空间表示:给行车状态拍一张全景快照
  3. 能控性判据:你的油门刹车能不能掌控全局
  4. 能观性分析:仪表盘不亮时还能不能洞察全局
  5. 状态反馈设计:看着全景仪表盘决定踩多少油门
  6. 状态观测器:用心灵模型补上盲区
  7. 稳定性验证:确保车不会越开越偏
  8. LQR最优控制:在省油与准时之间找平衡
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示ECB、CBC、CTR三种分组密码工作模式的加密流程差异,可视化数据块的独立加密、链式依赖和计数器模式。

本节配有交互动效(进入视口后自动加载,约 3KB)。

CBC链式加密模式 每个明文块先与前一个密文块异或,再进行加密 红色连线表示密文链式依赖,首个块使用IV向量 绿色块为已加密的密文块,紫色为待加密明文块 Ci = E(K, Pi XOR Ci-1) CBC模式具有语义安全性,相同明文产生不同密文

状态空间表示:给行车状态拍一张全景快照

老司机开车时,心里必须同时装着两个数:车在路的哪个位置,以及现在跑得多快。只看里程表或只看速度表都没法安全驾驶——只有把“位置+速度”合在一起,你才能判断接下来该加油、松油还是刹车。控制理论里,把这种“完整刻画系统当前处境的最小信息集”称为状态,把它们打包成的列向量就叫状态向量。

状态空间表示的核心,是给系统写一本“演化说明书”。说明书告诉你:只要知道现在状态向量 \(\mathbf{x}\),再知道接下来怎么踩油门 \(u\),下一秒的整个系统状态就被完全确定了。相比只描述“输入到输出”的黑盒视角,状态空间把系统内部的每一层因果都摊开在桌面上,这也是它能统一处理多输入多输出系统的根本原因。

这本说明书只有两页:第一页叫状态方程,描述状态如何随时间演化;第二页叫输出方程,描述仪表盘上真正能读到的量与状态之间的对应关系。写成数学语言就是:

有了这张全景快照,你就不再是只看头尾的乘客,而是手握全局的司机。但下一个问题立刻浮出水面:这辆车,真的是你能完全掌控的吗?这就引出了能控性。

x˙=Ax+Bu,y=Cx+Du\displaystyle \dot{\mathbf{x}} = \mathbf{A}\mathbf{x} + \mathbf{B}u, \qquad y = \mathbf{C}\mathbf{x} + \mathbf{D}u
通俗地说:\(\mathbf{A}\) 是这辆车的“内在脾气”,\(\mathbf{B}\) 是油门踏板把力传进车轮的“传动轴”,\(\mathbf{C}\) 是仪表盘的“传感器”,\(\mathbf{D}\) 是油门直接串到仪表盘的“直通线路”。
  1. 状态向量 \(\mathbf{x}\)把位置和速度打包成一个列向量,物理世界在这一瞬间的全部“记忆”都被它装下。
    x=[x1x2]\mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}
  2. 状态矩阵 \(\mathbf{A}\)描述状态之间如何互相影响;比如“速度会改变位置”,这一行因果就写在 \(\mathbf{A}\) 里。
    x˙=Ax\dot{\mathbf{x}} = \mathbf{A}\mathbf{x}
  3. 输入矩阵 \(\mathbf{B}\)描述油门刹车 \(u\) 通过什么物理通道进入系统、优先改变哪个状态(通常直接给速度“加力”)。
    x˙=Ax+Bu\dot{\mathbf{x}} = \mathbf{A}\mathbf{x} + \mathbf{B}u
  4. 输出方程描述仪表盘读数 \(y\) 是哪些状态的线性组合;对汽车而言,GPS 读出位置,车速表读出速度。
    y=Cx+Duy = \mathbf{C}\mathbf{x} + \mathbf{D}u

能控性判据:你的油门刹车能不能掌控全局

假如你坐进一辆改装车,方向盘被焊死,只剩油门可用。你想靠油门把车从路边挪进车库——位置根本动不了,因为你只能影响速度,无法影响方向。这样的车,你会说它“不可控”。能控性回答的正是:仅靠输入 \(u\),能不能把系统从任意初始状态,在有限时间内牵引到任意希望的状态(通常取原点)。

从数学上看,能控性关心的是输入“火力”能覆盖多大范围。单个时刻的 \(u\) 只能直接推动 \(\mathbf{B}\) 指向的方向;但系统的动态 \(\mathbf{A}\) 会把这种推动持续“折射”到新的方向。把每一时刻的影响力排成一排,就得到能控矩阵:

能控性不是纸面游戏,它直接决定了反馈设计的上限:一个不可控的模式,任你如何设计控制器都够不着——就像方向盘被焊死,再好的车手也白搭。幸运的是,现实中大多数执行器布局合理的机械系统都是能控的;而当我们确认“车能被掌控”后,下一个问题是:你坐在驾驶座上,真的能看清这辆车的全部状态吗?

Qc=[BABA2B⋯An−1B],rank(Qc)=n\displaystyle \mathbf{Q}_c = \begin{bmatrix} \mathbf{B} & \mathbf{A}\mathbf{B} & \mathbf{A}^2\mathbf{B} & \cdots & \mathbf{A}^{n-1}\mathbf{B} \end{bmatrix}, \qquad \mathrm{rank}(\mathbf{Q}_c) = n
通俗地说:把油门踩一下、再踩一下、连续踩许多下,所有“影响力蔓延方向”拼在一起,如果它们能铺满整张状态地图,就说明你能把这辆车开到地图上任一点。
  1. 第一块 \(\mathbf{B}\)输入此刻直接作用在哪些状态通道上,相当于油门对速度的即时推动。
    B=[01]\mathbf{B} = \begin{bmatrix} 0 \\ 1 \end{bmatrix}
  2. 第二块 \(\mathbf{A}\mathbf{B}\)输入的影响力经过一个采样周期的系统演化后,蔓延到了哪些新方向——相当于“踩一脚油门下秒位置也动了”。
    AB=[1−2ζω]\mathbf{A}\mathbf{B} = \begin{bmatrix} 1 \\ -2\zeta\omega \end{bmatrix}
  3. 更高次项 \(\mathbf{A}^2\mathbf{B}\)影响力继续在系统里传导,像水波扩散,每传播一次就多覆盖一个维度。
    A2B=A(AB)\mathbf{A}^2\mathbf{B} = \mathbf{A}(\mathbf{A}\mathbf{B})
  4. 秩条件这些“影响力列向量”的秩等于系统阶数 \(n\),说明它们张满了整个状态空间,没有任何死角。
    rank(Qc)=n=2\mathrm{rank}(\mathbf{Q}_c) = n = 2

能观性分析:仪表盘不亮时还能不能洞察全局

深夜开车,仪表盘忽然全灭,GPS 也断了信号。你只凭路灯和参照物,还能不能猜出自己的位置和速度?能,只要你心里有这辆车的运动模型。能观性回答的正是:从一段有限时间内的输出 \(y(t)\)(比如唯一幸存的转速表读数),能不能唯一反推出系统的全部状态。

数学上,能观性看的是输出“视线”能照亮多少维度。输出 \(y=\mathbf{C}\mathbf{x}\) 直接照见的是 \(\mathbf{C}\) 的方向;但状态演化会把隐藏维度的信息源源不断地带进输出里。把这些“视线传播方向”叠起来,就得到能观矩阵:

能观性与能控性是一对镜像:把系统矩阵转置、把输入和输出角色对调,能观性问题就变成了能控性问题——这就是对偶原理。聪明的司机即使在仪表盘全灭时,也能靠零星线索推断全局;而对工程师来说,能观性决定了你是否需要(以及能否)借助观测器来补全看不见的状态。

Qo=[CCACA2⋮CAn−1],rank(Qo)=n\displaystyle \mathbf{Q}_o = \begin{bmatrix} \mathbf{C} \\ \mathbf{C}\mathbf{A} \\ \mathbf{C}\mathbf{A}^2 \\ \vdots \\ \mathbf{C}\mathbf{A}^{n-1} \end{bmatrix}, \qquad \mathrm{rank}(\mathbf{Q}_o) = n
通俗地说:一次读数看不到的状态,多观察几步、结合运动规律推算,就能“管中窥豹,可见一斑”。所有观察方向的合成视角若能覆盖全图,系统就能观。
  1. 第一行 \(\mathbf{C}\)输出直接测量了哪些状态的组合,相当于仪表盘直接亮起的读数。
    y=Cx=x1y = \mathbf{C}\mathbf{x} = x_1
  2. 第二行 \(\mathbf{C}\mathbf{A}\)状态经过一步演化后,隐藏维度(如速度)的痕迹开始出现在输出变化率中。
    y˙=CAx\dot{y} = \mathbf{C}\mathbf{A}\mathbf{x}
  3. 秩条件所有“视线行”合起来秩等于 \(n\),说明输出信息足够拼出完整状态图。
    rank(Qo)=n=2\mathrm{rank}(\mathbf{Q}_o) = n = 2

状态反馈设计:看着全景仪表盘决定踩多少油门

确认了车能控、能观之后,真正的驾驶才开始。老司机的脚法其实是一条朴素规则:位置偏右了就往左修,速度太快了就松油门。状态反馈把这套直觉写成线性法则:控制量是每个状态偏差的加权求和后取负。设参考输入为 \(r\),则:

把这条法则代回系统,就得到闭环状态方程。反馈矩阵 \(\mathbf{K}\) 重塑了系统的“脾气”:原来是 \(\mathbf{A}\),现在变成 \(\mathbf{A}-\mathbf{B}\mathbf{K}\)。只要合理地选 \(\mathbf{K}\),就能把闭环系统的特征值(极点)放到我们想要的位置,从而决定响应是迟缓还是敏捷、是平稳还是激进:

极点配置完成后,系统的响应特性(超调、上升时间、稳定时间)就有章可循。但这里藏着一个前提:反馈律 \(u=-\mathbf{K}\mathbf{x}\) 要求我们知道精确的 \(\mathbf{x}\)。现实中状态常常不可直接测量,怎么办?这就是观测器登场的时刻。

u=−Kx+r\displaystyle u = -\mathbf{K}\mathbf{x} + r
x˙=(A−BK)x+Br\displaystyle \dot{\mathbf{x}} = (\mathbf{A}-\mathbf{B}\mathbf{K})\mathbf{x} + \mathbf{B}r
通俗地说:\(\mathbf{K}\) 就是你的“脚感系数”——位置偏了多少该给多大修正,速度超了多少该收多少油。选得好,车像被一只无形的手稳稳扶住;选得差,车会左右横摆甚至失控。
  1. 反馈律 \(u=-\mathbf{K}\mathbf{x}+r\)每个状态分量按权重 \(\mathbf{K}\) 折算成控制量,取负号是因为要“反向抵消偏差”。
    u=−k1x1−k2x2+ru = -k_1 x_1 - k_2 x_2 + r
  2. 闭环矩阵 \(\mathbf{A}-\mathbf{B}\mathbf{K}\)反馈改变了系统内在动态,新矩阵的特征值完全由 \(\mathbf{K}\) 决定。
    x˙=(A−BK)x\dot{\mathbf{x}} = (\mathbf{A}-\mathbf{B}\mathbf{K})\mathbf{x}
  3. 特征方程我们希望闭环极点落在指定位置,于是令特征多项式等于目标多项式。
    det⁡(sI−(A−BK))=∏i=1n(s−pi)\det(s\mathbf{I} - (\mathbf{A}-\mathbf{B}\mathbf{K})) = \prod_{i=1}^{n}(s - p_i)
  4. Ackermann 公式直接由期望极点解出 \(\mathbf{K}\),避免手工展开特征方程,是工程上最常用的求解工具。
    K=en⊤Qc−1ϕ(A)\mathbf{K} = \mathbf{e}_n^\top \mathbf{Q}_c^{-1} \phi(\mathbf{A})

状态观测器:用心灵模型补上盲区

GPS 漂移、传感器故障、有些状态根本没法直接装传感器——现实开车时,你永远只能看到部分真相。但老司机有个绝技:心里揣着一份“这辆车在我的油门和刹车下会怎么动”的模型,结合仪表盘上有限的真实读数,不断在心里修正对车速和位置的判断。状态观测器就是把这个心理过程数学化。

观测器不直接测状态,而是同时做两件事:先用系统模型“预测”下一步状态,再用输出误差“校正”预测结果。记估计状态为 \(\hat{\mathbf{x}}\),观测器方程为:

其中 \(\mathbf{L}\) 是观测器增益,\(y - \mathbf{C}\hat{\mathbf{x}}\) 是“预测输出”与“真实输出”的差——相当于你心里嘀咕的“咦,实际车速和我预想的不一样”。把真实状态减去估计状态,误差 \(\tilde{\mathbf{x}}=\mathbf{x}-\hat{\mathbf{x}}\) 的动态彻底摆脱了输入 \(u\),只由矩阵 \(\mathbf{A}-\mathbf{L}\mathbf{C}\) 决定:

分离定理带来一个漂亮的工程便利:状态反馈增益 \(\mathbf{K}\) 和观测器增益 \(\mathbf{L}\) 可以分开设计——先按响应要求配 \(\mathbf{K}\) 的极点,再按估计速度要求配 \(\mathbf{L}\) 的极点,两者结合后系统依然稳定。这就像你既可以信赖导航仪的路线规划,也可以单独校准车速表的误差,互不干扰。观测器家族里还有省计算量的降阶观测器——只估计不可测的那部分状态,需要的阶数更低、更轻快。

x^˙=Ax^+Bu+L(y−Cx^)\displaystyle \dot{\hat{\mathbf{x}}} = \mathbf{A}\hat{\mathbf{x}} + \mathbf{B}u + \mathbf{L}(y - \mathbf{C}\hat{\mathbf{x}})
x~˙=(A−LC)x~\displaystyle \dot{\tilde{\mathbf{x}}} = (\mathbf{A}-\mathbf{L}\mathbf{C})\tilde{\mathbf{x}}
通俗地说:预测给了你方向,校正给了你纠偏的勇气。只要 \(\mathbf{L}\) 选得好,心里的模型就会快速贴近现实,误差像瘪掉的气球一样缩回零。
  1. 模型预测项先用已知的 \(\mathbf{A}\hat{\mathbf{x}}+\mathbf{B}u\) 推算状态的下一步,相当于凭经验预判。
    x^˙=Ax^+Bu\dot{\hat{\mathbf{x}}} = \mathbf{A}\hat{\mathbf{x}} + \mathbf{B}u
  2. 残差 \(y-\mathbf{C}\hat{\mathbf{x}}\)测量输出与预测输出的差值,是观测器的“反馈信号”,告诉你模型哪里猜错了。
    ey=y−Cx^e_y = y - \mathbf{C}\hat{\mathbf{x}}
  3. 增益 \(\mathbf{L}\)决定纠偏力度。 \(\mathbf{L}\) 越大,模型越“相信”测量而快速修正;但太大也会把噪声一起灌进来。
    x^˙=⋯+Ley\dot{\hat{\mathbf{x}}} = \cdots + \mathbf{L}e_y
  4. 误差动力学误差本身是一个自治系统,其特征值由 \(\mathbf{A}-\mathbf{L}\mathbf{C}\) 决定,与输入 \(u\) 无关——这正是分离定理的基石。
    x~˙=(A−LC)x~\dot{\tilde{\mathbf{x}}} = (\mathbf{A}-\mathbf{L}\mathbf{C})\tilde{\mathbf{x}}

稳定性验证:确保车不会越开越偏

策略设计好了,但你怎么敢保证这套策略在长期运行中不会让系统越走越偏,或者永无休止地左右震荡?开车时你凭手感知道“车是稳的”;工程上则需要一个严谨的判据。Lyapunov 稳定性理论提供了一个极其优雅的视角:找一个“能量计”,如果这个能量始终非负,并且沿着系统轨迹单调下降,那就证明系统最终会停到能量最低点(原点)。

对线性系统,这个“能量计”通常取成关于状态的二次型 \(V(\mathbf{x})=\mathbf{x}^\top\mathbf{P}\mathbf{x}\),其中 \(\mathbf{P}\) 是对称正定矩阵。要判断系统 \(\dot{\mathbf{x}}=\mathbf{A}\mathbf{x}\) 是否稳定,只需检验能量函数沿轨迹的导数是否恒为负:

而 \(\dot{V}\) 的具体形式由下面这个Lyapunov 方程给出。给定任意正定矩阵 \(\mathbf{Q}\),若能解出正定的 \(\mathbf{P}\),系统就是渐近稳定的:

有了这张“能量成绩单”,你就能在部署控制器之前离线地证明:无论初始偏差多大,系统都会收敛。稳定是底线,但工程上我们还想更进一步——不只要稳,还要最优。这就轮到 LQR 登场。

V(x)=x⊤Px>0,V˙(x)=−x⊤Qx<0\displaystyle V(\mathbf{x}) = \mathbf{x}^\top \mathbf{P}\mathbf{x} > 0, \qquad \dot{V}(\mathbf{x}) = -\mathbf{x}^\top \mathbf{Q}\mathbf{x} < 0
A⊤P+PA=−Q\displaystyle \mathbf{A}^\top \mathbf{P} + \mathbf{P}\mathbf{A} = -\mathbf{Q}
通俗地说:这是一张“能量成绩单”。只要能量只减不增,系统就稳稳走向原点。\(\mathbf{Q}\) 是你选的考卷难度,\(\mathbf{P}\) 是解出的能量计读数。
  1. 二次型能量函数 \(V\)把状态距离“原点有多远”折算成一个标量能量,离得越远能量越高。
    V(x)=x⊤PxV(\mathbf{x}) = \mathbf{x}^\top \mathbf{P}\mathbf{x}
  2. 正定性\(\mathbf{P}\) 正定保证能量永远不小于零,且只有原点处能量为零——“车不可能平白无故获得负能量”。
    P≻0\mathbf{P} \succ 0
  3. 沿轨导数把 \(V\) 对时间求导,代入状态方程,得到导数由 \(\mathbf{A}^\top\mathbf{P}+\mathbf{P}\mathbf{A}\) 决定。
    V˙=x⊤(A⊤P+PA)x\dot{V} = \mathbf{x}^\top(\mathbf{A}^\top \mathbf{P} + \mathbf{P}\mathbf{A})\mathbf{x}
  4. Lyapunov 方程令中间矩阵等于 \(-\mathbf{Q}\),若所得 \(\mathbf{P}\) 正定,则 \(\dot{V}<0\),渐近稳定得证。
    A⊤P+PA=−Q\mathbf{A}^\top \mathbf{P} + \mathbf{P}\mathbf{A} = -\mathbf{Q}

LQR最优控制:在省油与准时之间找平衡

开车回家,一路猛踩油门固然到得快,但费油伤车;一路怠速滑行虽然省油,却可能迟到。真正的老司机追求的是“恰到好处”。LQR(线性二次型调节器)把这个权衡翻译成一个代价函数:状态偏离零点的代价与消耗控制能量的代价,两者加权积分。我们的目标,是找到让总代价最小的反馈增益。

代价函数里有两位“考官”:\(\mathbf{Q}\) 给状态偏差打分,\(\mathbf{R}\) 给控制输入打分。两者都是权重矩阵,表达了你的“驾驶风格”:

最小化这个积分,在数学上等价于求解下面的代数 Riccati 方程,得到辅助矩阵 \(\mathbf{P}\):

解出 \(\mathbf{P}\) 后,最优状态反馈增益有一个极其简洁的闭式解:

工程调参时,经验法则是先固定 \(\mathbf{R}=1\),再逐步增大 \(\mathbf{Q}\),观察仿真中状态收敛速度与输入幅值的变化,直到找到你满意的“驾驶风格”。至此,从状态表示到能控能观,从反馈设计到观测器补盲,从稳定性证明到最优求解,一套完整的“老司机决策系统”就闭环了。

J=∫0∞(x⊤Qx+u⊤Ru)dt\displaystyle J = \int_0^\infty \left( \mathbf{x}^\top \mathbf{Q}\mathbf{x} + u^\top \mathbf{R}u \right) dt
A⊤P+PA−PBR−1B⊤P+Q=0\displaystyle \mathbf{A}^\top \mathbf{P} + \mathbf{P}\mathbf{A} - \mathbf{P}\mathbf{B}\mathbf{R}^{-1}\mathbf{B}^\top \mathbf{P} + \mathbf{Q} = \mathbf{0}
K=R−1B⊤P\displaystyle \mathbf{K} = \mathbf{R}^{-1}\mathbf{B}^\top \mathbf{P}
通俗地说:LQR 帮你把“又快又省”的驾驶哲学算到底。\(\mathbf{Q}\) 大 = 追求立刻归位,\(\mathbf{R}\) 大 = 心疼执行器。最后的 \(\mathbf{K}\) 就是那套不偏不倚的最优脚法。
  1. 状态代价 \(\mathbf{x}^\top\mathbf{Q}\mathbf{x}\)偏离原点越远,扣分越狠;\(\mathbf{Q}\) 越大,你越“受不了”偏差。
    Q=[q100q2]\mathbf{Q} = \begin{bmatrix} q_1 & 0 \\ 0 & q_2 \end{bmatrix}
  2. 输入代价 \(u^\top\mathbf{R}u\)油门踩得越猛,油耗越高;\(\mathbf{R}\) 越大,你越“舍不得”用执行器。
    u⊤Ru=r u2u^\top \mathbf{R}u = r\,u^2
  3. Riccati 方程把动态约束和代价函数一起“拉格朗日化”后,得到一个关于 \(\mathbf{P}\) 的非线性矩阵方程,数值求解非常成熟。
    A⊤P+PA−PBR−1B⊤P+Q=0\mathbf{A}^\top \mathbf{P} + \mathbf{P}\mathbf{A} - \mathbf{P}\mathbf{B}\mathbf{R}^{-1}\mathbf{B}^\top \mathbf{P} + \mathbf{Q} = \mathbf{0}
  4. 最优增益不用试错调参,直接从 \(\mathbf{P}\) 算出 \(\mathbf{K}\),保证在给定 Q、R 下代价最小。
    K=R−1B⊤P\mathbf{K} = \mathbf{R}^{-1}\mathbf{B}^\top \mathbf{P}

AI 应用场景

机械臂轨迹跟踪

阶段:模型构建与控制器设计

解决的问题:传统机械臂控制用 PID 逐关节调参,面对多关节耦合和负载变化时手忙脚乱。状态空间表示把各关节的位置、速度统一建模为状态向量,用状态反馈实现全局解耦控制,让机械臂沿期望轨迹平滑运动。

具体案例:在 6 轴协作机器人抓取流水线上,工程师先建立机械臂的线性化状态空间模型,验证能控性后设计 LQR 反馈增益,再通过观测器估计关节角速度(许多低成本机械臂没有测速传感器)。最终机械臂在 ±0.1mm 精度内完成高速拾放,比传统 PID 的超调量降低 60%。

自动驾驶车辆横向控制

阶段:感知融合与运动控制

解决的问题:自动驾驶车辆需要在小角度转向下保持车道居中。单纯靠“偏离多少打多少”的比例控制,在高速弯道会明显甩尾或切弯不足。状态空间方法把横向位置、航向角、横向速度、横摆角速度打包成状态向量,通过 LQR 设计最优前轮转角反馈。

具体案例:某 L4 级园区无人车在雨天湿滑路面测试中,控制工程师用四状态自行车模型设计 LQR 控制器,并设置观测器融合 IMU 与视觉感知的位姿估计。相比纯 PID,横向跟踪误差从 25cm 降到 8cm,且方向盘动作明显更平顺,乘客“画龙”感基本消失。

无人机姿态稳定

阶段:系统辨识与鲁棒控制

解决的问题:多旋翼无人机是一个高度耦合的多输入多输出系统,滚转、俯仰、偏航相互影响。状态空间表示天然支持多输入多输出建模,能控能观性分析能提前暴露“某个轴执行器失效后是否还能稳定”的风险。

具体案例:某工业巡检无人机项目在桨叶损坏 30% 的情况下,依靠基于状态反馈的自适应控制器完成返航。工程师预先用能控性分析确认了“冗余推力布局”下损坏后依然可控,再用状态反馈极点配置调整控制律,最终在强风环境下以 0.6m 精度降落在停机坪。

Python 演示

python67 行
import numpy as np  def ackermann(A, B, poles):    """Ackermann 公式:由期望极点求状态反馈增益 K(行向量)"""    n = A.shape[0]    coeff = np.poly(poles)                 # 期望特征多项式,从高次到低次    phi = np.zeros_like(A, dtype=float)    for c in coeff:                        # Horner 形式计算 phi(A)        phi = phi @ A + c * np.eye(n)    Qc = np.hstack([B, A @ B])             # 二阶系统的能控矩阵    e = np.zeros((n, 1))    e[-1, 0] = 1.0                         # 末位单位向量    K = e.T @ np.linalg.inv(Qc) @ phi    return K.reshape(1, n)  class SpringMass:    """质量-弹簧-阻尼系统:x1=位置, x2=速度, 输入 u 为外力"""     def __init__(self, omega, zeta, dt):        self.dt = dt        self.A = np.array([[0.0, 1.0],                           [-omega * omega, -2 * zeta * omega]])        self.B = np.array([[0.0], [1.0]])        self.C = np.array([[1.0, 0.0]])        self.D = np.array([[0.0]])     def rank_of(self, M):        return np.linalg.matrix_rank(M)     def simulate(self, K, L, T):        """带观测器的闭环仿真:u = -K * x_hat"""        x = np.array([[3.0], [0.0]])       # 真实状态:初始位置 3,速度 0        xh = np.array([[0.0], [0.0]])      # 观测器初始估计        steps = int(T / self.dt)        err = 0.0        for _ in range(steps):            u = -K @ xh                    # 用估计状态计算控制量            y = self.C @ x                 # 测量输出            dx = self.A @ x + self.B * u   # 真实系统动态            dxh = self.A @ xh + self.B * u + L @ (y - self.C @ xh)            x = x + dx * self.dt            xh = xh + dxh * self.dt            err = max(err, float(np.linalg.norm(x - xh)))        return err  def main():    sys = SpringMass(omega=2.0, zeta=0.3, dt=0.01)     print('能控矩阵秩:', sys.rank_of(np.hstack([sys.B, sys.A @ sys.B])))    print('能观矩阵秩:', sys.rank_of(np.vstack([sys.C, sys.C @ sys.A])))     K = ackermann(sys.A, sys.B, [-1.5, -1.2])           # 期望闭环极点    L = ackermann(sys.A.T, sys.C.T, [-6.0, -5.0]).T     # 对偶系统求观测器增益    L = L.reshape(2, 1)     print('反馈增益 K:', K.ravel().round(3))    print('观测器增益 L:', L.ravel().round(3))     err = sys.simulate(K, L, T=8.0)    print('观测器最大估计误差: %.5f' % err)  if __name__ == '__main__':    main()
目的:演示状态空间方法从建模、能控能观校验、极点配置到观测器闭环仿真的完整链路,输出结果可直接对照理论值验证。
  1. Qc = np.hstack([B, A @ B])构造二阶系统的能控矩阵,并检查其秩是否满秩。
  2. epsilon = np.poly(poles)由期望极点生成特征多项式系数,是 Ackermann 公式的输入端。
  3. L = ackermann(sys.A.T, sys.C.T, [-6.0, -5.0]).T利用对偶原理:\((A, C)\) 的能观性等价于 \((A^T, C^T)\) 的能控性,从而解出观测器增益。
  4. dxh = self.A @ xh + self.B * u + L @ (y - self.C @ xh)观测器的一行代码三件事:模型预测、输入驱动、输出残差校正。
  5. u = -K @ xh分离定理的体现:控制器只认观测器给出的估计状态,不直接触碰真实状态。

常见误区

误区刚开始学状态空间时,我总觉得想用状态反馈就必须把状态向量里的每个分量都装传感器测出来,不然 \(u = -\mathbf{K}\mathbf{x}\) 根本没法用。

正解状态空间方法的核心优势恰恰是“能观性 + 观测器”。只要系统能观,即使只测一个输出量,也能通过观测器在软件里重建出全部状态。就像盲人司机虽然看不见,但靠听觉模型和零散的路况信息,依然能在心里重构出“车在哪、开多快”。你不需要直接测量每个状态,你只需要能观,然后让观测器替你“看见”。

为何常见:\(u=-\mathbf{K}\mathbf{x}\) 里的 \(\mathbf{x}\) 写得太过“理直气壮”,初学者默认它必须是真实测量值,忽略了估计值 \(\hat{\mathbf{x}}\) 的存在。

误区我最初以为能控就意味着系统本身是稳定的——既然输入能影响所有状态,那“顺手”把状态拉回原点不就完了吗?

正解能控回答的是“能不能到达”,稳定性回答的是“不控制时会不会自己收敛”,两者完全独立。倒立摆是能控的,但你一松手它照样倒下。能控性给你改造权,稳定性需要你用反馈去兑现。就像你可以自由转动方向盘(能控),但不代表松开手车会自己走直线。

为何常见:把“通过输入影响状态的能力”和“系统内在的动态趋势”混为一谈,忘了 \(u=0\) 时系统自己怎么演化。

误区我以为反馈增益越大,纠正偏差就越快,系统一定越猛越好。于是把 \(\mathbf{K}\) 直接放大十倍,结果执行器饱和,系统反而震荡甚至发散。

正解现实里执行器有物理极限,测量有噪声,模型有未建模动态。 \(\mathbf{K}\) 过大会让控制量超出执行器能力,还会放大高频噪声。极点配置必须在响应速度与鲁棒性之间取折中。这就像刹车不是踩得越死越好——踩太死车轮抱死打滑,反而更危险。

为何常见:在线性仿真里 \(\mathbf{K}\) 大确实收敛快,但仿真不会惩罚饱和和噪声;真实系统会。

误区我以为观测器收敛越快越好,所以把 \(\mathbf{L}\) 设得特别大,结果估计值剧烈抖动,控制效果反而更差。

正解\(\mathbf{L}\) 决定误差动力学 \(\mathbf{A}-\mathbf{L}\mathbf{C}\) 的极点,\(\mathbf{L}\) 越大误差收敛越快,但输出测量噪声也被同步放大,估计信号里全是“毛刺”。实际工程要在收敛速度与噪声抑制之间取平衡。就像你相信导航偏移修正,但如果 GPS 每 0.1 秒抖一下你就猛打一次方向盘,车反而开不稳。

为何常见:只盯着无噪声模型下的误差方程,没有把传感器噪声放进分析模型里。

误区我以为 LQR 只要设了 \(\mathbf{Q}\) 和 \(\mathbf{R}\) 就能自动得到“最好”的控制器,所以随手填 \(\mathbf{Q}=1\)、\(\mathbf{R}=1\),结果系统响应要么慢吞吞,要么控制量飙到天上。

正解LQR 只是在给定的 \(\mathbf{Q}\)、\(\mathbf{R}\) 下最优,这两个矩阵本身编码了你的设计偏好:\(\mathbf{Q}\) 大 = 追求状态快速归零,\(\mathbf{R}\) 大 = 舍不得用执行器。工程上通常先固定 \(\mathbf{R}\),再逐步增大 \(\mathbf{Q}\),观察仿真中状态收敛速度与输入幅值的取舍,直到得到满意的“驾驶风格”。

为何常见:把“最优”误解为“绝对最好”,忘了最优总是相对于某个代价函数而言的。

面试题

Q1. 状态空间模型 \(\dot{\mathbf{x}}=\mathbf{A}\mathbf{x}+\mathbf{B}u\) 中,矩阵 \(\mathbf{A}\) 表示什么?

单选题 · easy

  • A.系统内部状态的相互影响← 正确答案
  • B.输入对状态的直接作用
  • C.输出与状态的对应关系
  • D.输入直接到输出的通道

答案:A。\(\mathbf{A}\) 是系统矩阵,描述没有外部输入时状态之间如何互相影响,好比汽车“自身会怎么滑行”;\(\mathbf{B}\) 管输入作用,\(\mathbf{C}\) 管输出,\(\mathbf{D}\) 管直通。

Q2. 状态反馈 \(u=-\mathbf{K}\mathbf{x}+r\) 代入系统后,闭环系统矩阵变为?

单选题 · easy

  • A.\(\mathbf{A}-\mathbf{L}\mathbf{C}\)
  • B.\(\mathbf{A}-\mathbf{B}\mathbf{K}\)← 正确答案
  • C.\(\mathbf{C}-\mathbf{D}\mathbf{K}\)
  • D.\(\mathbf{B}-\mathbf{A}\mathbf{K}\)

答案:B。把 \(u=-\mathbf{K}\mathbf{x}+r\) 代入 \(\dot{\mathbf{x}}=\mathbf{A}\mathbf{x}+\mathbf{B}u\),整理得到 \(\dot{\mathbf{x}}=(\mathbf{A}-\mathbf{B}\mathbf{K})\mathbf{x}+\mathbf{B}r\)。\(\mathbf{A}-\mathbf{L}\mathbf{C}\) 是观测器误差矩阵,别混淆。

Q3. 能控性矩阵 \(\mathbf{Q}_c\) 通常由哪些块按顺序拼接而成?

单选题 · easy

  • A.\(\mathbf{C}, \mathbf{C}\mathbf{A}, \mathbf{C}\mathbf{A}^2, \ldots\)
  • B.\(\mathbf{B}, \mathbf{A}\mathbf{B}, \mathbf{A}^2\mathbf{B}, \ldots\)← 正确答案
  • C.\(\mathbf{A}, \mathbf{B}, \mathbf{C}\) 按行拼接
  • D.只由矩阵 \(\mathbf{B}\) 构成

答案:B。能控矩阵是 \(\mathbf{Q}_c=[\mathbf{B}\;\mathbf{A}\mathbf{B}\;\mathbf{A}^2\mathbf{B}\;\cdots]\),反映输入影响力在系统动态中的传导。\(\mathbf{C},\mathbf{C}\mathbf{A},\ldots\) 是能观矩阵的构成。

Q4. 观测器方程中的输出校正项是?

单选题 · mid

  • A.增益 \(\mathbf{K}\) 乘以状态估计误差
  • B.增益 \(\mathbf{B}\) 乘以输入估计误差
  • C.增益 \(\mathbf{L}\) 乘以输出估计误差← 正确答案
  • D.增益 \(\mathbf{A}\) 乘以状态估计误差

答案:C。观测器用 \(\mathbf{L}(y-\mathbf{C}\hat{\mathbf{x}})\) 修正预测,\(y-\mathbf{C}\hat{\mathbf{x}}\) 是真实输出与预测输出的差,也就是“模型猜错了多少”。

Q5. 分离定理的核心结论是什么?

单选题 · mid

  • A.能控性与能观性相互独立无关
  • B.状态可分解为可控与不可控部分
  • C.系统可分解为快慢两个时间尺度
  • D.反馈增益 \(\mathbf{K}\) 与观测器增益 \(\mathbf{L}\) 可分别独立设计← 正确答案

答案:D。分离定理指出,基于观测器的输出反馈可以把状态反馈设计和观测器设计分开进行,二者合并后闭环系统依然稳定。

Q6. 对偶原理表明,能观性问题可以等价转化为哪个矩阵对的能控性问题?

单选题 · mid

  • A.\(\mathbf{A}^\top\) 与 \(\mathbf{B}^\top\) 的能控性
  • B.\(\mathbf{B}^\top\) 与 \(\mathbf{C}^\top\) 的能控性
  • C.\(\mathbf{A}^\top\) 与 \(\mathbf{C}^\top\) 的能控性← 正确答案
  • D.\(\mathbf{A}\) 与 \(\mathbf{C}\) 互换后的能控性

答案:C。系统 \((\mathbf{A},\mathbf{C})\) 能观等价于对偶系统 \((\mathbf{A}^\top,\mathbf{C}^\top)\) 能控。这正是代码里用 \(\text{ackermann}(\mathbf{A}^\top,\mathbf{C}^\top)\) 求观测器增益的理论依据。

Q7. 带观测器的闭环系统中,控制律 \(u=-\mathbf{K}\mathbf{x}\) 里的 \(\mathbf{x}\) 实际指的是?

单选题 · mid

  • A.精确状态的精确测量值
  • B.观测器输出的状态估计值← 正确答案
  • C.输出测量值的直接代换
  • D.参考输入的跟踪目标值

答案:B。实际工程中 \(\mathbf{x}\) 通常无法直接测量,控制律实际使用观测器估计的 \(\hat{\mathbf{x}}\),即 \(u=-\mathbf{K}\hat{\mathbf{x}}\)。这是分离定理在实践中的标准形态。

Q8. Ackermann 公式用于解决什么问题?

单选题 · hard

  • A.由期望闭环极点直接求反馈增益 \(\mathbf{K}\)← 正确答案
  • B.由反馈增益反推系统是否能控
  • C.数值求解代数 Riccati 方程
  • D.由输入输出数据辨识系统模型

答案:A。Ackermann 公式 \(\mathbf{K}=\mathbf{e}_n^\top\mathbf{Q}_c^{-1}\phi(\mathbf{A})\) 输入期望极点,输出增益 \(\mathbf{K}\),是极点配置的经典解法。Riccati 方程属于 LQR 问题,与极点配置不同路。

Q9. 关于 Lyapunov 渐近稳定判据,正确的说法有?

多选题 · hard

  • A.能量函数 \(V(\mathbf{x})\) 必须是正定的← 正确答案
  • B.沿系统轨迹的导数 \(\dot{V}(\mathbf{x})\) 必须是负定的← 正确答案
  • C.能量沿着轨迹单调下降并最终归零← 正确答案
  • D.能量函数 \(V\) 必须是唯一的

答案:ABC。Lyapunov 第二法要求找到正定且导数负定的能量函数,证明系统渐近稳定。但 \(V\) 的构造不唯一,找到即可,找不到不代表系统一定不稳定(对一般非线性判据而言),因此 D 错误。

Q10. 关于 LQR 最优控制,下列说法正确的是?

多选题 · extreme

  • A.状态权重 \(\mathbf{Q}\) 越大,状态偏差的代价越高← 正确答案
  • B.输入权重 \(\mathbf{R}\) 越大,控制能量的代价越高← 正确答案
  • C.最优增益由 \(\mathbf{K}=\mathbf{R}^{-1}\mathbf{B}^\top\mathbf{P}\) 给出← 正确答案
  • D.要求 \(\mathbf{Q}\) 正定且 \(\mathbf{R}\) 为半正定

答案:ABC。LQR 的标准要求是 \(\mathbf{Q}\) 半正定、\(\mathbf{R}\) 正定,D 说反了。\(\mathbf{Q}\)、\(\mathbf{R}\) 分别编码状态偏差与控制能耗的代价,最优增益通过解 Riccati 方程得到后再由 \(\mathbf{K}=\mathbf{R}^{-1}\mathbf{B}^\top\mathbf{P}\) 算出。