第191篇 状态观测器——测不到的状态量怎么估计
上篇讲了状态反馈和极点配置,核心思路是用u = -K*x把所有状态反馈回来,通过选择K把极点放到想要的位置。但有个前提:你得知道所有状态。
现实情况是,传感器又贵又有噪声。一个六自由度机械臂,关节角度可以用电编码器测,关节速度呢?直接微分角度信号噪声太大。关节力矩呢?得力矩传感器,一个就好几千。你不可能给每个状态变量都装一个传感器。
那怎么办?用能测到的量,结合系统的数学模型,把测不到的量"算"出来。这就是状态观测器干的事。
状态观测器在机器人领域太重要了。卡尔曼滤波本质上就是个观测器,SLAM里的状态估计、无人机的高度估计、机械臂的力估计,背后都有观测器的思想。面试的时候,观测器设计和极点配置是一对必考题。
全维观测器:把整个系统"复制"一遍
最简单的观测器叫Luenberger观测器,也叫全维观测器。思路特别直白:你在计算机里建一个系统的"副本",让它跟着真实系统跑。
dx_hat/dt = A*x_hat + B*u + L*(y - C*x_hat)
x_hat是状态的估计值。前两项Ax_hat + Bu就是你的系统模型在"预测"状态怎么变化。关键是第三项L*(y - Cx_hat)——这是用实际测量值y和估计输出Cx_hat的差来修正估计。
L是观测器增益矩阵,决定了"我多相信测量值"。如果L选得好,估计误差e = x - x_hat会快速收敛到零。
把估计误差的动力学推导一下:
de/dt = (A - L*C)*e
看到了吗?估计误差的 dynamics 由矩阵(A - LC)决定。只要(A - LC)的特征值都在左半平面,误差就会指数衰减到零。
这跟状态反馈的形式(A - BK)是不是很像?没错,这就是对偶关系的体现。设计观测器增益L,本质上就是一个"极点配置"问题,只不过配的是(A - LC)的极点。
import numpy as np from scipy.signal import place_poles # 系统矩阵 A = np.array([[0, 1], [-2, -3]]) B = np.array([[0], [1]]) C = np.array([[1, 0]]) # 只能测位置 # 设计观测器:用对偶原理 # (A, C)的能观性等价于(A^T, C^T)的能控性 # 所以用place_poles配(A^T, C^T)的极点,得到L^T desired_observer_poles = [-10, -10] # 观测器极点比控制器快5倍 result = place_poles(A.T, C.T, desired_observer_poles) L_T = result.gain_matrix L = L_T.T print("观测器增益L:", L) # 验证 eigenvalues = np.linalg.eigvals(A - L @ C) print("观测器误差极点:", eigenvalues)注意观测器极点一般要比控制器极点快3-5倍。为什么?因为观测器需要快速收敛——如果观测器收敛太慢,控制器拿到的状态估计不准,整个闭环系统的性能就差了。但也不能太快,否则测量噪声会被放大。工程上一般取控制器极点的3-5倍。
降维观测器:只估计测不到的那些状态
全维观测器估计所有状态。但你想想,有些状态你本来就能直接测量,何必再估计一遍?
降维观测器的思路就是:能测的状态直接用测量值,只估计那些测不到的状态。
假设系统有n个状态、m个输出,且输出直接就是某几个状态的测量值。那你只需要估计(n-m)个状态,观测器的维数从n降到(n-m)。
降维观测器在实际工程中用得很多。比如机械臂控制中,关节角度有编码器可以直接测,但关节速度需要估计。这时候你只需要一个一维的降维观测器来估计速度,而不是用全维观测器把所有状态都重新估计一遍。
降维观测器的设计稍微复杂一些,因为估计方程里会包含测量值的微分。工程上为了避免微分噪声,通常会做一些变换来消除这个项。面试的时候,降维观测器考得不多,但如果你能主动提出来,面试官会觉得你理解很深。
实际项目中,降维观测器用得比全维观测器更普遍。道理很简单——能直接测的量就别浪费算力去估计。一个四旋翼飞控,姿态用IMU直接测了,你只需要估计加速度或者外力扰动,降维观测器完全够用。
观测器在机器人中的实际应用
讲几个实际场景,帮你建立直觉。
无人机高度估计。无人机上有气压计测高度、IMU测加速度。气压计有漂移,IMU有积分误差。单独用哪个都不准。用观测器把两者融合:气压计提供长期准确的绝对高度,IMU提供短期精确的高度变化率。观测器融合两者,得到比任何单一传感器都准的高度估计。
这个场景其实就是卡尔曼滤波的经典应用。状态向量是[高度, 垂直速度],气压计测量高度(但有慢漂移),IMU的加速度做积分得到速度。观测器(卡尔曼滤波)自动平衡两者的可信度:短期更相信IMU(响应快),长期更相信气压计(不漂移)。
机械臂速度估计。编码器测关节角度,采样周期内做差分得到速度。但差分会放大量化噪声,尤其在低速时噪声很大。用观测器从角度测量估计速度,可以在不引入噪声放大的前提下得到平滑的速度估计。很多开源机械臂固件里就是这么做的。
无传感器控制。有些场景下你连传感器都没有。比如低成本无人车用反电动势观测器来估计电机转速,完全不用编码器。PMSM无传感器控制就是这个思路——用电压电流的观测器反推转子位置和速度。
再讲一个调试观测器收敛性的真实案例。之前帮一个无人机团队调高度观测器,气压计和IMU数据融合,用Luenberger观测器。仿真里观测器误差50毫秒就收敛到零了,但实物上发现初始几秒高度估计值跳动非常厉害。排查发现两个问题:一是气压计数据有高频振动噪声(电机振动通过机架传导到传感器),观测器增益太大把噪声放大了;二是初始时刻气压计读数和真实高度有个固定偏差(开机时的大气压校准没完成),观测器需要时间来消除这个初始误差。最后解决方案是加了个低通滤波预处理气压计数据,同时观测器增益分阶段调整——前2秒用较小增益让估计值慢慢收敛,之后切到正常增益。这个经验说明观测器设计不能只看理论收敛速度,还要考虑噪声抑制和初始过渡过程。
面试实战:观测器常见问题
Q:观测器和卡尔曼滤波有什么区别?A:Luenberger观测器是确定性的,不考虑噪声。卡尔曼滤波是随机性的,假设过程噪声和测量噪声都是高斯白噪声,在最小均方误差意义下最优。简单说,卡尔曼滤波是"最优"的Luenberger观测器。
Q:观测器增益L怎么选?A:经典方法是极点配置,把(A-LC)的极点放到期望位置。工程上观测器极点比控制器极点快3-5倍。如果用卡尔曼滤波,L是通过解Riccati方程自动算出来的,不需要手动选极点。
Q:观测器的初始误差会影响稳定性吗?A:不会。只要(A-LC)稳定,初始误差会指数衰减。衰减速度取决于观测器极点的实部。极点越左,衰减越快。
Q:分离原理在实际中有什么限制?A:分离原理假设系统是线性的、没有约束。实际系统中如果有执行器饱和、状态约束等非线性因素,分离原理就不严格成立了。这时候需要更复杂的分析工具。
讲真,观测器这个知识点,面试最爱问的是"观测器和卡尔曼滤波的关系"。你要能说清楚Luenberger观测器是确定性框架、卡尔曼是随机性框架,卡尔曼的增益是自动算出来的而不是手动配的,面试官就会觉得你是真懂了。
小结
今天聊了状态观测器。核心思想是用系统模型和可测量的输出,估计那些测不到的状态。Luenberger观测器是最基本的形式,通过观测器增益L把估计误差的极点配到期望位置。
观测器解决了状态反馈"需要知道所有状态"的局限。把观测器和状态反馈组合起来,就是所谓的"基于观测器的状态反馈控制",分离原理保证两者可以独立设计。
下一篇我们聊LQR最优控制——不再手动选极点,而是通过最小化一个代价函数,让计算机自动算出最优的反馈增益。
如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。
「机器人软件开发面试·从入门到精通」连载系列
上一篇:第190篇 状态反馈与极点配置——让系统按你想要的方式响应
下一篇预告:第192篇 LQR最优控制——代价函数设计和Riccati方程求解
有任何问题欢迎评论区留言,我会尽量回复。
