自动驾驶控制算法——LQR控制算法
文章目录
一、LQR 是什么?
Linear Quadratic Regulator(线性二次型调节器,简称 LQR)是一类基于状态反馈的最优控制算法。
它针对“线性系统 + 二次型代价函数”这对经典组合,自动给出一组最优反馈增益,从而在误差最小化与控制能量最小化之间取得全局最优折中。
在自动驾驶中,LQR 被广泛用于横向/纵向轨迹跟踪、车道保持(LKA)、稳定性控制(VSC)、智能底盘协同控制等场景,兼具实时性、多变量耦合处理能力与理论最优性。
二、LQR 原理
2.1 线性状态空间模型 (State–Space Model)
对连续时间系统,令
x ˙ ( t ) = A x ( t ) + B u ( t ) \dot{x}(t)=A\,x(t)+B\,u(t) x˙(t)=Ax(t)+Bu(t)
- x ( t ) ∈ R n x(t)\in\mathbb{R}^n x(t)∈Rn:状态向量(位置、姿态、速度、误差等)
- u ( t ) ∈ R m u(t)\in\mathbb{R}^m u(t)∈Rm:控制输出(转向角、驱动力、制动力等)
- A A A、 B B B:系统动力学矩阵(可由自行车模型、三自由度模型或实验辨识而得)
离散时间版本(采样周期 Δ t \Delta t Δt)同理:
x k + 1 = A d x k + B d u k x_{k+1}=A_d\,x_k+B_d\,u_k xk+1=Adxk+Bduk
2.2 二次型性能指标 J J J
设计目标:在 t ∈ [ 0 , ∞ ) t\in[0,\infty) t∈[0,∞) 内最小化
J = ∫ 0 ∞ ( x T ( t ) Q x ( t ) + u T ( t ) R u ( t ) ) d t J=\int_{0}^{\infty}\!\bigl(x^{\mathrm T}(t)Qx(t)+u^{\mathrm T}(t)Ru(t)\bigr)\,dt J=∫0∞(xT(t)Qx(t)+uT(t)Ru(t))dt
记号 | 物理含义 | 工程调节思路 |
---|---|---|
Q ⪰ 0 Q\succeq0 Q⪰0 | 状态加权矩阵:惩罚偏离参考轨迹 | 误差越关键,赋值越大 |
R ≻ 0 R\succ0 R≻0 | 控制加权矩阵:惩罚控制能耗/激烈度 | 不希望频繁/剧烈操舵就增大 R R R |
2.3 代数黎卡提方程 (ARE)
最优解存在唯一正定矩阵 P P P,满足
A T P + P A − P B R − 1 B T P + Q = 0 A^{\mathrm T}P+PA-PBR^{-1}B^{\mathrm T}P+Q=0 ATP+PA−PBR−1BTP+Q=0
得到最优反馈增益
K = R − 1 B T P ⟹ u ( t ) = − K x ( 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 , R A,B,Q,R A,B,Q,R 全局最优;无局部极值困扰。
- 多变量耦合:一次性考虑所有状态与输入,天然处理耦合。
- 实时性高:上线前离线求 K K K,在线只需矩阵乘法。
- 线性假设:需在工作点线性化;大幅偏离或强非线性场景下效果下降。
- 无显式约束:不直接处理饱和与障碍,需要配合限幅或外层规划器。
2.5 一句话总结 LQR 原理:
LQR 就像一个“聪明的爸爸”,手里拽着你(小孩)一根绳子,在奔跑中努力让你既不跑偏,又不会猛拉你太用力。
2.5.1 场景类比:小孩牵绳跑步
假设你(小孩)在一个广场上跑步,有一个目标路线(比如一条蓝色的直线轨迹),你爸(控制器)拽着你一根弹力绳,任务是让你尽量沿着这条轨迹跑。你爸不能直接控制你,但可以通过拉扯绳子的方式调整你的方向。
现在他面临两个问题:
- 你偏离轨迹越多(状态误差大),他就想越用力拉你回来
- 但用力过猛你会摔倒(控制动作大 → 不舒适),他也不想那样
于是他就想着:
“我要最优地拉这根绳子,让我家孩子既快速回到轨迹,又不至于每次都摔个大跟头。”
这时候他脑子里其实就运行着一个 LQR 控制器。
2.5.2 数学意义下的类比映射:
生活场景 | 控制系统术语 |
---|---|
你的位置与方向 | 状态向量 x ( t ) x(t) x(t) |
你爸的拉力 | 控制输入 u ( t ) u(t) u(t) |
你和轨迹的偏离 | 状态误差(需要惩罚) |
拉绳子的幅度大小 | 控制开销(也要惩罚) |
你爸的聪明程度 | 增益矩阵 K K K,控制律 u = − K x u = -Kx u=−Kx |
怎么权衡纠偏 vs 用力 | 惩罚矩阵 Q , R Q, R Q,R,定义什么是“好” |
目标 | 让总代价函数 J J J 最小(偏差小 + 控制平滑) |
2.5.3 更直白一点的解释:
LQR 的工作流程可以理解为以下四步:
① 系统动态是什么?
你是个小车,你能跑、能转弯,爸爸知道你每跑一步、每拐一个弯,会跑到什么位置 → 系统模型:
x ˙ ( t ) = A x ( t ) + B u ( t ) \dot{x}(t) = A x(t) + B u(t) x˙(t)=Ax(t)+Bu(t)
② 什么样的轨迹才叫“好”?
当然是既偏差小,又别太用力操控你:
J = ∫ 0 ∞ [ x T Q x + u T R u ] d t J = \int_0^\infty \left[ x^T Q x + u^T R u \right] dt J=∫0∞[xTQx+uTRu]dt偏差太大 x T Q x x^T Q x xTQx 会被罚
- 控制太猛 u T R u u^T R u uTRu也要罚
- 怎么罚?用矩阵 Q , R Q, R Q,R 来定义,自己调!
③ 怎么做才最优?
解一个叫“黎卡提方程”的东西,得到一个增益 K K K,然后只要你一偏离,控制器就自动拉回:
u ( t ) = − K x ( t ) u(t) = -K x(t) u(t)=−Kx(t)
这个反馈矩阵 K K K 就是控制器的“聪明劲儿”。
④ 最终结果如何?
- 如果你设计得好,系统运行起来就像小车沿轨道平稳前进,轻松纠偏
- 如果你太注重精度( Q Q Q太大),控制器可能疯狂操作
- 如果你太怕费力( R R R太大),小车就变得慵懒、不追轨了
🖼️ 图像化理解你可以把 LQR 理解为:“我告诉系统什么是‘好’,它就自己计算出‘怎么做’”。
总结关键思想
关键词 | 意义 |
---|---|
误差反馈 | LQR 直接用当前误差状态来反馈控制 |
最优折中 | 不只纠错,还要代价最小 |
增益矩阵 | 控制器的大脑,自动学会怎么拉得最好 |
提前离线求解 | 控制器上线后实时快如闪电(仅乘法) |
2.6 案例分析 —— 车辆轨迹跟踪
2.6.1 任务介绍
- 目标:让车辆以 15 m/s 的恒速精准沿参考曲线(S 形)行驶,最小化横向误差 e y e_y ey 和航向误差 e ψ e_\psi eψ。
- 模型:采用简化自行车模型并在小角度、恒速条件下线性化。
2.6.2 控制流程
实时感知车辆位置与姿态 → 计算误差向量 x = [ e y , e ˙ y , e ψ , e ˙ ψ ] T x=[e_y,\,\dot e_y,\,e_\psi,\,\dot e_\psi]^{\mathrm T} x=[ey,e˙y,eψ,e˙ψ]T。
状态反馈:控制器输出前轮转角
δ = − K x \delta=-Kx δ=−Kx
车辆执行 → 新状态回馈 → 进入下一控制周期。
2.6.3 参数调优现象观察
- 增大 Q ( e y , 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 常用术语
术语 | 含义 |
---|---|
P P P | 黎卡提方程解,衡量未来代价的“势能” |
K K K | 状态反馈增益矩阵 |
Closed-Loop Poles | 闭环特征值,决定响应快慢与稳定性 |
2.7.2 权重矩阵 Q , R Q,R Q,R对性能的影响
- 大 Q Q Q / 小 R R R:强调跟踪精度 → 响应快、可能过冲。
- 小 Q Q Q / 大 R R R:强调控制平滑 → 误差大、舒适性高。
2.7.3 关键性能指标
- 稳态误差
- 超调量 / 峰值转角
- 90% 调整时间
- 控制能量 ∫ u 2 d t \int u^2 dt ∫u2dt
2.7.4 计算与信号流程图
感知 → 计算状态误差 → LQR 内核(读 K K K 表 → 乘以 − K K K)→ 输出控制 → 车辆执行 → 反馈环。 (工程实现中常封装成 ROS 控制节点或嵌入式任务)
2.7.5 典型作用总结
- 在紧急避障前提供平稳高精度跟踪。
- 可作为 MPC 的终端控制器或非线性控制器的局部线性近似补偿器。
- 在低速或大曲率场景下,可结合速度规划降低侧向加速度峰值。
2.7.6 设计准则与物理量对应关系
物理量/需求 | 建议权重调整 |
---|---|
横向误差 ≤ 0.1 m | 提高 Q e y Q_{e_y} Qey |
航向误差 ≤ 0.5° | 提高 Q e ψ Q_{e_\psi} Qeψ |
乘坐舒适度 | 提高 R R R 以限制剧烈操舵 |
转角饱和 | 事先加输入限幅或适当增大 R R R |
低抓地/湿滑路面 | 同时增大 Q , R Q,R Q,R并在外层降速 |
三、离散 LQR 推导(DLQR)
3.1 离散状态空间模型
x k + 1 = A d x k + B d u k , k = 0 , 1 , … x_{k+1}=A_d\,x_k+B_d\,u_k,\qquad k=0,1,\dots xk+1=Adxk+Bduk,k=0,1,…
- x k ∈ R n x_k\in\mathbb{R}^n xk∈Rn:第 k k k 步系统状态
- u k ∈ R m u_k\in\mathbb{R}^m uk∈Rm:控制输入
- A d , B d A_d,B_d Ad,Bd:离散化后的系统矩阵(可由零阶保持 A d = e A Δ t , B d = ∫ 0 Δ t e A τ d τ B A_d=e^{A\Delta t},\;B_d=\int_0^{\Delta t}\!e^{A\tau}\,d\tau\,B Ad=eAΔt,Bd=∫0ΔteAτdτB 获得,或直接辨识/数值近似)
3.2 无限时域二次型性能指标
J = ∑ k = 0 ∞ ( x k ⊤ Q x k + u k ⊤ R u k ) , Q ⪰ 0 , R ≻ 0 J=\sum_{k=0}^{\infty}\Bigl(x_k^{\!\top}Qx_k+u_k^{\!\top}Ru_k\Bigr),\qquad Q\succeq0,\;R\succ0 J=∑k=0∞(xk⊤Qxk+uk⊤Ruk),Q⪰0,R≻0
有限时域(Horizon NNN)只需将求和上限改为 N − 1 N-1 N−1,末端加终端权 x N ⊤ S x N x_N^{\!\top}Sx_N xN⊤SxN。
3.3 动态规划推导
定义成本到终点(Cost-to-Go)函数
J k ( x k ) = ∑ i = k ∞ ( x i ⊤ Q x i + u i ⊤ R u i ) 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 最优性原理
J k ( x ) = min u [ x ⊤ Q x + u ⊤ R u + J k + 1 ( A d x + B d u ) ] 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)]
二次型猜想 设 J k ( x ) = x ⊤ P k x J_k(x)=x^{\!\top}P_kx Jk(x)=x⊤Pkx,则递推得到 P k = Q + A d ⊤ P k + 1 A d − A d ⊤ P k + 1 B d ( R + B d ⊤ P k + 1 B d ) − 1 B d ⊤ P k + 1 A d P_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_d Pk=Q+Ad⊤Pk+1Ad−Ad⊤Pk+1Bd(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1Ad_
最优控制律** u k ⋆ = − K k x k , K k = ( R + B d ⊤ P k + 1 B d ) − 1 B d ⊤ P k + 1 A d u_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_d uk⋆=−Kkxk,Kk=(R+Bd⊤Pk+1Bd)−1Bd⊤Pk+1Ad
无限时域收敛:若 ( A d , B d ) (A_d,B_d) (Ad,Bd) 稳定可控且 ( A d , Q 1 / 2 ) (A_d,Q^{1/2}) (Ad,Q1/2) 可观,则存在极限
P k → k → ∞ P ∞ P_k\xrightarrow[k\to\infty]{}P_\infty Pkk→∞P∞
其满足离散代数黎卡提方程(DARE)
P = A d ⊤ P A d − A d ⊤ P B d ( R + B d ⊤ P B d ) − 1 B d ⊤ P A d + Q P=A_d^{\!\top}PA_d- A_d^{\!\top}PB_d\bigl(R+B_d^{\!\top}PB_d\bigr)^{-1} B_d^{\!\top}PA_d+Q P=Ad⊤PAd−Ad⊤PBd(R+Bd⊤PBd)−1Bd⊤PAd+Q
得到 恒定最优增益
K = ( R + B d ⊤ P B d ) − 1 B d ⊤ P A d K=\bigl(R+B_d^{\!\top}PB_d\bigr)^{-1}B_d^{\!\top}PA_d K=(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)
- 若做有限时域控制,可从终端条件 P N = S P_N=S PN=S 向前递推(Backward Riccati Sweep)。
3.4 DLQR 与 CLQR 的对应关系
连续 LQR | 离散 LQR |
---|---|
ARE: A ⊤ P + P A − P B R − 1 B ⊤ P + Q = 0 A^\top P+PA-PBR^{-1}B^\top P+Q=0 A⊤P+PA−PBR−1B⊤P+Q=0 | DARE 上式 |
控制律: u = − K x , K = R − 1 B ⊤ P u=-Kx,\;K=R^{-1}B^\top P u=−Kx,K=R−1B⊤P | 同型: K = ( R + B ⊤ P B ) − 1 B ⊤ P A K=\bigl(R+B^\top PB\bigr)^{-1}B^\top PA K=(R+B⊤PB)−1B⊤PA |
解析稳定域靠 ARE 正定解 | 解析稳定域靠 DARE 正定解 |
四、iLQR(Iterative LQR)扩展
动机:LQR 只适用于线性近似;真实车辆模型 x k + 1 = f ( x k , u k ) x_{k+1}=f(x_k,u_k) xk+1=f(xk,uk) 往往非线性。
思路:在给定控制序列附近迭代线性化 + 二次化,每轮都做一次“时变 LQR” → 前向滚动更新 → 直至收敛。
本质上是 DDP(Differential Dynamic Programming)的简化实现,计算量更轻,且易于嵌入 MPC/规划器。
4.1 问题定义
- 非线性动力学: x k + 1 = f ( x k , u k ) x_{k+1}=f(x_k,u_k) xk+1=f(xk,uk)
- 分段代价: ℓ k ( x k , u k ) \ell_k(x_k,u_k) ℓk(xk,uk),终端代价 ℓ f ( x N ) \ell_f(x_N) ℓf(xN)
- 目标: min u 0 : N − 1 ∑ k = 0 N − 1 ℓ k + ℓ f u 0 : N − 1 \displaystyle\min_{u_{0:N-1}}\ \sum_{k=0}^{N-1}\ell_k+\ell_fu0:N−1 u0:N−1min k=0∑N−1ℓk+ℓfu0:N−1
4.2 算法框架
初始化:选一条可行控制序列 { u k ( 0 ) } \{u_k^{(0)}\} {uk(0)},正向仿真得到轨迹 { x k ( 0 ) } \{x_k^{(0)}\} {xk(0)}。
迭代循环 ( t = 0 , 1 , 2 , … t = 0,1,2,… t=0,1,2,…):
线性化:对每个步长 k k k
δ x k + 1 = A k δ x k + B k δ u k , A k = ∂ f ∂ x ∣ ( x k ( t ) , u k ( t ) ) , B k = ∂ 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):求时变增益 K k ( t ) , k k ( t ) K_k^{(t)},k_k^{(t)} Kk(t),kk(t)(反馈 + 前馈)。
前向滚动:更新控制
u k ( t + 1 ) = u k ( t ) + α ( t ) k k ( t ) + K k ( t ) ( x k ( t + 1 ) − x k ( 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))
并重新仿真得 { x k ( 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 do
X ← 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 break
U ← 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 的设计核心在于选择合适的权重矩阵 Q Q Q 与 R R R,它们反映了控制器对误差状态与控制输入的“偏好程度”。调得好,可以实现高精度+高舒适性;调不好则可能导致过度抖动、饱和、甚至失稳。本节介绍三种常用的权重调参策略。
5.1 ✅ Bryson’s Rule
📌 基本思想
将每个状态量/控制量的“最大允许值”设为代价函数中的单位惩罚基准。
即:对每个分量设定其最大允许值 x i , max x_{i,\max} xi,max、 u max u_{\max} umax,令:
Q i i = 1 x i , max 2 , R = 1 u max 2 Q_{ii} = \frac{1}{x_{i,\max}^2},\quad R = \frac{1}{u_{\max}^2} Qii=xi,max21,R=umax21
🧠 背景原理
LQR 性能指标函数本质上是:
J = ∫ x ⊤ Q x + u ⊤ R u d t = ∑ (状态惩罚) + (控制惩罚) 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 = d i a g ( 1 x 1 2 , 1 x 2 2 , … ) , R = 1 u max 2 Q = \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)。
🚗 自动驾驶应用案例
物理量 | 变量 | 允许最大值 | 权重项 |
---|---|---|---|
横向误差 | e y e_y ey | 0.2 m | Q 1 , 1 = 25 Q_{1,1} = 25 Q1,1=25 |
航向角误差 | e ψ e_\psi eψ | 3° = 0.052 rad | Q 2 , 2 ≈ 369 Q_{2,2} ≈ 369 Q2,2≈369 |
转向角 | δ \delta δ | 25° = 0.436 rad | R = 5.26 R = 5.26 R=5.26 |
5.2 🛠️ Trial-and-Error 调参法
📌 基本思想
基于仿真/试验观察系统响应曲线,手动增减 Q Q Q/ R R R 中元素逐步调整控制行为。
🧠 背景原理
- LQR 是解析型反馈控制,其性能高度依赖于代价函数的构型
- 直接通过增大/减小某一项权重,可以预测性地影响系统的响应曲线特征(如超调、响应时间、震荡等)
🔧 操作步骤
初始设置(例如单位矩阵):
Q = I , R = 1 Q = I,\quad R = 1 Q=I,R=1
仿真运行系统,看如下响应指标:
- 超调量
- 稳态误差
- 峰值控制量
- 抖动/频繁操作
观察控制趋势:
- 跟踪不准?→ 提高 Q Q Q 的关键项
- 抖动太大?→ 提高 R R R
循环调整至满足性能指标或舒适性要求
🛠 工具推荐
- Python +
matplotlib
+control
仿真框架 - MATLAB Simulink + scope 曲线可视化
- ROS 中动态配置
K
调参并采集驾驶行为数据
🚗 自动驾驶应用案例
观察现象 | 处理方法 |
---|---|
跟踪误差大 | 增加 Q e y , Q e ψ Q_{e_y}, Q_{e_\psi} Qey,Qeψ |
控制频繁跳变 | 增加 R R R |
航向角偏移慢 | 增加 Q e ψ Q_{e_\psi} Qeψ |
进入弯道偏移大 | 减小 R R R,提升反应能力 |
5.3 📐 LMI-Based 自动整定
📌 基本思想
将 LQR 权重选择问题转化为一个线性矩阵不等式(LMI)优化问题,自动寻找满足性能指标下的最优权重。
🧠 背景原理
LQR 本质是稳定性约束下的最优控制 → 可在 Lyapunov 函数约束下构建如下 LMI:
{ A c = A − B K 稳定 V ( x ) = x ⊤ P x , P ≻ 0 最小化 tr ( Q P ) \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 , R Q,R Q,R 满足性能指标
🔧 操作步骤
- 明确系统模型 ( A , B ) (A,B) (A,B) 与性能指标(如响应时间、能耗上限等)
- 将问题转化为优化形式(minimize 某种 cost, subject to LMI)
- 使用 LMI 优化工具(如 CVX, YALMIP)进行数值求解
- 从求得的 P P P 与优化变量中反推 K K K、 Q , R Q,R Q,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 * dt
trajectory.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 解器 | 多目标优化、高安全性应用、复杂耦合系统 |