2660 字
13 分钟
CMU 最优控制笔记 2:LQR、Riccati 递推与轨迹跟踪

学习线性二次型调节器(LQR)时,我把二次规划和 Riccati 递推放在一起整理:同一个最优控制问题,既可以写成二次规划,也可以利用时间结构通过 Riccati 递推求解。

**先修知识:**离散状态空间模型、二次型、矩阵求导与等式约束优化。

阅读路线:

  1. 先明确代价、动力学约束和初始状态,比较 QP 与 Riccati 两种求解思路。
  2. 再区分有限时域、无限时域和平衡点附近的局部控制。
  3. 最后阅读非线性系统案例及 TVLQR 轨迹跟踪,观察线性化的适用范围。

笔记结合 CMU 16-745 的课程与作业整理,相关材料见课程作业页面。文中的代码片段保留学习时的实现,运行时还需使用对应作业的依赖与上下文。

其他学习视角可参考向阳的笔记和知乎我爱科研 的整理

LQR:二次规划与 Riccati 递推#

按2025 年课程目录,LQR in 3 Ways 对应 Lecture 8;此前的笔记记为 Lecture 9,此处按主题组织。

线性二次型最优控制问题

min⁡x1:N,u1:N−1∑k=1N−1(12xkTQxk+12ukTRuk)+12xNTQNxNs.t.xk+1=Akxk+Bkuk,x1=xinit\begin{align} \min_{x_{1:N},{u}_{1:N-1}}& \quad \sum_{k=1}^{N-1}(\frac{1}{2}{x_k}^TQx_k + \frac{1}{2}{u_k}^TRu_k)+\frac{1}{2}{x_N}^TQ_Nx_N \\ \text{s.t.}&\quad x_{k+1}=A_kx_k+B_ku_k,\quad x_1=x_{\mathrm{init}} \end{align}

其中,Q⪰0,R≻0Q\succeq 0,R\succ 0。

  • 根据A,B,Q,RA,B,Q,R是否随时间变化可以分为时不变和时变LQR,时不变 LQR 常用于平衡点附近的稳定控制,TVLQR 用于轨迹跟踪
  • 可以在线性化点附近设计非线性系统的局部控制器;一次线性化得到的 LQR 解不等于原非线性最优控制问题的全局解。

将LQR转换为一个标准的QP问题求解#

定义优化变量zz

z=[u1x2u2..xN]z=\begin{bmatrix} u_1 \\ x_2 \\ u_2 \\ . \\ . \\ x_N \end{bmatrix}

J=12zTHzJ=\frac{1}{2}z^THz

H=[R10...00Q2...0.00...QN]H= \begin{bmatrix} R_1 & 0 & ... & 0 \\ 0 & Q_2 & ... & 0 \\ & & . \\ 0 & 0 & ... & Q_N \end{bmatrix}

Cz=dCz=d

C=[B1(−I).........00AB(−I)...0.00...AN−1BN−1(−I)]d=[−A1x10.0]\begin{aligned} & C= \begin{bmatrix} B_1 & (-I) & ... & ... & ... & 0 \\ 0 & A & B & (-I) & ... & 0 \\ & & . \\ 0 & 0 & ... & A_{N-1} & B_{N-1} & (-I) \end{bmatrix} \\ & d= \begin{bmatrix} -A_1x_1 \\ 0 \\ . \\ 0 \end{bmatrix} \end{aligned}

这样就形式上转换成了一个标准的QP问题

min⁡z12zTHzs.t.Cz=d\begin{aligned} & \min_z\frac{1}{2}z^THz \\ & s.t.\quad Cz=d \end{aligned}

通过引入拉格朗日乘子给出拉格朗日函数,得到 KKT 线性方程组,可直接求解该等式约束二次规划;数值实现时还需检查相应矩阵的可解性

[HCTC0][zλ]=[0d]\begin{bmatrix} H & C^T \\ C & 0 \end{bmatrix} \begin{bmatrix} z \\ \lambda \end{bmatrix}= \begin{bmatrix} 0 \\ d \end{bmatrix}

Riccati 方程求解(利用KKT中的稀疏性)#

下面先用 N=4N=4、时不变 A,B,Q,RA,B,Q,R 的示意例子推导,终端权重为 QNQ_N。时变情形需要给各步矩阵加上下标。

