
上篇聊了LQR代价函数一设Riccati方程一解最优反馈增益K就出来了。干净利落。但LQR有个致命假设系统模型精确已知而且没有噪声。你想想实际机器人哪有这么好的事IMU有漂移编码器有量化误差电机力矩有波动地面摩擦系数还在变。噪声无处不在。这时候你拿LQR直接用效果肯定打折。因为LQR需要完整状态x做反馈而实际中你根本拿不到真实的x——传感器给你的是一堆带噪声的测量值。怎么办LQG控制就是来解决这个问题的。一、从LQR到LQG为什么需要加一个估计器LQR的框架很简单状态x直接反馈乘以增益K得到控制量u -Kx。问题在于状态x直接反馈这句话在工程上根本不成立。你做一个四足机器人的平衡控制需要知道机身姿态、角速度、质心位置、质心速度。姿态可以从IMU拿到但IMU有零偏漂移和量化噪声角速度积分能得到姿态但积分会累积误差。质心位置更麻烦你没法直接测量只能通过运动学正解估算而关节编码器本身就有噪声。说白了你手里的状态信息是脏的。用脏数据做反馈控制效果能好才怪。LQG的思路是既然拿不到真实状态那就先估计一个出来。用什么估计卡尔曼滤波。卡尔曼滤波是最优状态估计器在高斯白噪声假设下LQR是最优控制器在二次代价函数下。把这两个最优拼在一起就是LQG。LQG Linear Quadratic Gaussian。Linear是系统线性Quadratic是代价函数二次Gaussian是噪声高斯。三个条件缺一不可。二、分离原理估计和控制可以独立设计LQG最漂亮的理论结果叫分离原理Separation Principle。意思是你可以分别设计卡尔曼滤波器和LQR控制器然后把它们拼起来整个系统仍然是最优的。不需要联合优化。这个结论其实挺反直觉的。你想想估计器的性能取决于控制输入因为控制影响系统动态控制器的性能取决于状态估计因为反馈用的是估计值。这俩明明是耦合的怎么能分开设计数学上可以证明在LQG框架下线性系统高斯白噪声二次代价函数联合优化问题的解恰好等于分别优化的解。这个结论是Kalman在1960年代证明的。分离原理的工程意义巨大。它意味着控制工程师可以单独调LQR不用担心估计器的问题导航工程师可以单独调卡尔曼滤波不用关心控制器怎么设计两个人各干各的拼起来就是全局最优当然前提条件是系统真的满足LQG假设。实际中这个前提经常不成立后面会聊。三、LQG的完整架构LQG控制器的结构分两条路控制回路u -K * x_hat其中x_hat是卡尔曼滤波给出的状态估计K是LQR增益矩阵。估计回路卡尔曼滤波接收实际测量y和实际控制u输出状态估计x_hat。卡尔曼滤波的方程x_hat_dot A*x_hat B*u L*(y - C*x_hat)其中L是卡尔曼增益由卡尔曼滤波的Riccati方程解出来。你看出什么没有卡尔曼滤波的方程和之前聊的Luenberger观测器长得一模一样。区别在于增益L的求法Luenberger观测器的L是手动选的卡尔曼滤波的L是通过解Riccati方程最优算出来的。整个LQG系统的闭环极点 LQR的极点 卡尔曼滤波的极点。这也是分离原理的直接推论。你设计LQR时定了控制极点设计卡尔曼滤波时定了估计极点闭环极点就是这两组极点的并集。四、Python代码实战来看一个完整的LQG例子。还是用倒立摆系统加上过程噪声和测量噪声。import numpy as np from scipy.linalg import solve_continuous_are # 倒立摆线性化模型 A np.array([[0,1,0,0],[0,0,-1,0],[0,0,0,1],[0,0,14.7,0]]) B np.array([[0],[1],[0],[-1]]) C np.array([[1,0,0,0],[0,0,1,0]]) # 只测量位置和摆角 # LQR设计 Q_lqr np.diag([10, 1, 100, 1]) # 重点惩罚摆角偏差 R_lqr np.array([[0.1]]) P solve_continuous_are(A, B, Q_lqr, R_lqr) K np.linalg.inv(R_lqr) B.T P # 卡尔曼滤波设计 W np.eye(4) * 0.01 # 过程噪声协方差 V np.eye(2) * 0.1 # 测量噪声协方差 # 对偶Riccati方程求卡尔曼增益 P_kf solve_continuous_are(A.T, C.T, W, np.linalg.inv(V)) L P_kf C.T np.linalg.inv(V) # LQG仿真核心循环 x_true np.array([0, 0, 0.1, 0]) # 真实状态摆角偏0.1rad x_est np.zeros(4) # 估计状态初始为0 dt 0.005 for i in range(2000): y C x_true np.random.randn(2) * np.sqrt(0.1) # 带噪声的测量 u -K x_est # LQG控制律 x_true (A x_true (B u).flatten()) * dt # 真实演化 innovation y - C x_est x_est (A x_est (B u).flatten() L innovation) * dt # 可以看到估计值会在几十毫秒内收敛到真实值附近这段代码做了三件事设计LQR控制器、设计卡尔曼滤波器、把两者拼起来做LQG仿真。核心就两个Riccati方程——一个给LQR一个给卡尔曼滤波。面试让你手写LQG写这两个方程就够了。五、面试实战LQG的坑QLQG真的最优吗实际中有什么问题A理论上在LQG假设下是最优的。但实际中有几个大问题第一模型必须精确已知。A和B矩阵如果有误差LQR的最优性和卡尔曼滤波的最优性都不保证了。实际机器人模型不可能100%精确。第二噪声必须是高斯白噪声。实际传感器噪声经常不是白噪声——IMU的零偏漂移是有色噪声低频编码器噪声可能和速度相关。卡尔曼滤波假设噪声是白噪声这个假设不满足时性能会下降。第三LQG对模型误差的鲁棒性可能很差。这个结论很反直觉——LQR本身有很好的鲁棒性至少60度相位裕度但LQG不一定。因为卡尔曼滤波引入的动态估计误差的收敛过程可能破坏LQR的鲁棒性裕度。这个现象叫LQG鲁棒性的悖论。Q怎么解决LQG鲁棒性不够的问题A几个思路降低卡尔曼滤波的带宽增大过程噪声协方差W让估计器更保守这样控制回路和估计回路的耦合更弱。用LTRLoop Transfer Recovery方法专门设计卡尔曼滤波使得LQG恢复LQR的鲁棒性。直接上鲁棒控制方法比如H-infinity控制这个后面会聊。QLQG和LQR在面试中怎么回答比较好A先说LQR是最优控制但假设无噪声LQG把LQR和卡尔曼滤波结合处理有噪声情况。然后重点讲分离原理——可以独立设计估计器和控制器。最后提一嘴LQG的实际局限模型敏感性和鲁棒性问题。这样回答有深度。讲真LQG在面试中考得不算多但如果你面试的是做自动驾驶或者精密控制的岗位LQG是必考的。因为这些领域噪声处理是核心问题。小结今天聊了LQG控制。核心思想就一句话卡尔曼滤波估计状态 LQR做最优反馈 LQG最优控制器。分离原理是LQG的理论基石——估计和控制可以分开设计拼起来就是全局最优。这个结论在理论上很漂亮工程上也很方便。但LQG有实际局限模型必须精确噪声必须高斯白噪声而且LQG的鲁棒性可能不如纯LQR。这些问题引出了后续要聊的鲁棒控制和自适应控制。下一篇我们换个方向聊模型预测控制MPC——一种能处理约束的最优控制方法。LQR和LQG都处理不了约束但实际系统中约束无处不在。MPC怎么解决这个问题如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第192篇 LQR最优控制——代价函数设计和Riccati方程求解下一篇预告第194篇 模型预测控制MPC原理——预测优化滚动执行有任何问题欢迎评论区留言我会尽量回复。