为什么使用MPC控制器

我在这篇文章PID控制器,它简单易于实现,那么为什么还需要MPC控制器?

在真实控制中,驱动命令不会立即执行,命令在系统中传播时会有延迟。实际延迟可能在100毫秒的量级。

这个延迟问题,对于某些控制器(如PID控制器)来说,这是一个难以克服的挑战。但是MPC模型预测控制器可以很好地适应,因为我们可以在系统中模拟这种延迟。

PID控制器将相对于当前状态计算误差,但是当车辆处于未来(并且可能是不同的)状态时将执行致动。这有时会导致不稳定。

PID控制器可以尝试基于未来的误差计算控制输入,但是没有车辆模型,这不太可能是准确的。

模型预测控制可以把延迟通过简单的动态系统轻松建模并结合到车辆模型中。一种方法是在延迟持续时间内从当前状态开始使用车辆模型运行模拟。模拟得到的状态是MPC的新初始状态。

因此,与PID控制器相比,MPC可以通过明确地考虑它来更有效地处理延迟。

接下来我们将了解MPC的实施情况!

车辆模型

我们可以使用如下向量描述一个车辆的状态:
[x,y,\psi,v]
x,y是车辆的位置,\phi是车辆行驶方向,v是车辆的速度.

车辆还有控制变量,不同的控制变量将导致未来车辆的状态不同,我们用如下向量描述车辆的控制状态:
[\delta,a]
\delta为车辆的转向角,表示未来行驶方向的改变程度,a为加速度.

所以车辆的状态与控制变量之间有如下关系:
\large x_{t+1} = x_t + v_t cos(\psi_t) * dt

\large y_{t+1} = y_t + v_t sin(\psi_t) * dt

\large \psi_{t+1} = \psi_t + \frac {v_t} { L_f} \delta * dt

\large v_{t+1} = v_t + a_t * dt

其中L_f为车辆重心到前轴的距离.

MPC控制器

首先我们确定一个时间dt与一个步数N,每隔dt时间重新刷新一下车辆状态,总共需要处理N次.

实际上MPC使用N个点去拟合规划线路,当然当N越多,dt越小的时候拟合的越好.

每一个点都有控制输入,所以N个点的控制输入为:

[\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}]

我们要做的就是调整这些控制输入,让这N个点拟合的曲线与规划线路的误差最小.

没错,MPC控制器是一个最优化问题.通过最优化求出将来的状态,这也是为什么MPC能够预测未来状态的原因.

损失方程

第一个误差是与预期线路的距离:

cte_{t+1} = cte_t + v_t* sin(e\psi_t) * dt

cte_t = y_t - f(x_t) cte

cte_{t+1} = y_t - f(x_t) + (v_t * sin(e\psi_t) * dt)

第二个是方向误差

e\psi_{t+1} = e\psi_t + \frac{v_t} { L_f} * \delta_t * dt

e\psi_t = \psi_t - \psi{des}_t

e\psi_{t+1} = \psi_t - \psi{des}_t + (\frac{v_t} { L_f} * \delta_t * dt)

损失函数为所有点的误差之和:

J(\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}) = \sum_{i=1}^N cte^2 + e\psi^2

另外,车辆的转向角有大小限制,我们不希望车辆在原地转圈,而且我们也对加速度大小进行限制,慢慢加速减速:

J(\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}) = \sum_{i=1}^N cte_i^2 + e\psi_i^2 + \delta_i^2 + a_{i}^2

还需要对转角的变化,与加速度的变化进行限制,我们不希望急转弯、突然加速和急停:
J(\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}) = \sum_{i=1}^N cte_i^2 + e\psi_i^2 + \delta_i^2 + a_{i}^2 + (\delta_{i+1} - \delta_{i})^2 + (a_{i+1} - a_{i})^2

另外,我们希望车辆速度保持在v_{ref},这也可以添加到代价函数中:
J(\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}) = \sum_{i=1}^N cte_i^2 + e\psi_i^2 + \delta_i^2 + a_{i}^2 + (\delta_{i+1} - \delta_{i})^2 + (a_{i+1} - a_{i})^2 + (v_i - v_{ref})^2

最优化代价函数

我们通过最优化代价函数就可以求得[\delta_1, a_1, \delta_2, a_2 , ..., \delta_{N-1}, a_{N-1}].

这个优化过程非常复杂,幸运的是,我们可以借助现有的非线性优化的软件库Ipopt来完成优化过程.

MPC会得到未来几个时刻的控制状态,我们可以提前一个时刻来进行控制,进而抵消机械延迟,这也是MPC相比PID控制的优势.

posted @ 2018-08-23 21:40:35
评论加载中...

发表评论