[R.BTQ.−IATR.BTQ.−IATR.BTQN.−I..........B−I.000AB−I.000AB−I.000][u1x2u2x3u3x4λ2λ3λ4]=[000000−Ax100]\begin{bmatrix} R & & & & & & . & B^T & \\ & Q & & & & & . & -I & A^T \\ & & R & & & & . & & B^T \\ & & & Q & & & . & & -I & A^T \\ & & & & R & & . & & & B^T \\ & & & & & Q_N & . & & & -I \\ . & . & . & . & . & . & . & . & . & . \\ B & -I & & & & & . & 0 & 0 & 0 \\ & A & B & -I & & & . & 0 & 0 & 0 \\ & & & A & B & -I & . & 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} u_1 \\ x_2 \\ u_2 \\ x_3 \\ u_3 \\ x_4 \\ \lambda_2 \\ \lambda_3 \\ \lambda_4 \end{bmatrix}= \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ -Ax_1 \\ 0 \\ 0 \end{bmatrix}

从末态x4x_4开始

QNx4−λ4=0⟹λ4=QNx4Q_Nx_4-\lambda_4=0 \Longrightarrow\lambda_4 =Q_Nx_4

考虑u3u_3(分别代入λ4=QNx4\lambda_4 =Q_Nx_4和x4=Ax3+Bu3x_4=Ax_3+Bu_3)

Ru3+BTλ4=Ru3+BTQNx4=Ru3+BTQN(Ax3+Bu3)=0⟹u3=−(R+BTQNB)−1BTQNAx3\begin{aligned} &Ru_3+B^T\lambda_4=Ru_3+B^TQ_Nx_4=Ru_3+B^TQ_N(Ax_3+Bu_3)=0\\ &\Longrightarrow u_3 =-(R+B^TQ_NB)^{-1}B^TQ_NAx_3 \end{aligned}

记成u3=−K3x3u_3=-K_3x_3

到x3x_3

Qx3−λ3+ATλ4=0⟹Qx3−λ3+ATQNx4=0⟹Qx3−λ3+ATQN(Ax3+Bu3)=0⟹Qx3−λ3+ATQN(A−BK3)x3=0⟹λ3=[Q+ATQN(A−BK3)]x3\begin{align} &Qx_3-\lambda_3+A^T\lambda_4=0\\ \Longrightarrow& Qx_3-\lambda_3+A^TQ_Nx_4=0\\ \Longrightarrow& Qx_3-\lambda_3+A^TQ_N(Ax_3+Bu_3)=0\\ \Longrightarrow& Qx_3-\lambda_3+A^TQ_N(A-BK_3)x_3=0\\ \Longrightarrow& \lambda_3= [Q+A^TQ_N(A-BK_3)]x_3\\ \end{align}

记为λ3=P3x3\lambda_3=P_3x_3

这样依次递推出KnK_n和PnP_n,便可求出控制序列u1:N−1u_{1:N-1}

PN=QNKn=(R+BTPn+1B)−1BTPn+1APn=Q+ATPn+1(A−BKn)\begin{align} P_N& = Q_N\\ K_n& = (R+B^TP_{n+1}B)^{-1}B^TP_{n+1}A\\ P_n& = Q+A^TP_{n+1}(A-BK_n) \end{align}

数值实现应求解线性方程组来计算增益,避免显式计算逆矩阵。时变形式为 Kn=(Rn+Bn⊤Pn+1Bn)−1Bn⊤Pn+1AnK_n=(R_n+B_n^\top P_{n+1}B_n)^{-1}B_n^\top P_{n+1}A_n、Pn=Qn+An⊤Pn+1(An−BnKn)P_n=Q_n+A_n^\top P_{n+1}(A_n-B_nK_n)。

例子-HW2 Q1#

Part A 离散化动力学模型#

考虑一个二阶积分系统,状态和控制变量如下

x=[p1,p2,v1,v2]u=[a1,a2]\begin{align} x &= [p_1, p_2, v_1, v_2] \\ u &= [a_1, a_2] \end{align}

状态空间方程x˙=Ax+Bu\dot{x}=Ax+Bu

