自动驾驶 MPC 深度指南
你是否正在寻找一份面向自动驾驶车辆的模型预测控制(MPC)深度教程?那么你来对地方了。
1、什么是MPC?
模型预测控制(MPC)是自主导航控制算法的行业标准。本质上,MPC帮助车辆通过持续生成一系列控制动作来预测和规划未来事件,从而使车辆更接近其期望轨迹。工程师通常将MPC用于纵向(速度)和横向(转向)控制。
这只是MPC全部故事的一部分。在深入探讨MPC概念之前,我们先来讨论为什么MPC是控制AV的最先进方法。
2、为什么选择MPC?
与PID、Pure Pursuit或Stanley控制器等其他反应式控制器不同,MPC是一种预测控制方法,它预测车辆的未来状态并据此规划其控制动作。
MPC算法能够处理非线性和复杂的车辆动力学(如轮胎力模型)和执行器模型,从而实现精确的轨迹跟踪。
MPC的另一个强大功能是它可以引入多个约束。想要限制冲击以提高舒适性?想要防止执行器饱和?想要设置最大速度?MPC可以通过在控制器中引入约束来实现所有这些。
你甚至可以在MPC优化中纳入燃油效率或能耗,从而相比其他控制器提高效率。
但是车辆模型中的不确定性怎么办?如果我的车辆模型不能很好地解释车辆动力学呢?
不必担心。你可以将车辆动力学和环境中的不确定性纳入控制策略,确保在不断变化的条件下实现鲁棒和可靠的性能。
3、MPC的劣势
我们列举了MPC的诸多优点。那么它的缺点呢?如果我们想利用它,就必须认识到它的弱点。
是的,使用MPC确实有一些缺点。其中最显著的缺点是计算复杂度。MPC需要大量计算来生成最优控制动作。在嵌入式系统中进行实时实现可能更具挑战性。
MPC依赖于被控系统的准确模型。当你对底层系统不够了解或系统难以建模时,这会很困难。
实现MPC是一项艰巨的工作,但当安全成为首要要求时,它对自动驾驶车辆来说是值得的。如果你想为你的移动机器人找一个控制算法,MPC通常是大材小用了。
至此,我们已经了解了MPC的两面性。在设计你的MPC时,你应该牢记这些,特别是其高计算消耗。我将在后面详细解释。
4、MPC概念
MPC的定义:
MPC是一种最优控制技术,它通过基于车辆模型在预测时域内对车辆状态的预测来最小化成本函数,从而计算控制动作。
MPC方法在几个时间步上的表现:
在这个图中,MPC在预测时域p+1上预测控制输入,使得预测输出与参考轨迹融合。然后,它仅使用时间k处的预测控制输入进行 actuation。
MPC有一些关键要素:
- 状态: 描述车辆在特定时间行为的参数,例如位置、速度、横向误差等。
- 控制输入: MPC计算出的控制参数(我们最终想要的答案),例如加速度和转向角。
- 车辆模型: 描述车辆运动的数学模型。它可以是运动学模型或动力学模型。
- 参考: 被控车辆的期望状态,例如参考轨迹和期望速度。
- 约束: 状态和控制输入的最大值和最小值。也可以是它们的变化率。
- 成本函数: 代表控制系统目标的数学表达式。
- 预测时域: MPC预测输出和控制输入的未来样本数量。
- 采样时间: 两个连续控制动作之间的时间间隔。
所有这些要素都是必不可少的。我们将逐一深入探讨。让我们从最基本的状态和控制输入开始。
4.1 状态,X
状态是描述车辆行为的特征。假设我想使用自行车运动学模型来简化,因为它忽略了力、重量和重力。车辆状态如下:
- 位置 x(x):车辆重心(CoG)的x坐标。
- 位置 y(y):车辆CoG的y坐标。
- 航向角(ψ):车辆的朝向,以车辆纵轴与全局参考系之间的角度度量。
- 速度(v):车辆的纵向速度。
- 横向误差(cte):车辆位置与参考轨迹之间的切向距离。
- 航向误差(eψ):车辆偏航角与参考航向之间的差值。
4.2 控制输入,U
控制输入是我们用来控制车辆的最终值。对于我使用的模型,它们是:
- 加速度(a):车辆的加速度。
- 转向角(δ):方向盘角度。
注意,状态和控制输入可能因你使用的模型而异。
4.3 模型
如上所述,我们在这里使用的是非线性自行车运动学模型,包含六个状态:
其中Lf是车辆CoG与其前轴之间的距离,dt是采样时间。该模型基于车辆CoG坐标系。
该模型也可以写成离散时间状态空间模型:
X(t+1) = AX(t) + BU(t)
X是包含六个状态的状态向量,U是包含两个控制输入的向量,A是6x6系数矩阵,B是6x2系数矩阵。
4.4 参考
控制AV的参考通常是以带有目标速度的路径点。路径点用于利用模型计算横向误差和航向误差,而目标速度将直接用于下面的成本函数中。
4.5 约束
约束是我们可以为状态、控制输入及其变化率设置的上下限值。你总是希望首先限制速度:
- 速度,v ∈ [-4 ms⁻¹, 25 ms⁻¹]
由于执行器的限制,我们需要限制控制输入:
- 加速度,a ∈ [-3 ms⁻², 2 ms⁻²]
- 方向盘角度,δ ∈ [-30°, 30°]
你还可以为舒适性设置控制输入的变化率:
- 冲击度,da/dt ∈ [-0.6 ms⁻³, 0.5 ms⁻³]
- 转向速率,dδ/dt ∈ [ -6°s⁻¹, 6°s⁻¹]
约束可能因车辆硬件和具体环境而异。
4.6 成本函数
MPC的成本函数也可以理解为我们的目标——轨迹跟踪和速度控制——的数学表达。第一行很好地解释了这一点:最小化横向误差、航向误差和速度误差。
我们还希望对执行动作进行惩罚,因为进行油门、刹车或转向操作都是有成本的(燃料、能量和舒适性)。换句话说,引入这些成本可以防止过冲。
最后但同样重要的是,控制输入变化率的成本是为了舒适性。
成本函数可能因你的用例而异。因此,我们为每个成本引入权重以反映其优先级。
4.7 预测时域N与采样时间dt
预测时域是控制算法预测和规划控制动作的未来样本数量。这是决定MPC控制器计算成本和整体性能的关键因素。
采样时间是连续预测和控制动作之间的时间间隔。与预测时域一样,采样时间也会影响计算成本和MPC性能。
较长的时域和较短的采样时间需要更多的计算资源,但可以带来更好的控制效果。因此,这是计算成本与控制性能之间的权衡。
请注意,采样时间应至少等于单个MPC控制周期(图1中的完整周期)的持续时间,以便算法有足够的时间计算控制输入。如果采样时间太短,MPC算法可能难以跟上快速变化的系统,从而导致控制性能不佳。
5、如何实现MPC?
本教程中使用的代码来自Jusheng Fu使用C++完成的Udacity自动驾驶汽车纳米学位的作业:
GitHub — JunshengFu/Model-Predictive-Control:这个项目是使用模型预测控制(MPC)……这个项目是在游戏模拟器中使用MPC来控制汽车。服务器提供参考……
要实现MPC,让我们首先了解MPC的输入和输出:
输入:参考路径点 结果:控制动作(a & δ)
路径点通常由路径规划算法计算,并且是在全局坐标系中的坐标。我们将首先通过main.cpp中的*map2car()*函数将路径点转换到局部车辆CoG坐标系,因为我们使用的车辆模型是参照局部坐标系的。
接下来,我们需要对路径点执行三阶多项式拟合(polyfit()),以确保提供给MPC求解器的轨迹平滑连续。
提取的多项式系数用于计算当前的cte和eψ,如下所示:
double epsi = 0 - atan(coeffs[1]) - v / Lf * steer_angle * latency;
double cte = polyeval(coeffs, 0) - 0 + v * sin(0- atan(coeffs[1])) * latency;
之后,我们就有了当前时间戳的所有测量状态(输出)。最后一步是将状态和多项式系数传递给MPC求解器:
// 调用MPC求解器
auto vars = mpc.Solve(state, coeffs);
5.1 延迟
在实际应用中,从程序发送命令到机械执行始终存在延迟。因此,我们需要在程序中考虑这个延迟。
5.2 结语
我们到目前为止讨论的所有过程都在main.cpp文件中完成。我们之前讨论的MPC概念细节,如定义车辆模型、约束和成本函数,则在MPC.cpp中实现。
我不会详细介绍如何编写代码,因为代码实现细节取决于你使用的优化库。(Udacity使用的优化库是Ipopt。)
尽管如此,MPC的概念是相同的。你仍然需要定义所有主要的MPC要素。
6、MPC:超越基础
我们已经了解了如何实现MPC,但在解决实际问题时还有更多需要考虑。
6.1 动力学模型
我们之前对MPC应用了运动学模型,但运动学模型从不考虑力、轮胎滑移和惯性。因此,当车速越来越快且轮胎滑移显著影响车辆运动时,MPC可能表现不佳。
但动力学模型在计算车辆输出时会考虑力,从而产生更准确的输出预测。
如果你热衷于使用自行车动力学模型,这里有一个代码示例:
GitHub - alexliniger/MPCC:面向自主赛车的模型预测等高线控制器(MPCC)用于自主赛车的模型预测等高线控制器(MPCC)的C++和Matlab仿真环境……
6.2 优化库
在编写MPC程序时,最好使用优化库来解决你的MPC优化问题,因为它们为此而设计。
除了Ipopt之外,这里还有一些库:
6.3 让MPC运行更快
通常,MPC会消耗大部分计算能力,从而拖慢你运行的其他程序。为了解决这个问题,你可以尝试以下几种方法:
- 降低模型阶数
- 缩短预测时域
- 减少约束数量
- 在超过特定计算时间时使用次优解
- 尝试其他优化库
原文链接:Model Predictive Control for Autonomous Vehicle: An In-depth Guide
汇智网翻译整理,转载请标明出处