十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第192篇 LQR最优控制——代价函数设计和Riccati方程求解

第192篇 LQR最优控制——代价函数设计和Riccati方程求解 上篇聊了状态观测器解决了测不到所有状态的问题。现在你有了状态估计也有了极点配置的工具但还有个问题极点到底放在哪极点配置靠的是你的经验和直觉。你选一组极点系统就有对应的动态特性。但好的动态特性怎么定义响应快但控制量大还是响应慢但省能量这个问题没有标准答案除非你把它变成一个优化问题。这就是LQRLinear Quadratic Regulator要做的事。你定义一个代价函数告诉计算机什么样的行为是好的然后让计算机自动算出最优的反馈增益。不用手动选极点不用试错调参数学上保证最优。LQR在机器人领域应用极广。波士顿动力的机器人、SpaceX的火箭着陆控制、自动驾驶的路径跟踪背后都有LQR的影子。面试的时候LQR是控制理论的高频考点不会LQR后面LQG和MPC都没法聊。代价函数告诉计算机什么是好LQR的核心思想是定义一个代价函数cost function然后找控制律u -K*x让这个代价函数最小。代价函数的形式是J integral(x^T*Q*x u^T*R*u) dt 从0到无穷两项的含义x^TQx状态偏差的代价。Q是半正定矩阵权重越大越 penalize 状态偏离零。比如你特别在意位置精度就把Q矩阵中对应位置的那一项设大一点。u^TRu控制能量的代价。R是正定矩阵权重越大越 penalize 控制量。你不希望电机输出太大就把R设大一点。说白了LQR就是在状态快速归零和控制能量最小之间找一个最优平衡。Q大意味着你更在意性能R大意味着你更在意节能。这个权衡完全取决于你的工程需求。做四旋翼的时候如果你希望姿态快速稳定Q里姿态相关的权重就设大。如果电机容易饱和R就设大限制控制量。Riccati方程最优解怎么算代价函数写好了怎么求最优的K答案是解代数Riccati方程AREA^T*P P*A - P*B*R^(-1)*B^T*P Q 0解出P之后最优反馈增益就是K R^(-1) * B^T * P这个Riccati方程是非线性的矩阵方程一般没有解析解得数值求解。但Python的scipy库直接提供了求解器import numpy as np from scipy.linalg import solve_continuous_are # 系统矩阵 A np.array([[0, 1], [-2, -3]]) B np.array([[0], [1]]) # 代价函数权重 Q np.array([[10, 0], [0, 1]]) # 更在意位置精度 R np.array([[1]]) # 控制能量权重 # 解Riccati方程 P solve_continuous_are(A, B, Q, R) # 最优反馈增益 K np.linalg.inv(R) B.T P print(最优反馈增益K:, K) # 验证闭环极点 A_cl A - B K print(闭环极点:, np.linalg.eigvals(A_cl))跑出来K大概是[2.32, 0.98]。你对比一下极点配置的结果LQR给出的K天然考虑了Q和R的权衡——位置偏差权重高所以位置的反馈增益更大。Q和R怎么选工程经验LQR最难的部分不是解方程而是选Q和R。这直接决定了控制器的性能。几个经验法则Q的对角线元素代表你对每个状态变量的在意程度。如果状态量纲不同比如位置是米、速度是m/sQ的元素差异会很大。一般先用单位矩阵做Q然后逐步调大你在意的那个状态对应的权重。R代表你对控制量的容忍度。R太小控制量会很大执行器容易饱和。R太大系统响应会变慢。一般先用单位矩阵做R然后根据执行器能力调整。Bryson法则是个不错的起点Q_ii 1/(x_i_max)^2R_jj 1/(u_j_max)^2。其中x_i_max和u_j_max分别是状态和控制量你允许的最大值。这个法则的物理意义是把每个状态和控制量归一化到它的允许范围让代价函数各项在同一量级上。之前做倒立摆的团队分享过他们的调参流程先用Bryson法则给个初始值然后在仿真里跑看控制量有没有饱和。如果饱和了就增大R如果响应太慢就增大Q里角度相关的权重。一般迭代个三五次就能得到满意的结果。他们强调一点Q和R的相对比值比绝对值更重要——同时放大Q和R十倍效果几乎不变。再分享一个做自平衡机器人的LQR调参经历。当时小车有两个轮子状态量是[轮子角度, 角速度, 车体位移, 线速度]四个。一开始Q设成单位矩阵、R设成0.1结果LQR算出来的增益特别大小车动不动就急加速急减速看起来就像在不停发抖一样。后来把R调到10控制量平滑了很多但响应明显变慢了车体发生倾斜之后要好一会儿才能修正过来。最后反复调试找到一组Qdiag(100,10,1,1)、R1的参数角度权重给得最大因为平衡最重要位移权重给得较小允许短暂偏移控制量的权重适中。这组参数跑起来既稳定又灵活。关键体会是LQR调参不是数学问题是工程问题——你得清楚哪个状态对你最重要、你的执行器到底能承受多大的控制量输出。LQR的优良性质LQR不只是最优这么简单它还有很多好性质保证稳定性。只要系统能控LQR给出的闭环系统一定是稳定的。这比极点配置强——极点配置你可能配出一组不合理的极点导致性能很差但LQR至少保证稳定。有一定的鲁棒性。LQR控制器有至少60度的相位裕度和无穷大的增益裕度。这意味着即使系统参数有些偏差LQR控制器依然能保持稳定。这个性质在工程上非常有价值。无限增益裕度。也就是说控制增益从1到无穷大都稳定。你不用担心增益调大了系统就不稳定这个问题。这些性质让LQR在工业界非常受欢迎。很多实际控制系统中LQR就是最终部署的控制器不是仿真用的玩具。面试实战LQR常见问题QLQR和极点配置的本质区别是什么A极点配置是我要系统有这个动态特性然后算K。LQR是我要最小化这个代价函数然后算K。前者是定性目标后者是定量优化。Q离散LQR和连续LQR有什么区别A连续LQR解的是代数Riccati方程ARE离散LQR解的是离散Riccati方程DRE。离散形式在数字控制器中更常用因为计算机只能处理离散系统。QQ和R的物理意义是什么AQ penalize 状态偏差R penalize 控制能量。Q/R的比值决定了性能和能耗的权衡。Q大R小意味着你愿意花更多能量来换取更好的性能。QLQR能跟踪非零参考值吗A标准LQR是调节器regulator目标是让状态归零。要跟踪非零参考值需要做坐标变换把问题转化为调节问题或者加前馈项。讲真LQR这个知识点面试考得最多的就是Q和R怎么选。面试官想看你是不是只会套公式还是真的理解代价函数的工程含义。你能说出Bryson法则和实际调参流程面试官就知道你有实战经验。小结今天聊了LQR最优控制。核心思想是定义一个二次代价函数J integral(x^TQx u^TRu)dt通过解Riccati方程得到最优反馈增益K。LQR解决了极点配置极点放哪的问题——你不再需要手动选极点而是通过Q和R矩阵告诉计算机你想要什么样的权衡计算机自动算出最优解。而且LQR保证稳定性还有很好的鲁棒性。但LQR有个前提系统模型是精确已知的而且没有噪声。下一篇我们聊LQG——在有噪声的情况下怎么把最优估计卡尔曼滤波和最优控制LQR结合起来。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第191篇 状态观测器——测不到的状态量怎么估计下一篇预告第193篇 LQG控制——有噪声情况下的最优估计最优控制有任何问题欢迎评论区留言我会尽量回复。
返回列表