一、为什么使用MPC控制器?
-
① MPC可以处理多输入耦合控制多输出的问题:
-
② MPC可以处理对于控制量有约束的问题
比如,驾驶汽车的时候,汽车速度和转角都有上限
-
③ MPC具有预测效果
即MPC考虑的不是根据当前参考值进行控制,而是根据预测时间内的参考去预测当前的控制量,比如在小车转弯时,就避免了可能在过弯处急转弯。
MPC需要的算力高一些,因为MPC控制过程中,每个时间步都要求解一个相同形式不同参数的优化问题。
二、什么是MPC控制器?
- 小车的数学模型:
item | inputs | outputs |
---|---|---|
Plant Model(被控对象的数学模型) | 之后m个控制量 | 之后p个时间步的预测输出 |
- 优化器:
item | inputs | outputs |
---|---|---|
优化器 | (数学模型, 之后p个时间步的参考轨迹, 约束条件) | 之后m个控制量 |
优化器要考虑两点:
① 预测轨迹与参考轨迹偏差最小
②控制量不突变
C
o
s
t
F
u
n
c
t
i
o
n
≐
J
=
∑
i
=
1
p
w
e
e
k
+
i
2
+
∑
i
=
0
p
−
1
w
Δ
u
Δ
u
k
+
i
2
Cost Function \doteq J = \sum_{i=1}^{p} w_e e_{k+i}^2 + \sum_{i=0}^{p-1} w_{\Delta u} {\Delta u_{k+i}}^2
CostFunction≐J=i=1∑pweek+i2+i=0∑p−1wΔuΔuk+i2
尽管优化器输出的是之后 p 个时间步的控制量,但是在当前时间步, M P C 仅将这个最有序列的第一步应用到汽车上,忽略其余部分 {\color{Red} 尽管优化器输出的是之后p个时间步的控制量,但是在当前时间步,}\\ {\color{Red} MPC仅将这个最有序列的第一步应用到汽车上,忽略其余部分} 尽管优化器输出的是之后p个时间步的控制量,但是在当前时间步,MPC仅将这个最有序列的第一步应用到汽车上,忽略其余部分
三、MPC控制器的参数如何设置?
-
参数既会影响控制器的性能,又会影响计算复杂度。
-
MPC主要的参数如下:
- ① 采样时间
- ② 预测范围、控制范围
- ③ 约束
- ④ 损失函数的权重
3.1 采样时间
采样时间过大,当干扰发生,控制器无法做出及时的反应。
采样时间过小,会导致过多的计算负载。
可以测量系统的阶跃响应,根据上升时间选择采样时间
3.2 预测范围、控制范围
我们应该选择一个涵盖系统重要动态的预测范围
预测范围过短,无法及时反映,可能会在弯道处急转弯
预测范围过长,之后的不可预测事件可能会白白浪费算力。
我们通常选择 20-30个样本覆盖系统的动态响应,如下图:
通常只有前几个时间步的控制对于预测影响较大(因为前几个要拽向ref轨迹,后面的维持稳定), 因此,选择大的控制范围只会白白增大计算复杂度
经验法则: 控制范围 = 10%~20% × 预测范围
3.3 约束条件
可以对 控制量、控制量变化率、状态量进行约束
约束分为硬约束和软约束,无法违反的(比如最大车速)叫硬约束
软约束可以违反,但我们不希望违反,可以把它设计到损失函数之中
建议将输出约束设置为软约束,并避免对控制量及其变化率设置硬约束,否则可能会出现无解的情况
3.4 权重
损失函数由多个部分组成,需要设置权重
比如最基本的,我们既希望预测轨迹接近参考轨迹,又希望控制量是平滑的。
四、自适应增益调度和非线性MPC
- 线性系统 + 线性约束 + 时不变约束条件 => 可以使用线性时不变MPC控制器 => 凸优化问题
-
但是如果系统是非线性的,就要使用自适应MPC、时间表MPC
-
自适应MPC:具体思路是在非线性模型的各个工作点,建立多套线性模型
自适应MPC的线性模型在不同工作点上结构,超参数相同,只是矩阵参数不同而已
-
- 时间表MPC: 对于不同工作点,需要设置不同数量超参数(控制量数目、预测步长…)的模型
如果是非线性的,那么优化问题就会变成多极值点的非凸优化问题,求解较复杂
五、Simulink仿真MPC控制器
item | value |
---|---|
输出量(状态量) | (横向位置Y、偏航角\phi) |
控制量 | (前轮转角delta) |
假定 V x 恒为 15 m / s , 使用线性化汽车模型 假定V_x恒为15m/s , 使用线性化汽车模型\\ 假定Vx恒为15m/s,使用线性化汽车模型
模型下载地址: https://www.mathworks.com/matlabcentral/fileexchange/68992-designing-an-mpc-controller-with-simulink?s_eid=PSM_15028
(一定要记得路径,matlab界面的路径一定得是模型文件路径。路径不对的话,plant和reference的mask无法显示正确,会显示问号,同时直接运行会报错)
步骤: https://ww2.mathworks.cn/help/releases/R2017b/mpc/examples/autonomous-vehicle-steering-using-model-predictive-control.html
5.1 数学分析
下面依次介绍各个模块:
-
① Plant: 车辆线性模型
右键Plant模块,选择Block Parameters:
变量 | 含义 |
---|---|
V x V_x Vx | 小车平行于车身向前的速度 |
m m m | 小车总质量 |
I z I_z Iz | Yaw夹角转动惯量(绕小车中心旋转的转动惯量) |
l f l_f lf | 小车质心到前轮的距离 |
l r l_r lr | 小车质心到前轮的距离 |
C α C_{\alpha} Cα | 汽车转角刚度((轮胎侧偏角的单位增量所对应的横向力的增量) (N/rad) |
ψ \psi ψ | Yaw角 |
小车是自行车模型 ( b i c y c l e m o d e l w i t h t w o d e g r e e s o f f r e e d o m ) , 且 V x 恒为 15 m / s : {\color{Red} 小车是自行车模型(bicycle \quad model\quad with \quad two\quad degrees\quad of \quad freedom), 且V_x恒为15m/s:} 小车是自行车模型(bicyclemodelwithtwodegreesoffreedom),且Vx恒为15m/s:
- reference: 小车的自行车模型
-
原理(1): 前轮运动 = 前轮相对于车身运动 + 车身相对于质心运动(旋转) + 小车质心相对于地面运动
-
原理(2): Δ 轮胎受到垂直于车身的力 = C r ( 或者 C l ) Δ 轮胎转角 \Delta 轮胎受到垂直于车身的力 = C_{r}(或者C_{l} ) \Delta 轮胎转角 Δ轮胎受到垂直于车身的力=Cr(或者Cl)Δ轮胎转角
(注意: 自行车模型代替小车模型时,四轮变为两轮,因此 自行车的 C f 应该是小车的 2 C f 自行车的C_f应该是 小车的2C_f 自行车的Cf应该是小车的2Cf)
进行动力学分析:
由于
ψ
较小,简化为线性模型即
:
Y
˙
=
V
x
ψ
+
V
y
[
公式一
]
由于\psi较小,简化为线性模型即: \dot{Y} = V_x \psi + V_y \quad [公式一]\\
由于ψ较小,简化为线性模型即:Y˙=Vxψ+Vy[公式一]
Δ
前轮相对于车身转角
=
(
V
y
+
ψ
˙
l
f
V
x
)
Δ
后轮相对于车身转角
=
(
−
V
y
−
ψ
˙
l
r
V
x
)
⇒
前轮受到垂直于车身的力
=
2
C
f
(
−
ψ
+
δ
+
Δ
前轮相对于车身转角
)
后轮受到垂直于车身的力
=
2
C
r
(
−
ψ
+
Δ
后轮相对于车身转角
)
⇒
根据
[
公式一
]
:
m
y
¨
=
−
m
V
x
ψ
˙
−
m
V
y
˙
m
V
y
˙
=
前轮受到垂直于车身的力
+
后轮受到垂直于车身的力
⇒
m
y
¨
=
−
m
V
x
ψ
˙
+
2
C
f
[
−
ψ
+
δ
−
V
y
+
ψ
˙
l
f
V
x
]
+
2
C
r
(
−
ψ
−
V
y
−
ψ
˙
l
r
V
x
)
将
[
公式一
]
代入到上式
:
y
¨
=
−
2
C
f
+
2
C
r
m
V
x
y
˙
−
(
V
x
+
2
C
f
l
f
−
2
C
r
l
r
m
V
x
)
ψ
˙
+
2
C
α
δ
m
[
公式二
]
\Delta 前轮相对于车身转角 = (\frac{V_y + \dot{\psi}l_f}{V_x}) \\ \Delta 后轮相对于车身转角 = (- \frac{V_y - \dot{\psi}l_r}{V_x}) \\ \Rightarrow \\ 前轮受到垂直于车身的力 = 2C_{f} (-\psi + \delta + \Delta 前轮相对于车身转角) \\ 后轮受到垂直于车身的力 = 2C_{r} (-\psi + \Delta 后轮相对于车身转角)\\ \Rightarrow \\ 根据[公式一]: \\ m \ddot{y} = -mV_x \dot{\psi} - m\dot{V_y}\\ m\dot{V_y}=前轮受到垂直于车身的力 + 后轮受到垂直于车身的力 \\ \Rightarrow m\ddot{y} = - m V_x \dot{\psi} + 2C_f[-\psi +\delta - \frac{V_y + \dot{\psi}l_f}{V_x}] +2 C_r (-\psi - \frac{V_y - \dot{\psi}l_r}{V_x}) \\ 将 [公式一]代入到上式: \\ {\color{Red}\ddot{y} = -\frac{2C_f+2C_r}{mV_x}\dot{y} -(V_x+\frac{2C_fl_f-2C_rl_r}{mV_x}) \dot{\psi} + \frac{2C_{\alpha} \delta}{m} \quad [公式二] }
Δ前轮相对于车身转角=(VxVy+ψ˙lf)Δ后轮相对于车身转角=(−VxVy−ψ˙lr)⇒前轮受到垂直于车身的力=2Cf(−ψ+δ+Δ前轮相对于车身转角)后轮受到垂直于车身的力=2Cr(−ψ+Δ后轮相对于车身转角)⇒根据[公式一]:my¨=−mVxψ˙−mVy˙mVy˙=前轮受到垂直于车身的力+后轮受到垂直于车身的力⇒my¨=−mVxψ˙+2Cf[−ψ+δ−VxVy+ψ˙lf]+2Cr(−ψ−VxVy−ψ˙lr)将[公式一]代入到上式:y¨=−mVx2Cf+2Cry˙−(Vx+mVx2Cflf−2Crlr)ψ˙+m2Cαδ[公式二]
求得小车模型的状态空间表达式为
:
d
d
t
[
y
˙
ψ
ψ
˙
]
=
[
−
2
C
f
+
2
C
r
m
V
x
0
−
(
V
x
+
2
C
f
l
f
−
2
C
r
l
r
m
V
x
)
0
0
1
−
2
l
f
C
f
−
2
l
r
C
r
I
z
V
x
0
−
2
l
f
2
C
f
+
2
l
r
2
C
r
I
z
V
x
]
[
y
˙
ψ
ψ
˙
]
+
[
2
C
f
m
0
2
l
f
C
f
I
z
]
δ
求得小车模型的状态空间表达式为: \qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \\ \frac{d}{dt} \begin{bmatrix} \dot{y} \\ \psi \\ \dot{\psi} \end{bmatrix} =\begin{bmatrix} -\frac{2C_f+2C_r}{mV_x} & 0 & -(V_x+\frac{2C_fl_f-2C_rl_r}{mV_x}) \\ 0 & 0 & 1\\ -\frac{2l_fC_f-2l_rC_r}{I_z V_x} & 0 & - \frac{2l_f^2C_f+2l_r^2C_r}{I_zV_x} \end{bmatrix} \begin{bmatrix} \dot{y} \\ \psi \\ \dot{\psi} \end{bmatrix} + \begin{bmatrix} 2 \frac{C_f}{m}\\ 0 \\ \frac{2l_fC_f}{I_z} \end{bmatrix} \delta
求得小车模型的状态空间表达式为:dtd
y˙ψψ˙
=
−mVx2Cf+2Cr0−IzVx2lfCf−2lrCr000−(Vx+mVx2Cflf−2Crlr)1−IzVx2lf2Cf+2lr2Cr
y˙ψψ˙
+
2mCf0Iz2lfCf
δ
正好就是Parameters中的A,B,C,D矩阵
5.2 实验过程
导入矩阵和参考轨迹参数,双击Params.mat即可:
需要更换参考轨迹的话,参考以下方法生成新的posRef和yawRef
打开APP->Driving Scenario designer->选择道路和参考轨迹
开始仿真:文章来源:https://www.toymoban.com/news/detail-824633.html
文章来源地址https://www.toymoban.com/news/detail-824633.html
到了这里,关于MPC(模型预测控制)-Simulink仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!