x˙=[0010000100000000]x+[00001001]u\begin{align} \dot{x} = \begin{bmatrix} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix} x + \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ 1 & 0 \\ 0 & 1 \end{bmatrix} u\end{align}

离散状态空间方程xk+1=Adxk+Bdukx_{k+1}=A_dx_k+B_du_k

在输入零阶保持、A2=0A^2=0 时,Ad=I+AΔtA_d=I+A\Delta t、Bd=(IΔt+AΔt2/2)BB_d=(I\Delta t+A\Delta t^2/2)B。原式遗漏右乘 BB,会使输入矩阵的维度错误。对本例:

Ad=[I2ΔtI20I2],Bd=[12Δt2I2ΔtI2].A_d=\begin{bmatrix}I_2&\Delta t I_2\\0&I_2\end{bmatrix},\qquad B_d=\begin{bmatrix}\frac12\Delta t^2 I_2\\\Delta t I_2\end{bmatrix}.

Part B: Finite Horizon LQR via Convex Optimization#

定义性能指标和约束方程,使用 Convex.jl求解得到 Xcvx,Ucvx = convex_trajopt(A,B,Q,R,Qf,N,x_ic)

min⁡x1:N,u1:N−1∑i=1N−1[12xiTQxi+12uiTRui]+12xNTQfxNstx1=xICxi+1=Axi+Buifor i=1,2,…,N−1\begin{align} \min_{x_{1:N},u_{1:N-1}} \quad & \sum_{i=1}^{N-1} \bigg[ \frac{1}{2} x_i^TQx_i + \frac{1}{2} u_i^TRu_i \bigg] + \frac{1}{2}x_N^TQ_fx_N\\ \text{st} \quad & x_1 = x_{\text{IC}} \\ & x_{i+1} = A x_i + Bu_i \quad \text{for } i = 1,2,\ldots,N-1 \end{align}

初态xic=[5,7,2,−1.4]x_{ic} = [5,7,2,-1.4]

**验证 Bellman 最优性原理:**从原最优轨迹在时刻 LL 的状态 xL∗x_L^* 出发,保留剩余时域、代价和约束,原最优控制序列的后缀仍是这个子问题的最优解。这不表示系统在任意中间时刻都已到达平衡点;若解不唯一,也不能要求重新求解后的轨迹必然逐点相同。

min⁡xL:N,uL:N−1∑i=LN−1[12xiTQxi+12uiTRui]+12xNTQfxNst xL=xL∗xi+1=Axi+Buifor i=L,L+1,…,N−1\begin{align} \min_{x_{L:N},u_{L:N-1}} \quad & \sum_{i=L}^{N-1} \bigg[ \frac{1}{2} x_i^TQx_i + \frac{1}{2} u_i^TRu_i \bigg] + \frac{1}{2}x_N^TQ_fx_N\\ \text{st } \quad & x_L = x^*_L \\ & x_{i+1} = A x_i + Bu_i \quad \text{for } i = L,L + 1,\ldots,N-1 \end{align}

Part C:Finite-Horizon LQR via Riccati#

使用Riccati 方程递推求解离散LQR问题的解析解并与convex.jl的求解结果进行对比,结果是一致的

多次随机初始状态结果也是一致的

Part D: Why LQR is so great LQR的优异性#

求出控制序列后,给实际的动力学系统加入噪声

xk+1=Axk+Buk+noisex_{k+1} = Ax_k + Bu_k + \text{noise}
noise = [.005*randn(2);.1*randn(2)]

此处比较的是一次求解后直接执行的开环控制序列,与每步根据实际状态计算的反馈控制 uk=−Kkxku_k=-K_kx_k。抗扰效果来自反馈;对于同一个无约束 LQR 问题,QP 与 Riccati 是等价的求解方法,不能据此认定 Riccati 求解器本身更鲁棒。QP 若每步重新求解,也能形成反馈。

设定非零目标 xgoal=[−3.5,−3.5,0,0]x_{goal}=[-3.5,-3.5,0,0]。对本例双积分系统,它在零输入下仍是平衡点,因此可在误差坐标中使用 u=−K(x−xgoal)u=-K(x-x_{goal})。一般系统需要先求满足平衡条件的 (xgoal,ugoal)(x_{goal},u_{goal}),再使用 u=ugoal−K(x−xgoal)u=u_{goal}-K(x-x_{goal})。

