离散LQR
工程中用的大部分控制分为两种,无模型和基于模型的。无模型的主要是PID,基于模型的主要是LQR和MPC。PID的思想很直观不涉及推导,而LQR和MPC设计到一些具体数学公式的推导。这篇博客记录一下LQR的原理和推导过程,之后学到MPC了再详细展开记录。
首先限定讨论的范围,LQR(Linear Quadratic Regulation,线性二次调节器),针对的是线性时不变系统,本质上是一种状态反馈控制,最终目的是求反馈增益 K K K。此外,工程中应用中计算机控制是离散的,因此本篇博客讨论离散系统的LQR。
基于模型的控制,首先需要建立被控对象的模型。这里我们假设模型已经建立,状态矩阵和输入矩阵分别为
A
A
A和
B
B
B,系统离散状态空间方程为:
x
(
k
+
1
)
=
A
x
(
k
)
+
B
u
(
k
)
x(k+1) = Ax(k) + Bu(k)
x(k+1)=Ax(k)+Bu(k)
LQR的思想是建立一个代价函数
J
J
J,找到某个控制律
u
u
u,使得代价函数最小,这里建立代价函数为:
J
0
→
N
=
1
2
x
N
T
S
x
N
+
1
2
∑
k
=
0
N
−
1
(
x
k
T
Q
x
k
+
u
k
T
R
u
k
)
J_{0\rightarrow N} = \frac{1}{2}x_N^T S x_N + \frac{1}{2}\sum\limits_{k=0}^{N-1}\left( x_k^T Q x_k + u_k^T R u_k \right)
J0→N=21xNTSxN+21k=0∑N−1(xkTQxk+ukTRuk)
式中,
N
N
N为终端时刻,
S
S
S表示终端权重矩阵,即最终时刻系统状态的权重,
Q
Q
Q和
R
R
R分别表示权重矩阵,这两个矩阵正定,赋予系统状态
x
x
x和系统输入
u
u
u中元素不同的权重,这些代价都是自行定义的参数。这个代价函数表示系统从初始
0
0
0时刻到最终
N
N
N时刻,状态和输入的加权平方和。
公式推导
先给出最终推导得到的形式:
P
k
=
Q
+
A
T
P
k
−
1
A
−
A
T
P
B
(
B
T
P
k
−
1
B
+
R
)
−
1
B
T
P
k
−
1
A
K
N
−
k
=
(
B
T
P
k
−
1
B
+
R
)
−
1
B
T
P
k
−
1
A
u
N
−
k
∗
=
−
K
N
−
k
x
N
−
k
\begin{aligned} &P_{k} = Q + A^T P_{k-1} A - A^T P B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ &K_{N-k} = (B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ &u_{N-k}^* = -K_{N-k}x_{N-k} \end{aligned}
Pk=Q+ATPk−1A−ATPB(BTPk−1B+R)−1BTPk−1AKN−k=(BTPk−1B+R)−1BTPk−1AuN−k∗=−KN−kxN−k
式中,
k
k
k表示从
N
N
N时刻开始往前的步数,
K
K
K表示反馈增益,
P
P
P表示一个对称正定阵,
u
∗
u^*
u∗表示最优控制输入。
在推导的过程当中,我们需要时刻牢记推导的目标是找到最优的控制输入 u u u,使代价函数 J J J最小。这里的推导主要参考了b站DR_CAN的视频中反向迭代求解的方法。求解思路就是从最终时刻往前推,每一个迭代步骤的计算都需要用到上一步算出来的结果。
计算终端N时刻代价
首先讨论
N
N
N到
N
N
N时刻,代价函数可以表示为:
J
N
→
N
=
1
2
x
N
T
S
x
N
+
1
2
∑
k
=
N
N
−
1
(
x
k
T
Q
x
k
+
u
k
T
R
u
k
)
J_{N\rightarrow N} = \frac{1}{2}x_N^T S x_N + \frac{1}{2}\sum\limits_{k=N}^{N-1}\left( x_k^T Q x_k + u_k^T R u_k \right)
JN→N=21xNTSxN+21k=N∑N−1(xkTQxk+ukTRuk)
终端时刻,加号后面的一项为
0
0
0,因为只有终端一个状态,那么其实终端时刻的代价与控制输入无关。这里我们令
S
=
P
0
S = P_0
S=P0,方便后续说明,终端代价为:
J
N
→
N
∗
=
1
2
x
N
T
P
0
x
N
J_{N\rightarrow N}^* = \frac{1}{2}x_N^T P_0 x_N
JN→N∗=21xNTP0xN
计算N-1时刻最优代价
接下来讨论
N
−
1
N-1
N−1到
N
N
N时刻,代价函数为:
J
N
−
1
→
N
=
1
2
x
N
T
P
0
x
N
+
1
2
(
x
N
−
1
T
Q
x
N
−
1
+
u
N
−
1
T
R
u
N
−
1
)
J_{N-1 \rightarrow N} = \frac{1}{2}x_N^T P_0 x_N + \frac{1}{2}\left( x_{N-1}^T Q x_{N-1} + u_{N-1}^T R u_{N-1} \right)
JN−1→N=21xNTP0xN+21(xN−1TQxN−1+uN−1TRuN−1)
根据状态空间方程,其中 x N = A x N − 1 + B u N − 1 x_N = Ax_{N-1} + Bu_{N-1} xN=AxN−1+BuN−1。
为了找到
u
N
−
1
∗
u_{N-1}^*
uN−1∗使
J
N
−
1
→
N
J_{N-1\rightarrow N}
JN−1→N最小,首先求
J
J
J关于
u
u
u的偏导为
0
0
0的极值点,然后求二阶偏导大于0验证该极值点为极小值,即进行这两步:
∂
J
N
−
1
→
N
∂
u
N
−
1
=
0
,
∂
2
J
N
−
1
→
N
∂
u
N
−
1
2
>
0
\frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} = 0, \frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} > 0
∂uN−1∂JN−1→N=0,∂uN−12∂2JN−1→N>0
这里需要用到矩阵求导和链式求导法则,(矩阵求导可以参考这篇博客,矩阵求导的公式为:
∂
A
x
∂
x
=
A
T
,
∂
x
T
P
x
∂
x
=
P
x
\frac{\partial Ax}{\partial x} = A^T, \frac{\partial x^T P x}{\partial x} = Px
∂x∂Ax=AT,∂x∂xTPx=Px
∂
1
2
x
N
T
P
0
X
N
∂
u
N
−
1
=
1
2
∂
x
N
∂
u
N
−
1
∗
∂
x
N
T
P
0
x
N
∂
x
N
=
B
T
P
0
x
N
\frac{\partial \frac{1}{2}x_N^T P_0 X_N}{\partial u_{N-1}} = \frac{1}{2}\frac{\partial x_N}{\partial u_{N-1}} * \frac{\partial x_N^T P_0 x_N}{\partial x_N} = B^T P_0 x_N
∂uN−1∂21xNTP0XN=21∂uN−1∂xN∗∂xN∂xNTP0xN=BTP0xN
求偏导过程为:
∂
1
2
(
x
N
−
1
T
Q
x
N
−
1
+
u
N
−
1
T
R
u
N
−
1
)
∂
u
N
−
1
=
R
u
N
−
1
\frac{\partial \frac{1}{2} \left( x_{N-1}^T Q x_{N-1} + u_{N-1}^T R u_{N-1} \right)}{\partial u_{N-1}} = R u_{N-1}
∂uN−1∂21(xN−1TQxN−1+uN−1TRuN−1)=RuN−1
∂ J N − 1 → N ∂ u N − 1 = B T P 0 ( A x N − 1 + B u N − 1 ) + R u N − 1 = B T P 0 A x N − 1 + ( B T P 0 B + R ) u N − 1 \begin{aligned} \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} &= B^T P_0 \left(Ax_{N-1}+Bu_{N-1}\right) + Ru_{N-1}\\ &= B^T P_0 Ax_{N-1} + (B^T P_0 B + R)u_{N-1} \end{aligned} ∂uN−1∂JN−1→N=BTP0(AxN−1+BuN−1)+RuN−1=BTP0AxN−1+(BTP0B+R)uN−1
令
∂
J
N
−
1
→
N
∂
u
N
−
1
=
0
\frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}} = 0
∂uN−1∂JN−1→N=0,可以找到的极值点。
u
N
−
1
∗
=
−
(
B
T
P
0
B
+
R
)
−
1
B
T
P
0
A
x
N
−
1
u_{N-1}^* = -(B^T P_0 B + R)^{-1}B^T P_0 A x_{N-1}
uN−1∗=−(BTP0B+R)−1BTP0AxN−1
接下来求二阶偏导验证此时的极值点为极小值(求二阶偏导验证>0)。
∂
2
J
N
−
1
→
N
∂
u
N
−
1
2
=
∂
∂
J
N
−
1
→
N
∂
u
N
−
1
∂
u
N
−
1
=
(
B
T
P
0
B
+
R
T
)
\frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} = \frac{\partial \frac{\partial J_{N-1 \rightarrow N}}{\partial u_{N-1}}}{\partial u_{N-1}} = (B^T P_0 B + R^T)
∂uN−12∂2JN−1→N=∂uN−1∂∂uN−1∂JN−1→N=(BTP0B+RT)
其中,二次型
B
T
P
0
B
>
0
B^T P_0 B > 0
BTP0B>0,权重矩阵
R
>
0
R > 0
R>0,因此
∂
2
J
N
−
1
→
N
∂
u
N
−
1
2
>
0
\frac{\partial^2 J_{N-1 \rightarrow N}}{\partial u_{N-1}^2} > 0
∂uN−12∂2JN−1→N>0,上面求的极值点为极小值点。
若令其中的
(
B
T
P
0
B
+
R
)
−
1
B
T
=
K
N
−
1
(B^T P_0 B + R)^{-1}B^T = K_{N-1}
(BTP0B+R)−1BT=KN−1,那么
u
N
−
1
∗
u_{N-1}^*
uN−1∗可以写为:
u
N
−
1
∗
=
−
K
N
−
1
x
N
−
1
u_{N-1}^* = -K_{N-1}x_{N-1}
uN−1∗=−KN−1xN−1
此时的输入量已经是一个状态反馈
u
=
−
K
x
u=-Kx
u=−Kx的形式。接下来把把
u
N
−
1
∗
u_{N-1}^*
uN−1∗代入
J
N
−
1
→
N
J_{N-1 \rightarrow N}
JN−1→N,可得代价函数的最优形式:
J
N
−
1
→
N
∗
=
1
2
x
N
−
1
T
[
(
A
−
B
K
N
−
1
)
T
P
0
(
A
−
B
K
N
−
1
)
+
K
N
−
1
T
R
K
N
−
1
+
Q
]
x
N
−
1
J_{N-1 \rightarrow N}^* = \frac{1}{2}x_{N-1}^T \left[(A-BK_{N-1})^T P_0 (A-BK_{N-1}) + K_{N-1}^T R K_{N-1} + Q\right] x_{N-1}
JN−1→N∗=21xN−1T[(A−BKN−1)TP0(A−BKN−1)+KN−1TRKN−1+Q]xN−1
这个二次型中间的矩阵变量其实都已经通过上面步骤推导得到了,那么可以令
P
1
=
(
A
−
B
K
N
−
1
)
T
P
0
(
A
−
B
K
N
−
1
)
+
K
N
−
1
T
R
K
N
−
1
+
Q
P_{1} = (A-BK_{N-1})^T P_0 (A-BK_{N-1}) + K_{N-1}^T R K_{N-1} + Q
P1=(A−BKN−1)TP0(A−BKN−1)+KN−1TRKN−1+Q。那么
N
−
1
N-1
N−1到
N
N
N时刻的代价函数可以写为:
J
N
−
1
→
N
∗
=
1
2
x
N
−
1
T
P
1
x
N
−
1
J_{N-1 \rightarrow N}^* = \frac{1}{2}x_{N-1}^T P_{1} x_{N-1}
JN−1→N∗=21xN−1TP1xN−1
此时与
N
→
N
N\rightarrow N
N→N时刻的代价函数形式一致:
J
N
→
N
∗
=
1
2
x
N
T
P
0
x
N
J_{N \rightarrow N}^* = \frac{1}{2}x_{N}^T P_{0} x_{N}
JN→N∗=21xNTP0xN
那么由此可以迭代推导,
(
N
−
2
)
→
N
(N-2) \rightarrow N
(N−2)→N时刻的代价函数的最优形式为:
J
N
−
2
→
N
∗
=
1
2
x
N
−
2
T
P
2
x
N
−
2
J_{N-2 \rightarrow N}^* = \frac{1}{2}x_{N-2}^T P_2 x_{N-2}
JN−2→N∗=21xN−2TP2xN−2
归纳递推
那么
(
N
−
k
)
→
N
(N-k) \rightarrow N
(N−k)→N时刻的代价函数最优形式为:
J
N
−
k
→
N
∗
=
1
2
x
N
−
k
T
P
k
x
N
−
k
J_{N-k \rightarrow N}^* = \frac{1}{2}x_{N-k}^T P_{k} x_{N-k}
JN−k→N∗=21xN−kTPkxN−k
其中
P
k
=
(
A
−
B
K
N
−
k
)
T
P
k
−
1
(
A
−
B
K
N
−
k
)
+
K
N
−
k
T
R
K
N
−
k
+
Q
K
N
−
k
=
(
B
T
P
k
−
1
B
+
R
)
−
1
B
T
P
k
−
1
A
\begin{aligned} &P_{k} = (A-BK_{N-k})^T P_{k-1} (A-BK_{N-k}) + K_{N-k}^T R K_{N-k} + Q\\ &K_{N-k} = (B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \end{aligned}
Pk=(A−BKN−k)TPk−1(A−BKN−k)+KN−kTRKN−k+QKN−k=(BTPk−1B+R)−1BTPk−1A
由于
P
P
P和
R
R
R都是对称正定,因此
(
(
B
T
P
k
−
1
B
+
R
)
−
1
)
T
=
(
B
T
P
k
−
1
B
+
R
)
−
1
((B^TP_{k-1}B+R)^{-1})^T = (B^TP_{k-1}B+R)^{-1}
((BTPk−1B+R)−1)T=(BTPk−1B+R)−1。把上面的
K
N
−
k
K_{N-k}
KN−k代入到
P
k
P_k
Pk中可以得到
P
k
P_k
Pk的迭代形式:
P
k
=
Q
+
A
T
P
k
−
1
A
−
A
T
P
k
−
1
B
(
B
T
P
k
−
1
B
+
R
)
−
1
B
T
P
k
−
1
A
P_{k} = Q + A^T P_{k-1} A - A^T P_{k-1} B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\
Pk=Q+ATPk−1A−ATPk−1B(BTPk−1B+R)−1BTPk−1A
至此,LQR公式推导完毕。
应用demo
LQR实现轨迹跟踪的demo可以参考这篇博客。