自动驾驶控制算法——LQR控制算法
文章目录
- 自动驾驶控制算法——LQR控制算法
- **一、LQR 是什么?**
- 二、LQR 原理
- 2.1 线性状态空间模型 (State–Space Model)
- 2.2 二次型性能指标 JJJ
- 2.3 代数黎卡提方程 (ARE)
- 2.4 特点总结
- 2.5 一句话总结 LQR 原理:
- 2.5.1 场景类比:小孩牵绳跑步
- 2.5.2 数学意义下的类比映射:
- 2.5.3 更直白一点的解释:
- ① 系统动态是什么?
- ② 什么样的轨迹才叫“好”?
- ③ 怎么做才最优?
- ④ 最终结果如何?
- 🖼️ 图像化理解你可以把 LQR 理解为:“我告诉系统什么是‘好’,它就自己计算出‘怎么做’”。
- 总结关键思想
- 2.6 案例分析 —— 车辆轨迹跟踪
- 2.6.1 任务介绍
- 2.6.2 控制流程
- 2.6.3 参数调优现象观察
- 2.6.4 不同 Q/R 组合的典型效果
- 2.7 LQR 参数解读
- 2.7.1 常用术语
- 2.7.2 权重矩阵 Q,RQ,RQ,R对性能的影响
- 2.7.3 关键性能指标
- 2.7.4 计算与信号流程图
- 2.7.5 典型作用总结
- 2.7.6 设计准则与物理量对应关系
- 三、离散 LQR 推导(DLQR)
- 3.1 离散状态空间模型
- 3.2 无限时域二次型性能指标
- 3.3 动态规划推导
- 3.4 DLQR 与 CLQR 的对应关系
- 四、iLQR(Iterative LQR)扩展
- 4.1 问题定义
- 4.2 算法框架
- 4.3 简化伪代码
- 4.4 iLQR 与其它方法对比
- 4.5 工程实践要点
- 五、LQR 权重整定方法(参数选择)
- 5.1 ✅ Bryson’s Rule
- 📌 基本思想
- 🧠 背景原理
- 🔧 操作步骤
- 🚗 自动驾驶应用案例
- 5.2 🛠️ Trial-and-Error 调参法
- 📌 基本思想
- 🧠 背景原理
- 🔧 操作步骤
- 🛠 工具推荐
- 🚗 自动驾驶应用案例
- 5.3 📐 LMI-Based 自动整定
- 📌 基本思想
- 🧠 背景原理
- 🔧 操作步骤
- 🛠 工具推荐
- 🚗 自动驾驶应用案例
- 六、python实现代码
- 小结对比
一、LQR 是什么?
Linear Quadratic Regulator(线性二次型调节器,简称 LQR)是一类基于状态反馈的最优控制算法。
它针对“线性系统 + 二次型代价函数”这对经典组合,自动给出一组最优反馈增益,从而在误差最小化与控制能量最小化之间取得全局最优折中。
在自动驾驶中,LQR 被广泛用于横向/纵向轨迹跟踪、车道保持(LKA)、稳定性控制(VSC)、智能底盘协同控制等场景,兼具实时性、多变量耦合处理能力与理论最优性。
二、LQR 原理
2.1 线性状态空间模型 (State–Space Model)
对连续时间系统,令
x˙(t)=Ax(t)+Bu(t)\dot{x}(t)=A\,x(t)+B\,u(t)x˙(t)=Ax(t)+Bu(t)
- x(t)∈Rnx(t)\in\mathbb{R}^nx(t)∈Rn:状态向量(位置、姿态、速度、误差等)
- u(t)∈Rmu(t)\in\mathbb{R}^mu(t)∈Rm:控制输出(转向角、驱动力、制动力等)
- AAA、BBB:系统动力学矩阵(可由自行车模型、三自由度模型或实验辨识而得)
离散时间版本(采样周期 Δt\Delta tΔt)同理:
xk+1=Adxk+Bdukx_{k+1}=A_d\,x_k+B_d\,u_kxk+1=Adxk+Bduk
2.2 二次型性能指标 JJJ
设计目标:在 t∈[0,∞)t\in[0,\infty)t∈[0,∞) 内最小化
J=∫0∞(xT(t)Qx(t)+uT(t)Ru(t))dtJ=\int_{0}^{\infty}\!\bigl(x^{\mathrm T}(t)Qx(t)+u^{\mathrm T}(t)Ru(t)\bigr)\,dtJ=∫0∞(xT(t)Qx(t)+uT(t)Ru(t))dt
记号 | 物理含义 | 工程调节思路 |
---|---|---|
Q⪰0Q\succeq0Q⪰0 | 状态加权矩阵:惩罚偏离参考轨迹 | 误差越关键,赋值越大 |
R≻0R\succ0R≻0 | 控制加权矩阵:惩罚控制能耗/激烈度 | 不希望频繁/剧烈操舵就增大 RRR |
2.3 代数黎卡提方程 (ARE)
最优解存在唯一正定矩阵 PPP,满足
ATP+PA−PBR−1BTP+Q=0A^{\mathrm T}P+PA-PBR^{-1}B^{\mathrm T}P+Q=0ATP+PA−PBR−1BTP+Q=0
得到最优反馈增益
K=R−1BTP⟹u(t)=−Kx(t)K=R^{-1}B^{\mathrm T}P \quad\Longrightarrow\quad u(t)=-K\,x(t)K=R−1BTP⟹u(t)=−Kx(t)
2.4 特点总结
- 最优性:对给定 A,B,Q,RA,B,Q,RA,B,Q,R 全局最优;无局部极值困扰。
- 多变量耦合:一次性考虑所有状态与输入,天然处理耦合。
- 实时性高:上线前离线求 KKK,在线只需矩阵乘法。
- 线性假设:需在工作点线性化;大幅偏离或强非线性场景下效果下降。
- 无显式约束:不直接处理饱和与障碍,需要配合限幅或外层规划器。
2.5 一句话总结 LQR 原理:
LQR 就像一个“聪明的爸爸”,手里拽着你(小孩)一根绳子,在奔跑中努力让你既不跑偏,又不会猛拉你太用力。
2.5.1 场景类比:小孩牵绳跑步
假设你(小孩)在一个广场上跑步,有一个目标路线(比如一条蓝色的直线轨迹),你爸(控制器)拽着你一根弹力绳,任务是让你尽量沿着这条轨迹跑。你爸不能直接控制你,但可以通过拉扯绳子的方式调整你的方向。
现在他面临两个问题:
- 你偏离轨迹越多(状态误差大),他就想越用力拉你回来
- 但用力过猛你会摔倒(控制动作大 → 不舒适),他也不想那样
于是他就想着:
“我要最优地拉这根绳子,让我家孩子既快速回到轨迹,又不至于每次都摔个大跟头。”
这时候他脑子里其实就运行着一个 LQR 控制器。
2.5.2 数学意义下的类比映射:
生活场景 | 控制系统术语 |
---|---|
你的位置与方向 | 状态向量 x(t)x(t)x(t) |
你爸的拉力 | 控制输入 u(t)u(t)u(t) |
你和轨迹的偏离 | 状态误差(需要惩罚) |
拉绳子的幅度大小 | 控制开销(也要惩罚) |
你爸的聪明程度 | 增益矩阵 KKK,控制律 u=−Kxu = -Kxu=−Kx |
怎么权衡纠偏 vs 用力 | 惩罚矩阵 Q,RQ, RQ,R,定义什么是“好” |
目标 | 让总代价函数 JJJ 最小(偏差小 + 控制平滑) |
2.5.3 更直白一点的解释:
LQR 的工作流程可以理解为以下四步:
① 系统动态是什么?
你是个小车,你能跑、能转弯,爸爸知道你每跑一步、每拐一个弯,会跑到什么位置 → 系统模型:
x˙(t)=Ax(t)+Bu(t)\dot{x}(t) = A x(t) + B u(t)x˙(t)=Ax(t)+Bu(t)
② 什么样的轨迹才叫“好”?
当然是既偏差小,又别太用力操控你:
J=∫0∞[xTQx+uTRu]dtJ = \int_0^\infty \left[ x^T Q x + u^T R u \right] dtJ=∫0∞[xTQx+uTRu]dt偏差太大 xTQxx^T Q xxTQx 会被罚
- 控制太猛 uTRuu^T R uuTRu也要罚
- 怎么罚?用矩阵 Q,RQ, RQ,R 来定义,自己调!
③ 怎么做才最优?
解一个叫“黎卡提方程”的东西,得到一个增益 KKK,然后只要你一偏离,控制器就自动拉回:
u(t)=−Kx(t)u(t) = -K x(t)u(t)=−Kx(t)
这个反馈矩阵 KKK 就是控制器的“聪明劲儿”。
④ 最终结果如何?
- 如果你设计得好,系统运行起来就像小车沿轨道平稳前进,轻松纠偏
- 如果你太注重精度(QQQ太大),控制器可能疯狂操作
- 如果你太怕费力(RRR太大),小车就变得慵懒、不追轨了
🖼️ 图像化理解你可以把 LQR 理解为:“我告诉系统什么是‘好’,它就自己计算出‘怎么做’”。
总结关键思想
关键词 | 意义 |
---|---|
误差反馈 | LQR 直接用当前误差状态来反馈控制 |
最优折中 | 不只纠错,还要代价最小 |
增益矩阵 | 控制器的大脑,自动学会怎么拉得最好 |
提前离线求解 | 控制器上线后实时快如闪电(仅乘法) |
2.6 案例分析 —— 车辆轨迹跟踪
2.6.1 任务介绍
- 目标:让车辆以 15 m/s 的恒速精准沿参考曲线(S 形)行驶,最小化横向误差 eye_yey 和航向误差 eψe_\psieψ。
- 模型:采用简化自行车模型并在小角度、恒速条件下线性化。
2.6.2 控制流程
-
实时感知车辆位置与姿态 → 计算误差向量 x=[ey,e˙y,eψ,e˙ψ]Tx=[e_y,\,\dot e_y,\,e_\psi,\,\dot e_\psi]^{\mathrm T}x=[ey,e˙y,eψ,e˙ψ]T。
-
状态反馈:控制器输出前轮转角
δ=−Kx\delta=-Kxδ=−Kx
-
车辆执行 → 新状态回馈 → 进入下一控制周期。
2.6.3 参数调优现象观察
- 增大 Q(ey,eψ)Q_{(e_y,e_\psi)}Q(ey,eψ):曲线跟随更紧,响应更快,但控制动作更激进,可能出现抖动。
- 增大 R:转向更平滑、舒适,跟踪误差增大,可能在急弯处外偏。
- 平衡策略:先用 Bryson’s Rule 给初值,再基于仿真/现场试验迭代微调。
2.6.4 不同 Q/R 组合的典型效果
方案 | Q(diag) | R | 稳态误差 | 峰值转角 | 舒适性 | 评述 |
---|---|---|---|---|---|---|
A | [10,1,10,1][10,1,10,1][10,1,10,1] | 0.1 | 0.05 m | 3.2° | ★★☆ | 误差小,操舵略频繁 |
B | [2,0.5,2,0.5][2,0.5,2,0.5][2,0.5,2,0.5] | 1.0 | 0.15 m | 1.1° | ★★★ | 舒适度佳,误差可接受 |
C | [20,2,20,2][20,2,20,2][20,2,20,2] | 0.05 | 0.02 m | 5.5° | ★☆☆ | 极致精度,易饱和 |
图中红色曲线展示了在**非线性车辆模型(Kinematic Bicycle Model)**下,LQR 控制器如何调整前轮转角,使车辆从偏离状态逐步回到并跟踪 S 型参考轨迹(黑色虚线)。
这说明即使模型是非线性的,基于线性近似设计的 LQR 控制器也能取得良好的控制效果,尤其在中等速度、路径曲率适中的场景下非常适用。
2.7 LQR 参数解读
2.7.1 常用术语
术语 | 含义 |
---|---|
PPP | 黎卡提方程解,衡量未来代价的“势能” |
KKK | 状态反馈增益矩阵 |
Closed-Loop Poles | 闭环特征值,决定响应快慢与稳定性 |
2.7.2 权重矩阵 Q,RQ,RQ,R对性能的影响
- 大 QQQ / 小 RRR:强调跟踪精度 → 响应快、可能过冲。
- 小 QQQ / 大 RRR:强调控制平滑 → 误差大、舒适性高。
2.7.3 关键性能指标
- 稳态误差
- 超调量 / 峰值转角
- 90% 调整时间
- 控制能量 ∫u2dt\int u^2 dt∫u2dt
2.7.4 计算与信号流程图
感知 → 计算状态误差 → LQR 内核(读 KKK 表 → 乘以 −KKK)→ 输出控制 → 车辆执行 → 反馈环。 (工程实现中常封装成 ROS 控制节点或嵌入式任务)
2.7.5 典型作用总结
- 在紧急避障前提供平稳高精度跟踪。
- 可作为 MPC 的终端控制器或非线性控制器的局部线性近似补偿器。
- 在低速或大曲率场景下,可结合速度规划降低侧向加速度峰值。
2.7.6 设计准则与物理量对应关系
物理量/需求 | 建议权重调整 |
---|---|
横向误差 ≤ 0.1 m | 提高 QeyQ_{e_y}Qey |
航向误差 ≤ 0.5° | 提高 QeψQ_{e_\psi}Qeψ |
乘坐舒适度 | 提高 RRR 以限制剧烈操舵 |
转角饱和 | 事先加输入限幅或适当增大 RRR |
低抓地/湿滑路面 | 同时增大 Q,RQ,RQ,R并在外层降速 |
三、离散 LQR 推导(DLQR)
3.1 离散状态空间模型
xk+1=Adxk+Bduk,k=0,1,…x_{k+1}=A_d\,x_k+B_d\,u_k,\qquad k=0,1,\dotsxk+1=Adxk+Bduk,k=0,1,…
- xk∈Rnx_k\in\mathbb{R}^nxk∈Rn:第 kkk 步系统状态
- uk∈Rmu_k\in\mathbb{R}^muk∈Rm:控制输入
- Ad,BdA_d,B_dAd,Bd:离散化后的系统矩阵(可由零阶保持 Ad=eAΔt,Bd=∫0ΔteAτdτBA_d=e^{A\Delta t},\;B_d=\int_0^{\Delta t}\!e^{A\tau}\,d\tau\,BAd=eAΔt,Bd=∫0ΔteAτdτB 获得,或直接辨识/数值近似)
3.2 无限时域二次型性能指标
J=∑k=0∞(xk⊤Qxk+uk⊤Ruk),Q⪰0,R≻0J=\sum_{k=0}^{\infty}\Bigl(x_k^{\!\top}Qx_k+u_k^{\!\top}Ru_k\Bigr),\qquad Q\succeq0,\;R\succ0J=∑k=0∞(xk⊤Qxk+uk⊤Ruk),Q⪰0,R≻0
有限时域(Horizon NNN)只需将求和上限改为 N−1N-1N−1,末端加终端权 xN⊤SxNx_N^{\!\top}Sx_NxN⊤SxN。
3.3 动态规划推导
-
定义成本到终点(Cost-to-Go)函数
Jk(xk)=∑i=k∞(xi⊤Qxi+ui⊤Rui)J_k(x_k)=\sum_{i=k}^{\infty}\bigl(x_i^{\!\top}Qx_i+u_i^{\!\top}Ru_i\bigr)Jk(xk)=∑i=k∞(xi⊤Qxi+ui⊤Rui)
-
Bellman 最优性原理
Jk(x)=minu[x⊤Qx+u⊤Ru+Jk+1(Adx+Bdu)]J_k(x)=\min_{u}\!\left[x^{\!\top}Qx+u^{\!\top}Ru+J_{k+1}(A_dx+B_du)\right]Jk(x)=minu[x⊤Qx+u⊤Ru+Jk+1(Adx+Bdu)]
-
二次型猜想 设Jk(x)=x⊤PkxJ_k(x)=x^{\!\top}P_kxJk(x)=x⊤Pkx,则递推得到Pk=Q+Ad⊤Pk+1Ad−Ad⊤Pk+1Bd(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1AdP_k=Q+A_d^{\!\top}P_{k+1}A_d-\! A_d^{\!\top}P_{k+1}B_d \bigl(R+B_d^{\!\top}P_{k+1}B_d\bigr)^{-1} B_d^{\!\top}P_{k+1}A_dPk=Q+Ad⊤Pk+1Ad−Ad⊤Pk+1Bd(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1Ad_
-
最优控制律**uk⋆=−Kkxk,Kk=(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1Adu_k^{\star}=-K_kx_k,\quad K_k=\bigl(R+B_d^{\!\top}P{k+1}B_d\bigr)^{-1}B_d^{\!\top}P{k+1}A_duk⋆=−Kkxk,Kk=(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1Ad
-
无限时域收敛:若 (Ad,Bd)(A_d,B_d)(Ad,Bd) 稳定可控且(Ad,Q1/2)(A_d,Q^{1/2})(Ad,Q1/2) 可观,则存在极限
Pk→k→∞P∞P_k\xrightarrow[k\to\infty]{}P_\inftyPkk→∞P∞
其满足离散代数黎卡提方程(DARE)
P=Ad⊤PAd−Ad⊤PBd(R+Bd⊤PBd)−1Bd⊤PAd+QP=A_d^{\!\top}PA_d- A_d^{\!\top}PB_d\bigl(R+B_d^{\!\top}PB_d\bigr)^{-1} B_d^{\!\top}PA_d+QP=Ad⊤PAd−Ad⊤PBd(R+Bd⊤PBd)−1Bd⊤PAd+Q
得到 恒定最优增益
K=(R+Bd⊤PBd)−1Bd⊤PAdK=\bigl(R+B_d^{\!\top}PB_d\bigr)^{-1}B_d^{\!\top}PA_dK=(R+Bd⊤PBd)−1Bd⊤PAd
数值求解
- Scipy:
scipy.linalg.solve_discrete_are(A_d,B_d,Q,R)
- MATLAB:
[K,P,~] = dlqr(A_d,B_d,Q,R)
- 若做有限时域控制,可从终端条件 PN=SP_N=SPN=S 向前递推(Backward Riccati Sweep)。
3.4 DLQR 与 CLQR 的对应关系
连续 LQR | 离散 LQR |
---|---|
ARE:A⊤P+PA−PBR−1B⊤P+Q=0A^\top P+PA-PBR^{-1}B^\top P+Q=0A⊤P+PA−PBR−1B⊤P+Q=0 | DARE 上式 |
控制律:u=−Kx,K=R−1B⊤Pu=-Kx,\;K=R^{-1}B^\top Pu=−Kx,K=R−1B⊤P | 同型:K=(R+B⊤PB)−1B⊤PAK=\bigl(R+B^\top PB\bigr)^{-1}B^\top PAK=(R+B⊤PB)−1B⊤PA |
解析稳定域靠 ARE 正定解 | 解析稳定域靠 DARE 正定解 |
四、iLQR(Iterative LQR)扩展
动机:LQR 只适用于线性近似;真实车辆模型xk+1=f(xk,uk)x_{k+1}=f(x_k,u_k)xk+1=f(xk,uk) 往往非线性。
思路:在给定控制序列附近迭代线性化 + 二次化,每轮都做一次“时变 LQR” → 前向滚动更新 → 直至收敛。
本质上是 DDP(Differential Dynamic Programming)的简化实现,计算量更轻,且易于嵌入 MPC/规划器。
4.1 问题定义
- 非线性动力学:xk+1=f(xk,uk)x_{k+1}=f(x_k,u_k)xk+1=f(xk,uk)
- 分段代价:ℓk(xk,uk)\ell_k(x_k,u_k)ℓk(xk,uk),终端代价 ℓf(xN)\ell_f(x_N)ℓf(xN)
- 目标:minu0:N−1∑k=0N−1ℓk+ℓfu0:N−1\displaystyle\min_{u_{0:N-1}}\ \sum_{k=0}^{N-1}\ell_k+\ell_fu0:N−1u0:N−1min k=0∑N−1ℓk+ℓfu0:N−1
4.2 算法框架
-
初始化:选一条可行控制序列 {uk(0)}\{u_k^{(0)}\}{uk(0)},正向仿真得到轨迹 {xk(0)}\{x_k^{(0)}\}{xk(0)}。
-
迭代循环 (t=0,1,2,…t = 0,1,2,…t=0,1,2,…):
-
线性化:对每个步长 kkk
δxk+1=Akδxk+Bkδuk,Ak=∂f∂x∣(xk(t),uk(t)),Bk=∂f∂u∣(⋅)\delta x_{k+1}=A_k\delta x_k+B_k\delta u_k,\quad A_k=\left.\frac{\partial f}{\partial x}\right|_{(x_k^{(t)},u_k^{(t)})},\; B_k=\left.\frac{\partial f}{\partial u}\right|_{(\cdot)}δxk+1=Akδxk+Bkδuk,Ak=∂x∂f(xk(t),uk(t)),Bk=∂u∂f(⋅)
-
二次化代价:泰勒展开 ℓk\ell_kℓk 得二次型 δx,δu\delta x,\,\delta uδx,δu。
-
后向遍历(LQR backward pass):求时变增益 Kk(t),kk(t)K_k^{(t)},k_k^{(t)}Kk(t),kk(t)(反馈 + 前馈)。
-
前向滚动:更新控制
uk(t+1)=uk(t)+α(t)kk(t)+Kk(t)(xk(t+1)−xk(t))u_k^{(t+1)}=u_k^{(t)}+\alpha^{(t)}k_k^{(t)}+K_k^{(t)}\bigl(x_k^{(t+1)}-x_k^{(t)}\bigr)uk(t+1)=uk(t)+α(t)kk(t)+Kk(t)(xk(t+1)−xk(t))
并重新仿真得 {xk(t+1)}\{x_k^{(t+1)}\}{xk(t+1)}
-
线搜索:调节 α(t)∈(0,1]\alpha^{(t)}\in(0,1]α(t)∈(0,1] 满足代价下降。
-
收敛判据:∣J(t+1)−J(t)∣<ε|J^{(t+1)}-J^{(t)}|<\varepsilon∣J(t+1)−J(t)∣<ε 或迭代次数达上限。
-
4.3 简化伪代码
Input: f, ℓ, ℓ_f, horizon N, x0
Initialize U ← {u0,...,u_{N-1}} (zeros or heuristic)
while not Converged doX ← ForwardRollout(f, x0, U){A_k,B_k,ℓ_x,ℓ_u,ℓ_xx,ℓ_uu,ℓ_ux} ← LinearizeAndQuadratize(X,U){K_k,k_k} ← BackwardPass(A,B,ℓ_x,ℓ_u,ℓ_xx,ℓ_uu,ℓ_ux)U_new ← LineSearchAndUpdate(U,K,k)if CostDropSmall then breakU ← U_new
end while
return U, X
4.4 iLQR 与其它方法对比
方法 | 模型要求 | 约束处理 | 收敛性质 | 工程特点 |
---|---|---|---|---|
LQR | 线性 | 不显式 | 一步求闭解 | 最快,局部有效 |
iLQR | 可微非线性 | 软约束/罚项 | 局部收敛 | 迭代求解,秒级 |
DDP | 同上 | 软约束/罚项 | 二阶收敛 | 需二阶导数 |
MPC | 线/非线性 | 可显式硬约束 | 在线优化 | 计算量大,最灵活 |
4.5 工程实践要点
- 采样周期:iLQR 得到的是开环控制序列;可每 τ\tauτ 秒重解一次,外层加反馈稳健性更佳(Receding Horizon iLQR)。
- 权重与正则:常在二次化阶段对 Hessian 加 λI\lambda IλI 保证正定。
- 约束:可在代价中加入 barrier / soft-constraint,也可外层投影。
- 软件:
ilqr
(Python)、traja/ilqr
(基于 JAX)acados
非线性 MPC 内含 iLQR kernel- C++ 实时实现可参考
mpc-lqr
、pinocchio+croccodile
五、LQR 权重整定方法(参数选择)
LQR 的设计核心在于选择合适的权重矩阵 QQQ 与 RRR,它们反映了控制器对误差状态与控制输入的“偏好程度”。调得好,可以实现高精度+高舒适性;调不好则可能导致过度抖动、饱和、甚至失稳。本节介绍三种常用的权重调参策略。
5.1 ✅ Bryson’s Rule
📌 基本思想
将每个状态量/控制量的“最大允许值”设为代价函数中的单位惩罚基准。
即:对每个分量设定其最大允许值 xi,maxx_{i,\max}xi,max、umaxu_{\max}umax,令:
Qii=1xi,max2,R=1umax2Q_{ii} = \frac{1}{x_{i,\max}^2},\quad R = \frac{1}{u_{\max}^2}Qii=xi,max21,R=umax21
🧠 背景原理
-
LQR 性能指标函数本质上是:
J=∫x⊤Qx+u⊤Rudt=∑(状态惩罚)+(控制惩罚)J = \int x^\top Q x + u^\top R u \,dt = \sum \text{(状态惩罚)} + \text{(控制惩罚)}J=∫x⊤Qx+u⊤Rudt=∑(状态惩罚)+(控制惩罚)
-
若我们将每个量归一化到它的最大可接受值,那么所有项的权重就统一了 → 得到一个物理量解释清晰的权重矩阵。
🔧 操作步骤
-
明确各状态量最大可接受偏差(如位置偏差 ≤ 0.2 m,偏航角 ≤ 3° 等)
-
明确控制量最大允许范围(如最大转角 ≤ 25°)
-
代入公式构建权重矩阵
Q=diag(1x12,1x22,…),R=1umax2Q = \mathrm{diag}\left(\frac{1}{x_1^2},\frac{1}{x_2^2},\dots\right),\quad R = \frac{1}{u_{\max}^2}Q=diag(x121,x221,…),R=umax21
-
若还需强调某些状态量,可在此基础上乘上放大系数(例如横向位置乘以 5)。
🚗 自动驾驶应用案例
物理量 | 变量 | 允许最大值 | 权重项 |
---|---|---|---|
横向误差 | eye_yey | 0.2 m | Q1,1=25Q_{1,1} = 25Q1,1=25 |
航向角误差 | eψe_\psieψ | 3° = 0.052 rad | Q2,2≈369Q_{2,2} ≈ 369Q2,2≈369 |
转向角 | δ\deltaδ | 25° = 0.436 rad | R=5.26R = 5.26R=5.26 |
5.2 🛠️ Trial-and-Error 调参法
📌 基本思想
基于仿真/试验观察系统响应曲线,手动增减 QQQ/RRR 中元素逐步调整控制行为。
🧠 背景原理
- LQR 是解析型反馈控制,其性能高度依赖于代价函数的构型
- 直接通过增大/减小某一项权重,可以预测性地影响系统的响应曲线特征(如超调、响应时间、震荡等)
🔧 操作步骤
-
初始设置(例如单位矩阵):
Q=I,R=1Q = I,\quad R = 1Q=I,R=1
-
仿真运行系统,看如下响应指标:
- 超调量
- 稳态误差
- 峰值控制量
- 抖动/频繁操作
-
观察控制趋势:
- 跟踪不准?→ 提高 QQQ 的关键项
- 抖动太大?→ 提高 RRR
-
循环调整至满足性能指标或舒适性要求
🛠 工具推荐
- Python +
matplotlib
+control
仿真框架 - MATLAB Simulink + scope 曲线可视化
- ROS 中动态配置
K
调参并采集驾驶行为数据
🚗 自动驾驶应用案例
观察现象 | 处理方法 |
---|---|
跟踪误差大 | 增加 Qey,QeψQ_{e_y}, Q_{e_\psi}Qey,Qeψ |
控制频繁跳变 | 增加 RRR |
航向角偏移慢 | 增加 QeψQ_{e_\psi}Qeψ |
进入弯道偏移大 | 减小 RRR,提升反应能力 |
5.3 📐 LMI-Based 自动整定
📌 基本思想
将 LQR 权重选择问题转化为一个线性矩阵不等式(LMI)优化问题,自动寻找满足性能指标下的最优权重。
🧠 背景原理
-
LQR 本质是稳定性约束下的最优控制 → 可在 Lyapunov 函数约束下构建如下 LMI:
{Ac=A−BK稳定V(x)=x⊤Px,P≻0最小化 tr(QP)\begin{cases} A_c = A - B K\ \text{稳定} \\ V(x) = x^\top P x,\ P \succ 0 \\ \text{最小化 } \operatorname{tr}(Q P) \end{cases}⎩⎨⎧Ac=A−BK 稳定V(x)=x⊤Px, P≻0最小化 tr(QP)
-
通过控制 Lyapunov 函数下降速率 + 状态/控制限幅约束,可自动搜索 Q,RQ,RQ,R 满足性能指标
🔧 操作步骤
- 明确系统模型 (A,B)(A,B)(A,B) 与性能指标(如响应时间、能耗上限等)
- 将问题转化为优化形式(minimize 某种 cost, subject to LMI)
- 使用 LMI 优化工具(如 CVX, YALMIP)进行数值求解
- 从求得的 PPP 与优化变量中反推 KKK、Q,RQ,RQ,R
🛠 工具推荐
- MATLAB + YALMIP + SeDuMi
- Python + CVXPY(支持 SDP)
- SciML Ecosystem(Julia)也支持非线性 SDP
🚗 自动驾驶应用案例
- 自动整定用于满足“最大横向加速度不超过 2.5m/s²”约束
- 控制能量最小化 → 节能路径跟踪控制器
- 系统稳定裕度 λmin(P)\lambda_{\min}(P)λmin(P) 最大化设计
六、python实现代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import solve_continuous_are# ----------------------------
# 1. 定义线性系统模型
# ----------------------------
# 状态空间模型:dx/dt = A x + B u
A = np.array([[0, 1],[0, 0]]) # 双积分器模型(位置+速度)
B = np.array([[0],[1]]) # 控制输入为加速度# ----------------------------
# 2. 设置 LQR 权重矩阵
# ----------------------------
Q = np.array([[10, 0], # 惩罚位置误差更重[0, 1]]) # 惩罚速度误差次之
R = np.array([[1]]) # 控制成本# ----------------------------
# 3. 求解黎卡提方程并计算最优反馈增益 K
# ----------------------------
P = solve_continuous_are(A, B, Q, R) # 解代数黎卡提方程
K = np.linalg.inv(R) @ B.T @ P # LQR 最优增益print("LQR Gain K =", K)# ----------------------------
# 4. 仿真控制系统响应
# ----------------------------
dt = 0.01 # 时间步长
T = 5 # 仿真总时间
steps = int(T / dt)
x = np.array([[1.0], [0.0]]) # 初始状态:偏离1m,速度为0
trajectory = [x.flatten()]for _ in range(steps):u = -K @ x # 状态反馈控制律x_dot = A @ x + B @ u # 系统动态x += x_dot * dttrajectory.append(x.flatten())trajectory = np.array(trajectory)# ----------------------------
# 5. 可视化结果
# ----------------------------
plt.figure(figsize=(8, 4))
plt.plot(trajectory[:, 0], label="Position $x_1$ (m)")
plt.plot(trajectory[:, 1], label="Velocity $x_2$ (m/s)")
plt.axhline(0, color='gray', linestyle='--')
plt.xlabel("Time Step")
plt.ylabel("State Value")
plt.title("LQR Control Response of a Double Integrator")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
小结对比
方法 | 优点 | 缺点 | 场景适配 |
---|---|---|---|
Bryson’s Rule | 简洁直观、物理意义明确 | 粒度粗、仅限对角权重 | 快速初始化,物理系统强适配 |
Trial-and-Error | 灵活细致、性能可控 | 需反复仿真,调参经验依赖重 | 小规模系统 + 仿真丰富的设计阶段 |
LMI 自动整定 | 自动最优、支持约束 | 数学复杂,需 SDP 解器 | 多目标优化、高安全性应用、复杂耦合系统 |