Part E: Infinite -horizon LQR 无限时间二次型调节问题#

矩阵PKP K各元素的变化如图所示,可以看出对于一个有限时间的LQR系统,矩阵P(nx×nx)P(n_x\times n_x)和K(nu×nx)K(n_u\times n_x)在Ricatti反向迭代的过程中,经过一段时间就很快收敛。

对于时不变无限时域 LQR,在 (A,B)(A,B) 可稳定、(Q1/2,A)(Q^{1/2},A) 可检测且 R≻0R\succ0 等标准条件下,可得到稳定化 Riccati 解和常数增益 KK。有限时域曲线在本例中趋于平稳,不表示任意系统都能快速收敛。

例子-HW Q2 LQR for nonlinear systems#

Part 0 预备知识#

非线性系统线性化

给定参考状态轨迹xˉ1:N\bar{x}_{1:N}和参考控制轨迹uˉ1:N−1\bar{u}_{1:N-1},定义增量坐标

xk=xˉk+Δxk,uk=uˉk+Δuk.x_k=\bar{x}_k+\Delta x_k,u_k=\bar{u}_k+\Delta u_k.

对离散非线性动力学系统xk+1=f(xk,uk)x_{k+1}=f(x_k,u_k)进行线性化(一阶泰勒展开)

xk+1≈f(xˉk,uˉk)+∂f∂x∣xˉk,uˉk⏟AkΔxk+∂f∂u∣xˉk,uˉk⏟BkΔukx_{k+1}\approx f(\bar{x}_k,\bar{u}_k)+\underbrace{\frac{\partial f}{\partial x}|_{\bar{x}_k,\bar{u}_k}}_{A_k}\Delta x_k+\underbrace{\frac{\partial f}{\partial u}|_{\bar{x}_k,\bar{u}_k}}_{B_k}\Delta u_k

其中,AkA_k是状态雅可比矩阵(nx×nx)(n_x\times n_x),BkB_k是控制雅可比矩阵(nx×nu)(n_x\times n_u)

如果参考轨迹是动态可行的(即满足xˉk+1=f(xˉk,uˉk)\bar{x}_{k+1}=f(\bar{x}_k,\bar{u}_k)),则泰勒展开式可简化为

xˉk+1+Δxk+1≈f(xˉk,uˉk)+AkΔxk+BkΔuk\bar{x}_{k+1}+\Delta x_{k+1}\approx f(\bar{x}_k,\bar{u}_k)+A_k \Delta x_k+B_k \Delta u_k

得到增量动力学方程

Δxk+1≈AkΔxk+BkΔuk\Delta x_{k+1}\approx A_k \Delta x_k+B_k \Delta u_k

线性时不变系统离散化方法

x˙(t)=Ax(t)+Bu(t)\dot{x}(t)=Ax(t)+Bu(t)

连续系统的解为

x(t)=eA(t−t0)x(t0)+∫t0teA(t−τ)Bu(τ)dτx(t)=e^{A(t-t_0)}x(t_0)+\int_{t_0}^{t}e^{A(t-\tau)}Bu(\tau)d\tau

使用零阶保持器(ZOH)控制u(t)=uku(t)=u_k在t∈[tk,tk+1]t\in[t_k,t_{k+1}],则

xk+1=eAΔtxk+(∫0ΔteAτdτ)Bukx_{k+1}=e^{A\Delta t}x_k+(\int_{0}^{\Delta t}e^{A\tau}d\tau)Bu_k

构造增广系统

ddt[x(t)u(t)]=[AB00][x(t)u(t)]\frac{d}{dt} \begin{bmatrix} x(t) \\ u(t) \end{bmatrix}= \begin{bmatrix} A & B \\ 0 & 0 \end{bmatrix} \begin{bmatrix} x(t) \\ u(t) \end{bmatrix}

在ZOH假设下u˙(t)=0\dot{u}(t)=0,计算该系统的状态转移矩阵

exp⁡([AB00]Δt)=[eAΔt∫0ΔteAτdτB0I]\exp\left( \begin{bmatrix} A & B \\ 0 & 0 \end{bmatrix}\Delta t\right)= \begin{bmatrix} e^{A\Delta t} & \int_{0}^{\Delta t}e^{A\tau}d\tau B \\ 0 & I \end{bmatrix}

