当前位置: 首页 > news >正文

第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方程求解

有任何问题欢迎评论区留言,我会尽量回复。

http://www.cnnetsun.cn/news/4084034.html

相关文章:

  • SPT-AKI存档编辑器快速上手:10分钟吃透离线版角色修改与一键配置方法
  • osu-droid模组系统源码解析:可扩展Mod架构的设计之道
  • Redis--黑马点评Day1
  • TVA-World架构:在工业质检中小试牛刀(1)
  • 如何让个人开发者30分钟搞定收款:PayJS的Golang SDK上手全指南
  • FanControl中文设置实战:3步汉化,10分钟让Windows风扇完全听你的
  • 苹果说你的Mac该退役了,OpenCore Legacy Patcher凭什么说“不“
  • 3步跑通芋道源码框架:Spring Boot企业级开发的完整答案
  • 【优化求解】移动边缘计算中物联网应用的动态请求调度优化附matlab代码
  • TVA-World生成式具身智能系列研究(17)
  • XCOM 2模组管理器从0到1:AML实战上手手册,彻底告别模组崩溃
  • Switch-Toolbox游戏文件编辑器实战指南:免费搞定任天堂三大平台的MOD制作
  • Switch-Toolbox 实测手记:免费开源、零代码,任天堂 Switch/3DS/Wii U 游戏文件一次搞定
  • 临时支援去了别的门店,工时不能还算原班组
  • FreeRTOS任务删除机制深度解析:从vTaskDelete原理到内存泄漏与死锁防范
  • 天能集团与苏宁战略合作:传统制造业如何通过后市场服务实现数字化转型
  • 彻底卸载OneDrive终极指南:开源脚本帮你一次清干净Windows 10/11残留
  • DLSS Swapper 使用教程:一套完整的 DLSS 版本管理实战指南
  • 嵌入式踩坑:printf 未重定向引发 Semihosting BKPT 异常导致 HardFault 深度排查
  • Starward米哈游游戏启动器:抽卡、时长、账号一站式管理指南
  • 人机对比:游戏学习中的经验敏感性行为研究与应用
  • 基于层理论的多智能体系统建模:统一共识与博弈均衡的代数拓扑框架
  • 基于广义沃罗诺伊图与效用梯度的多智能体协同覆盖控制
  • 反者道之动 深度释义|联动 唯有变是不变的(无漏究竟版)
  • 怎么快速全部重命名001到100?这个方法足够了
  • 5分钟快速上手r3f-game-demo:本地运行这个开源2D游戏demo的完整教程
  • 别再混淆了:3D高斯泼溅中的“仿射近似”、透视投影与正交投影
  • 锤子助手第064个开关:字体注入网页的位置、验证方法与网页显示安全边界
  • 窗口置顶工具 Topit 实测:把 Mac 上“不听话“的窗口钉在眼前
  • 点一次鼠标省下3小时:Pulover‘s Macro Creator 免费录制式自动化快速上手