目录
绪
- 本笔记根据b站【DR_CAN】的最优控制教程整理,主要是梳理公式推导过程(不包含详细的计算),主要是作为后续工程应用的理论参考,特别是一些结论性的东西。
- 希望能对其他正在学习最优控制的朋友有帮助,如有错误也请帮忙指出,万分感谢。
- 附bilibili视频链接:【最优控制-合集】 (不得不说,can老师真是全天下最好的控制老师!)
1.最优控制的基本概念
1.1 系统描述
- 任意系统的状态-空间方程:
- 状态变量: x ( t ) = [ x 1 ( t ) , x 2 ( t ) , . . . , x n ( t ) ] T x(t) =[ x_1(t) ,x_2(t) ,...,x_n(t) ]^T x(t)=[x1(t),x2(t),...,xn(t)]T(即一个n维的列向量)
- 系统输入: u ( t ) = [ u 1 ( t ) , u 2 ( t ) , . . . , u m ( t ) ] T u(t) =[ u_1(t),u_2(t),...,u_m(t) ]^T u(t)=[u1(t),u2(t),...,um(t)]T(即一个m维的列向量)
- 例如对于一个七轴机械臂而言:
- x x x可以是包含末端位置与线速度的向量,即 n = 6 n=6 n=6
- u u u则可以为七个关节驱动器的控制量,可以为角度、扭矩等,均有 m = 7 m=7 m=7
- 此时系统状态空间可表示为: x ( t ) ⃗ ˙ = f ( x ( t ) ⃗ , u ( t ) ⃗ ) \dot{\vec{x(t)}}=f(\vec{x(t)},\vec{u(t)}) x(t)˙=f(x(t),u(t))
- 为了方便求解,可选取一个采样时间,将上述方程离散化,即
- x ⃗ ˙ ( k + 1 ) = f d ( x ⃗ ( k ) , u ⃗ ( k ) ) \large\color{black}\dot{\vec{x}}(k+1)=f_d(\vec{x}(k),\vec{u}(k)) x˙(k+1)=fd(x(k),u(k))
1.2 控制的性能指标
- 对任意控制,均存在一系列的期望目标与约束,我们希望的好的控制,应该是在设定的时间内使系统状态趋近于期望目标,同时在期间满足系统约束。
- 为了描述这种好的控制,我们引入一个性能指标方程,也可称为代价函数,而我们的控制目标就是最小化控制代价。
- 性能指标的一般形式为 J = ∫ 0 N ϕ ( x , x d , u ) J=\int_0^N \phi(x,xd,u) J=∫0Nϕ(x,xd,u)
- 最小化J后所得的输入u,即为最优控制策略
- 表示为: u ∗ = [ u ( 0 ) , u ( 1 ) , u ( 2 ) , . . . , u ( N − 1 ) ] u^*=[u(0),u(1),u(2),...,u(N-1)] u∗=[u(0),u(1),u(2),...,u(N−1)]
- 也可写为: u ∗ = a r g m i n J u^*=argmin J u∗=argminJ
- 对于不同的控制场景,J的具体形式也会不同,下面举几个例子
- 场景1:在N时刻将小车停在p点,类似这样的定时达点问题,性能指标可写为:
-
J
1
=
(
x
(
N
)
−
x
d
)
T
Q
(
x
(
N
)
−
x
d
)
J_1=(x(N)-x_d)^TQ(x(N)-x_d)
J1=(x(N)−xd)TQ(x(N)−xd)
- Q一般为正对角矩阵,即 Q = d i a g ( s 1 , s 2 , . . . , s n ) Q=diag(s_1,s_2,...,s_n) Q=diag(s1,s2,...,sn)
- 需要注意s必须提前标准化以排除各状态单位不同的影响
-
J
1
=
(
x
(
N
)
−
x
d
)
T
Q
(
x
(
N
)
−
x
d
)
J_1=(x(N)-x_d)^TQ(x(N)-x_d)
J1=(x(N)−xd)TQ(x(N)−xd)
- 场景1:在N时刻将小车停在p点,类似这样的定时达点问题,性能指标可写为:
- 场景2:在1的基础上,考虑能耗最小,那么性能可写为:
-
J
2
=
(
x
(
N
)
−
x
d
)
T
Q
(
x
(
N
)
−
x
d
)
+
∑
k
=
1
n
−
1
u
k
T
R
u
k
J_2=(x(N)-x_d)^TQ(x(N)-x_d)+\sum_{k=1}^{n-1} u_k^TRu_k
J2=(x(N)−xd)TQ(x(N)−xd)+∑k=1n−1ukTRuk
- R与Q的特点与作用一致,用来调整可控制量的权重
-
J
2
=
(
x
(
N
)
−
x
d
)
T
Q
(
x
(
N
)
−
x
d
)
+
∑
k
=
1
n
−
1
u
k
T
R
u
k
J_2=(x(N)-x_d)^TQ(x(N)-x_d)+\sum_{k=1}^{n-1} u_k^TRu_k
J2=(x(N)−xd)TQ(x(N)−xd)+∑k=1n−1ukTRuk
- 场景3:在2的基础上,加上轨迹跟踪要求,则有:
-
J
3
=
∥
x
N
−
x
d
∥
S
2
+
∑
k
=
1
n
−
1
∥
x
k
−
x
d
k
∥
Q
2
+
∥
u
k
∥
R
2
J_3=\begin{Vmatrix} x_N-x_d \end{Vmatrix}_S^2+\sum_{k=1}^{n-1} \begin{Vmatrix} x_k-x_{d_k} \end{Vmatrix}_Q^2+\begin{Vmatrix} u_k \end{Vmatrix}_R^2
J3=
xN−xd
S2+∑k=1n−1
xk−xdk
Q2+
uk
R2
- S、Q、R表示三个二次范数的对角权重矩阵
-
J
3
=
∥
x
N
−
x
d
∥
S
2
+
∑
k
=
1
n
−
1
∥
x
k
−
x
d
k
∥
Q
2
+
∥
u
k
∥
R
2
J_3=\begin{Vmatrix} x_N-x_d \end{Vmatrix}_S^2+\sum_{k=1}^{n-1} \begin{Vmatrix} x_k-x_{d_k} \end{Vmatrix}_Q^2+\begin{Vmatrix} u_k \end{Vmatrix}_R^2
J3=
xN−xd
S2+∑k=1n−1
xk−xdk
Q2+
uk
R2
- 场景4:在3的基础上,加上循迹时的避障要求,则有:
- J 4 = J 3 J_4=J_3 J4=J3
- 但同时有 [ x 1 ( k ) , x 2 ( k ) ] ∈ [ x 1 ∗ , x 2 ∗ ] [x_1(k),x_2(k)]\in [x_1^*,x_2^*] [x1(k),x2(k)]∈[x1∗,x2∗],即轨迹需在容许轨迹范围内。
1.3 最优控制的通用描述
- 对于系统: x ⃗ ˙ ( k + 1 ) = f d ( x ⃗ ( k ) , u ⃗ ( k ) , k ) \dot{\vec{x}}(k+1)=f_d(\vec{x}(k),\vec{u}(k),k) x˙(k+1)=fd(x(k),u(k),k)
- 控制目标:
- 找到最优控制策略 u ∗ ∈ Ω u^*\in\Omega u∗∈Ω,使得 x ⃗ ∈ X ∗ \vec{x}\in X^* x∈X∗从 x ⃗ ( 0 ) \vec{x}(0) x(0)转移到 x ⃗ d \vec{x}_d xd
- 并满足 m i n J = h d ( x ⃗ ( N ) , N ) + ∑ k = 1 N − 1 g d ( x ⃗ ( k ) , u ( k ) , k \color{black}min J=h_d(\vec{x}(N),N)+\sum_{k=1}^{N-1}g_d(\vec{x}(k),u(k),k minJ=hd(x(N),N)+∑k=1N−1gd(x(k),u(k),k
2.动态规划的基本概念
2.1 最优化理论
-
贝尔曼最优化理论,由Richard·Bellman提出,大意为:
-
最优化策略拥有一个特性,即无论初始状态与策略为何,接下来的控制“基于过去决策所带来的结果”所得的最优策略。即最优控制应该是一种面向未来的动态规划。
The best time to plant a tree is 20 years ago.The second-best time is
now. 即如果过去选择了“不种树策略”导致了现在没有树的结果,那么此时最优的策略就是尽早把这棵树种好。
-
-
根据其核心思想,也就是说考虑当下的最小代价时,只需要基于上一时刻到这一时刻的最小即可,至于之前所积累的代价,当下并不考虑;如果每一时刻都是如此,即可保证每一时刻代价最小,进而达成全局最优。
- 那么当我们想要求全局代价,只需要根据这一思想列出递推方程,即可求解,即:
J(N)=J(N-1)+minJ(N)
- 那么当我们想要求全局代价,只需要根据这一思想列出递推方程,即可求解,即:
2.2 动态规划(Dynamic Programming)
- 将动态规划问题离散化之后,就是一个逆向分级去求动态最小cost的问题。
- 利用二维数组+递归即可解决,即考虑每个状态最小的CostToGo(详细推导见Dr_Can视频)
3.最优控制之LQR
- 设系统的代价函数为:
- J = 1 2 x ( N ) T S x ( N ) + 1 2 ∑ k = 1 n − 1 x ( k ) T Q x ( k ) + u ( k ) T R u ( k ) J=\frac{1}{2}x(N)^TSx(N)+\frac{1}{2}\sum_{k=1}^{n-1} x(k)^TQx(k)+u(k)^TRu(k) J=21x(N)TSx(N)+21∑k=1n−1x(k)TQx(k)+u(k)TRu(k)
- 注意:这是一个regulator,要求 x d = 0 \color{orange}x_d=0 xd=0,也可将其视为误差为零(增广变换之后)。
- 接下来,逆向递推
- k=n: J N ∗ = 1 2 x N T S x N J^*_N=\frac{1}{2}x_N^TSx_N JN∗=21xNTSxN
- k=n-1: J N − 1 ∗ = J N ∗ + 1 2 x N − 1 T Q x N − 1 + u N − 1 T R u N − 1 J^*_{N-1}=J^*_N+\frac{1}{2}x_{N-1}^TQx_{N-1}+u_{N-1}^TRu_{N-1} JN−1∗=JN∗+21xN−1TQxN−1+uN−1TRuN−1
- 可以发现,此时任意的J均只于当前的输入u有关,因此对其求偏导并使偏导为0,即可求出此时的最优控制策略,即
u N − k ∗ ∣ ∂ J N − k ∗ ∂ u N − k = 0 u^*_{N-k}\bigg| {\frac{\partial J_{N-k}^*}{\partial u_{N-k}}=0} uN−k∗ ∂uN−k∂JN−k∗=0 - 推理可得:
- J N − k ∗ = 1 2 x N − k T P k x N − k J_{N-k}^*=\frac{1}{2}x_{N-k}^TP_kx_{N-k} JN−k∗=21xN−kTPkxN−k
- P k = [ A − B F N − k ] T P k − 1 ( A − B F N − k ) + F N − k T R F N − k + Q P_k=[A-BF_{N-k}]^TP_{k-1}(A-BF_{N-k})+F^T_{N-k}RF_{N-k}+Q Pk=[A−BFN−k]TPk−1(A−BFN−k)+FN−kTRFN−k+Q
- F N − k = [ B T P k − 1 B + R ] − 1 B T P k − 1 A F_{N-k}=[B^TP_{k-1}B+R]^{-1}B^TP_{k-1}A FN−k=[BTPk−1B+R]−1BTPk−1A
- u N − k ∗ = − F N − k x N − k u^*_{N-k}=-F_{N-k} x_{N-k} uN−k∗=−FN−kxN−k
- 控制思路:
- 利用递推关系,离线计算并存储 u ∗ = [ u N ∗ , u N ∗ − k , . . . , u 1 ∗ ] u^*=[u^*_N,u^*_N-k,...,u^*_1] u∗=[uN∗,uN∗−k,...,u1∗]
- 在线控制时按时间执行相应的 u k ∗ , k ∈ [ 1 , N ] u^*_k,k\in[1,N] uk∗,k∈[1,N]
4.轨迹跟踪控制
- 轨迹跟踪控制器大致框架(Tracking Controller)
4.1 目标误差控制
- 在轨迹追踪中,我们需要将调节目标转换为调节系统误差至0,具体方法是将目标状态列入原系统-空间方程,将其改写为增广后的形式。
- 具体过程如下:
- 原系统: x k + 1 = A x k + B u k x_{k+1}=Ax_k+Bu_k xk+1=Axk+Buk
- 设: x d k + 1 = A D x d k , A D = I x_{d_{k+1}}=A_Dx_{d_k},A_D=I xdk+1=ADxdk,AD=I
- 定义: e k = x k − x d k e_k=x_k-x_{d_k} ek=xk−xdk
- 令 x a k + 1 = [ x k + 1 , x d k + 1 ] T x_{a_{k+1}}=[x_{k+1},x_{d_{k+1}}]^T xak+1=[xk+1,xdk+1]T
- 则有 x a k + 1 = [ A 0 0 A D ] [ x k x d k ] + [ B 0 ] u k x_{a_{k+1}}=\begin{bmatrix} A & 0 \\ 0 & A_D \end{bmatrix}\begin{bmatrix} x_k\\ x_{d_k} \end{bmatrix}+\begin{bmatrix} B\\ 0 \end{bmatrix}u_k xak+1=[A00AD][xkxdk]+[B0]uk
- 由此,我们可以将原状态空间方程写为:
- x a k + 1 = A a x a k + B a u k \large x_{a_{k+1}}=A_ax_{a_k}+B_au_k xak+1=Aaxak+Bauk
- 此时 e k = x k − x d k = [ I − I ] x a k = C a x a k e_k=x_k-x_{d_k}=[I -I]x_{a_k}=C_ax_{a_k} ek=xk−xdk=[I−I]xak=Caxak
- 据此,我们将代价函数定义为: J = 1 2 e ( N ) T S e ( N ) + 1 2 ∑ k = 0 N − 1 e ( k ) T Q e ( k ) + u ( k ) T R u ( k ) = 1 2 x a ( N ) T C a T Q C a x a ( N ) + 1 2 ∑ k = 0 N − 1 x a ( k ) T C a T Q C a x a ( k ) + u ( k ) T R u ( k ) = 1 2 x a ( N ) T S a x a ( N ) + 1 2 ∑ k = 0 N − 1 x a ( k ) T Q a x a ( k ) + u ( k ) T R u ( k ) \begin{equation}\begin{split} J &=\frac{1}{2}e(N)^TSe(N)+\frac{1}{2}\sum_{k=0}^{N-1} e(k)^TQe(k)+u(k)^TRu(k)\\ &=\frac{1}{2}x_a(N)^TC_a^TQC_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1} x_a(k)^TC_a^TQC_ax_a(k)+u(k)^TRu(k)\\ &=\color{red}\frac{1}{2}x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{N-1} x_a(k)^TQ_ax_a(k)+u(k)^TRu(k) \end{split}\nonumber\end{equation} J=21e(N)TSe(N)+21k=0∑N−1e(k)TQe(k)+u(k)TRu(k)=21xa(N)TCaTQCaxa(N)+21k=0∑N−1xa(k)TCaTQCaxa(k)+u(k)TRu(k)=21xa(N)TSaxa(N)+21k=0∑N−1xa(k)TQaxa(k)+u(k)TRu(k)
4.1.0 应用局限性
基于上述代价函数,我们可将其应用至弹簧-阻尼-质量系统,并将目标终点设置为某个x值。但是会出现一个问题
- 我们会发现无论如何设置R的权重,即输入量的大小约束,目标最终都很难收敛至 x d x_d xd
- 这是因为对于这个系统,要想系统最终稳定在非零位,就必须要施加一个恒力,也就是代价无法缩小至零。
- 在这个优化过程中,如果R过大,系统便出现了“躺平”的现象,我们需要引入其它的方法来改进这一缺陷。
4.2 稳态目标控制
- 对于一些系统而言,系统存在稳态,即当输入为 u d u_d ud时,输出为 x d x_d xd,即 x d [ k ] = x d x_d[k]=x_d xd[k]=xd
- 此时系统表现为:
x
d
=
A
x
d
+
B
u
d
x_d=Ax_d+Bu_d
xd=Axd+Bud
- 可得: u d = B − 1 ( I − A ) x d u_d=B^{-1}(I-A)x_d ud=B−1(I−A)xd,需要注意: B − 1 B^{-1} B−1不一定存在(B不为方阵时),求解要注意方法
- 接下来,定义系统稳态输入误差为
- δ u k = u k − u d \delta u_k=u_k-u_d δuk=uk−ud 即 u k = δ u k + u d u_k=\delta u_k+u_d uk=δuk+ud
- 联立系统状态空间方程即稳态时输入与输出的关系,可得
- x k + 1 = A x k + B δ u k + ( I − A ) x d x_{k+1}=Ax_k+B\delta u_k+(I-A)x_d xk+1=Axk+Bδuk+(I−A)xd
- 参照4.1,我们可将目标输出列入状态矩阵,将状态-空间方程进行改写
- x a k + 1 = [ x k + 1 x d ] = [ A I − A 0 I ] [ x k x d ] + [ B 0 ] δ u k x_{a_{k+1}}= \begin{bmatrix} x_{k+1}\\ x_d \end{bmatrix}= \begin{bmatrix} A & I-A \\ 0 & I \end{bmatrix} \begin{bmatrix} x_k\\ x_{d} \end{bmatrix} +\begin{bmatrix} B\\ 0 \end{bmatrix} \delta u_k xak+1=[xk+1xd]=[A0I−AI][xkxd]+[B0]δuk
- 即 $ x a k + 1 = A a x a k + B a δ u k \color{black}\large x_{a_{k+1}}=A_ax_{a_k}+B_a\delta u_k xak+1=Aaxak+Baδuk
- 由此,便可得到新系统的代价函数:
J = 1 2 x a ( N ) T S a x a ( N ) + 1 2 ∑ k = 0 n − 1 x a ( k ) T Q a x a ( k ) + δ u ( k ) T R δ u ( k ) J=\frac{1}{2}x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{n-1} x_a(k)^TQ_ax_a(k)+\delta u(k)^TR\delta u(k) J=21xa(N)TSaxa(N)+21k=0∑n−1xa(k)TQaxa(k)+δu(k)TRδu(k)- 最后一项关于输入的代价,反映了当前输入相较于稳态输入的偏离程度
4.3 增量输入控制
- 在4.1中,我们将目标定义为: x d k + 1 = A D x d k x_{d_{k+1}}=A_Dx_{d_k} xdk+1=ADxdk,其中 A D = I A_D=I AD=I为常数项
- 如果在控制序列中, x d x_d xd在发生变化,则变成了轨迹跟踪问题,此时 A D A_D AD不为常数
- 为了处理这样的非稳态控制系统,我们需要对输入进行增量控制。
- 定义输入的增量为:
- Δ u k = u k − u k − 1 \Delta u_k=u_k-u_{k-1} Δuk=uk−uk−1$
- u k = Δ u k + u k − 1 u_k=\Delta u_k+u_{k-1} uk=Δuk+uk−1
- 由此,系统状态-空间方程可写为: x k + 1 = A x k + B Δ u k + B u k − 1 x_{k+1}=Ax_k+B\Delta u_k+Bu_{k-1} xk+1=Axk+BΔuk+Buk−1
- 设增广向量
x
a
k
=
[
x
k
,
x
d
k
,
u
k
−
1
]
T
x_{a_k}=[x_{k},x_{d_{k}},u_{k-1}]^T
xak=[xk,xdk,uk−1]T,那么可写出增广形式的状态空间方程如下
x a k + 1 = [ x k + 1 x d k + 1 u k ] = [ A 0 B 0 A D 0 0 0 I ] [ x k x d k u k − 1 ] + [ B 0 I ] Δ u k = A a x a k + B a Δ u k \begin{equation}\begin{split}x_{a_{k+1}}&= \begin{bmatrix} x_{k+1}\\x_{d_{k+1}}\\u_k \end{bmatrix}= \begin{bmatrix} A & 0 &B\\ 0 & A_D & 0\\ 0 & 0 & I \end{bmatrix} \begin{bmatrix} x_k\\x_{d_k}\\u_{k-1} \end{bmatrix}+ \begin{bmatrix} B\\0 \\I \end{bmatrix} \Delta u_k\\\\ & = A_ax_{a_k}+B_a\Delta u_k \end{split}\nonumber\end{equation} xak+1= xk+1xdk+1uk = A000AD0B0I xkxdkuk−1 + B0I Δuk=Aaxak+BaΔuk - 同理4.1与4.2,可将代价函数定义为:
J = 1 2 x a ( N ) T S a x a ( N ) + 1 2 ∑ k = 0 n − 1 x a ( k ) T Q a x a ( k ) + Δ u ( k ) T R Δ u ( k ) J=\frac{1}{2}x_a(N)^TS_ax_a(N)+\frac{1}{2}\sum_{k=0}^{n-1} x_a(k)^TQ_ax_a(k)+\Delta u(k)^TR\Delta u(k) J=21xa(N)TSaxa(N)+21k=0∑n−1xa(k)TQaxa(k)+Δu(k)TRΔu(k)- 通过调节R的值,便可让输入按期望的平滑度进行控制
4.3.1 实例与结论
- 按照上述方法,如果我们想让弹簧-阻尼-质量系统中的滑块匀速运动,则有
- x ˙ 1 = x 2 d \dot x_1=x_{2_d} x˙1=x2d, x 1 x_1 x1表示位移, x 2 x_2 x2表示速度
- x ˙ 2 d = 0 \dot{x}_{2_d}=0 x˙2d=0,即加速度为0
- 将系统离散化,即选取一个采样时间间隔
T
s
T_s
Ts后,可得
x d k + 1 = [ 1 T s 0 1 ] x d k = A D x d k x_{d_{k+1}}=\begin{bmatrix}1&T_s\\0&1\end{bmatrix}x_{d_k}=A_Dx_{d_k} xdk+1=[10Ts1]xdk=ADxdk- 之后,设计 x 2 d x_{2_d} x2d关于时间的函数 X 2 d ( k ) X_{2_d}(k) X2d(k),应用LQR控制,即可实现轨迹跟踪控制
- 其它结论
- 如果轨迹为非线性函数,则需要先对其做线性化处理。
- 轨迹跟踪的本质,就是通过矩阵变换将Tracking问题转为Regulation问题,再应用诸如LQR的调节方法,即可完成轨迹跟踪控制。