通过计算增广矩阵的指数

exp⁡([AB00]Δt)=[AkBk0I]\exp\left(\begin{bmatrix}A&B\\0&0\end{bmatrix}\Delta t\right)=\begin{bmatrix}A_k&B_k\\0&I\end{bmatrix}
  • AkA_k为左上n×nn\times n块
  • BkB_k为右上n×mn\times m块

Part A: Infinite Horizon LQR about an equilibrium#

小车倒立摆(CartPole)的动力学方程

H(q)q¨+C(q,q˙)q˙+G(q)=BuH(q)\ddot{q}+C(q,\dot{q})\dot{q}+G(q)=Bu
  • 广义坐标q=[p,θ]q=[p,\theta]
  • 质量惯性矩阵H=[mc+mpmplcos⁡θmplcos⁡θmpl2]H= \begin{bmatrix} m_c+m_p & m_pl\cos\theta \\ m_pl\cos\theta & m_pl^2 \end{bmatrix}
  • 科里奥利矩阵C=[0−mplθ˙sin⁡θ00]C= \begin{bmatrix} 0 & -m_pl\dot{\theta}\sin\theta \\ 0 & 0 \end{bmatrix}
  • 重力向量G=[0mpglsin⁡θ]G=\begin{bmatrix}0\\m_pgl\sin\theta\end{bmatrix}(此处 θ=0\theta=0 为摆向下)
  • 输入映射矩阵B=[10]B=\begin{bmatrix}1\\0\end{bmatrix}

使用Infinite Horizon LQR将倒立摆小车稳定到平衡位置

xgoal = [0, pi, 0, 0]
x0 = [0, pi, 0, 0] + [1.5, deg2rad(-20), .3, 0]

Part B : Basin of Attraction吸引域分析#

LQR控制器是基于系统在(xgoal,ugoal)(x_{goal},u_{goal})处的线性近似设计的,当系统状态远离线性化点时,真实非线性动力学与线性模型差异变大,导致控制器性能下降甚至失效。

这里测试LQR控制器在不同初始条件下的稳定性,绘制吸引域,即能成功稳定的初始状态范围。

# create a span of initial configurations
M=20
ps = LinRange(-7, 7, M)
thetas = LinRange(deg2rad(180-60), deg2rad(180+60), M)

Part C : 无限时域LQR调参#

本例通过调整 Q,RQ,R 并对输入限幅,检查给定初态下 5 秒末的误差是否小于 0.1。LQR 本身不显式处理 −3≤u≤3-3\le u\le3;截断控制会改变闭环系统,某次仿真满足条件不能保证其他初态也满足。需要硬约束时,应采用相应的约束优化控制方法。

Part D: TVLQR for trajectory tracking#

在参考轨迹的每个点上线性化系统,设计时变反馈增益K(t)K(t),使系统能稳定跟踪时变目标。

function TVlqr(A_list::Vector{Matrix{Float64}}, B_list::Vector{Matrix{Float64}}, Q::Matrix, R::Matrix,
Qf::Matrix,N::Int64)::Tuple{Vector{Matrix{Float64}}, Vector{Matrix{Float64}}}
nx, nu = size(B_list[1])
P = [zeros(nx,nx) for i = 1:N]
K = [zeros(nu,nx) for i = 1:N-1]
P[N] = deepcopy(Qf)
for i = N-1:-1:1
A,B = A_list[i],B_list[i]
K[i] = (R + B'*P[i+1]*B) \ (B'*P[i+1]*A)
P[i] = Q + A'*P[i+1]*(A - B*K[i])
end
return P,K
end

整理与核查说明#

本笔记原有许可为 CC BY 4.0。引用的课程材料、代码和图片仍须遵守其各自的许可。

核查状态:部分验证(2026-10-04)。 已核对离散化、LQR 与二次规划关系及维度;完整摆杆实验未重新运行。

2026-10-04 整理时修正了已定位的公式和实现问题。文中的图片、动画和输出保留自学习时的实验记录,不代表修订后的代码已经完整重跑。作业片段依赖原项目环境,不能直接作为完整可运行教程;具体核查范围与尚未复现事项见正文。

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取