这个例子展示了如何使用自适应MPC使车辆(自我车)遵循一个参考速度和避免车道上的障碍物。为此,您需要在运行时更新工厂模型和线性混合输入/输出约束。
具有避障(或协助通行)功能的车辆有一个传感器,例如激光雷达,它可以测量与车辆前方同一车道上障碍物的距离。障碍物可以是静止的,如一个大的坑洞,也可以是移动的,如移动缓慢的车辆。司机最常见的机动是临时移到另一条车道,开过障碍物,然后回到原来的车道。
作为自动驾驶体验的一部分,避障系统可以在不需要人工干预的情况下完成机动。在本例中,您设计了一个避障系统,该系统使用油门和转向角度使自我汽车绕过车道上的静态障碍物。该系统采用自适应模型预测控制器,在每个控制区间更新预测模型和混合输入/输出约束。
自我汽车有一个长5米,宽2米的矩形形状。模型有四种状态:
-汽车中心的全局X位置
- 汽车中心的全球y位置
- 汽车的前角(0.
面向东,逆时针呈正面)
- 汽车的速度(正面)
有两个操纵变量:
- 油门(阳性加速时,减速时)
-转向角度(与汽车对齐时为0,逆时针为正)
使用一个简单的非线性模型来描述自我车的动力学:
利用非线性状态空间模型的解析雅可比矩阵构造了标称运行点的线性预测模型。
在哪里是汽车的长度。
假设所有的状态都是可测量的。在名义运行点,自我汽车以恒定的速度向东行驶20.
每秒米。
V = 20;x0 = [0;0;0;V];情况= [0;0);
使用零级持有者方法离散连续时间模型explationvhiclemodeldt.
函数。
ts = 0.02;[广告,bd,cd,dd,u,y,x,dx] = acckiclevehiclemodeldt(ts,x0,u0);dsys = ss(广告,bd,cd,dd,“t”、Ts);dsys。InputName = {'风门'那“δ”};dsys。StateName = {“X”那“Y”那'theta'那“V”};dsys.outputname = dsys.statename;
在本例中,假设:
这条路是直的,有三条车道。
每个车道都有四米宽。
自我汽车在不超车时开在中间车道。
在不失一般性的前提下,自我车只从左车道(快车道)通过障碍物。
Lanes = 3;LaneWidth = 4;
该示例中的障碍是中心车道中间的非涂抹物体,其尺寸与自我汽车相同。
障碍=结构;障碍。长度= 5;障碍。宽度= 2;
把障碍50.
在路上米。
障碍。X = 50;障碍。Y = 0;
在障碍物周围创建一个虚拟安全区,这样当自我车通过障碍物时就不会太靠近它。安全区以障碍物为中心,有:
长度等于两个车长
宽度等于两个车道宽度
障碍.safedistancex =障碍.Length;障碍.Safedistance = LaneWidth;障碍=障碍障碍障碍术(障碍);
在本例中,假设激光雷达设备可以探测到障碍物30.
在车辆前方几米的地方。
障碍.DetectionDistance = 30;
在标称条件下绘制以下内容:
自我汽车 - 与黑边界的绿色点
水平通道-蓝色虚线
障碍 - 红色X
有黑色边界
安全区-红色虚线边界。
f = obstaclePlotInitialCondition (x0,障碍、巷宽车道);
设计一种模型预测控制器,使自驾车保持理想速度并保持在中心车道中间。
状态= mpcverbosity (“关闭”);mpcobj = mpc (dsys);
预测层位为25.
步骤,相当于0.5秒。
mpcobj。PredictionHorizon = 60;%25;mpcobj.controlhorizon = 2;% 5;
为了防止自我车加速或减速太快,增加一个硬约束0.2 (m/s^2)对油门的变化速率。
mpcobj.ManipulatedVariables(1)。杀鼠灵= -0.2 * Ts;mpcobj.ManipulatedVariables(1)。RateMax = 0.2 * Ts;
同样地,在转向角度的变化率上添加6度/秒的硬性约束。
mpcobj.ManipulatedVariables(2)。杀鼠灵= -π/ 30 * Ts;mpcobj.ManipulatedVariables(2)。RateMax =π/ 30 * Ts;
缩放油门和转向角度各自的操作范围。
mpcobj.manipuldvariables(1).scalefactor = 2;mpcobj.manipuldvariables(2).scalefactor = 0.2;
由于只有两个被操纵的变量,为了实现零稳态偏移,您可以只选择两个输出来实现完美跟踪。在本例中,通过将其他两个输出(X和)的权值设置为零来选择Y轴的位置和速度。这样做可以让这些其他输出的值浮动。
mpcobj.weights.outputvariables = [0 30 0 1];
使用标称操作条件更新控制器。对于一个离散时间的工厂:
U =情况
x = x0
Y = Cd*x0 + Dd*u0
DX = Ad*X0 + Bd*u0 - X0
mpcobj.Model.Nominal =结构(“U”U“Y”,y,“X”,X,'dx',dx);
有不同的策略,使自我汽车避免道路上的障碍。例如,实时路径规划器可以计算一个新的路径后,一个障碍检测和控制器遵循这条路径。
在此示例中,使用不同的方法,该方法利用MPC明确地处理限制的能力。当检测到障碍物时,它在道路上定义了自助式汽车在预测地平线期间不进入的道路上的区域。在下一个控制间隔,该区域基于自我汽车的新位置和障碍物重新定义,直到通过完成。
要定义要避免的区域,请使用以下混合输入/输出约束:
E*u + F*y <= G
在哪里你
被操纵的变量是和吗y
是输出变量向量。您可以更新约束矩阵E.
那F
,G
当控制器运行时。
第一个约束是上的上界(在这个三车道的道路上)。
E1 = [0 0];F1 = [0 1 0 0];G1 / 2 =巷宽*车道;
第二个约束是上的下界(在这个三车道的道路上)。
E2 = [0 0];F2 = [0 -1 0 0];G2 =巷宽*车道/ 2;
第三个约束是避免障碍物。即使在标称操作条件下没有检测到障碍,您必须在此添加“假”约束,因为您无法在运行时更改约束矩阵的尺寸。对于虚假约束,使用与第二个约束相同的形式的约束。
E3 = [0 0];F3 = [0 -1 0 0];G3 / 2 =巷宽*车道;
控件指定控制器中的混合输入/输出约束setconstraint
函数。
setconstraint (mpcobj [E1, E2、E3], [F1, F2, F3], [G1、G2、G3], [1; 1; 0.1]);
在此示例中,您使用自适应MPC控制器,因为它比传统的MPC控制器更有效地处理非线性车辆动态。传统的MPC控制器使用恒定的工厂模型。但是,Adaptive MPC允许您在每个控制间隔提供新的工厂模型。由于新模型在新的操作条件下更准确地描述了植物动态,所以自适应MPC控制器比传统的MPC控制器更好。
此外,为了让控制器能够避开障碍物周围的安全区域,你需要在每个控制间隔更新第三个混合约束。基本上,自我车必须在从自我车到安全区域左上角形成的线之上。欲了解更多细节,请打开acckeClecucteCustomConstraint.
。
使用恒定的参考信号。
Refsignal = [0 0 0 V];
初始化设备和控制器状态。
x = x0;u = u0;egostates = mpcstate(mpcobj);
模拟时间是4.
秒。
t = 0:TS:4;
测井模拟数据绘制。
SaveSlope = Zeros(长度(t),1);saveintercept = zeros(长度(t),1);YMPC =零(长度(t),尺寸(CD,1));umpc = zeros(长度(t),尺寸(bd,2));
运行仿真。
为k = 1:长度(T)%获得区间|k|的新工厂模型和输出测量值。[广告,bd,cd,dd,u,y,x,dx] = acckaclyhiclemodeldt(ts,x,u);测量= CD * x + DD * U;YMPC(k,:) =测量';%确定车辆是否看到障碍物,并更新混合% I/O约束当检测到障碍时。检测= obstacleDetect (x,障碍,巷宽);[E, F, G, saveSlope (k), saveIntercept (k)] =......ropactlecucteCustomConstraint(x,检测,障碍物,车道宽,车道);%为Adaptive MPC准备新的植物模型和名义条件。newPlant = ss(广告、Bd、Cd、弟弟、“t”、Ts);newnominal = struct(“U”U“Y”,y,“X”,X,'dx',dx);%准备新的混合I/O约束。选择= mpcmoveopt;选项。CustomConstraint =结构(“E”, E,“F”F‘G’,G);%计算最佳移动使用更新的工厂,名义条件,%和约束。(u,信息)= mpcmoveAdaptive (mpcobj、egoStates newPlant, newNominal,......测量,Refsignal,[],选项);UMPC(k,:) = U';%更新下一次迭代的工厂状态|k+1|。x = Ad * x + Bd * u;结束mpcverbosity(状态);
绘制自我车的轨迹(黑线)和第三个混合I/O约束(绿虚线)在避障机动过程中的轨迹。
图(f)为k = 1:长度(SaveSlope)x = [0; 50; 100];y = saveSlope(k)* x + saveintercept(k);线(x,y,“线型”那“——”那“颜色”那‘g’)结束情节(ympc (: 1) ympc (:, 2),'-k');轴([0 YMPC(终端,1)-LaneWidth * LANES / 2 LANEWIDTH * LANES / 2])%重置轴
MPC控制器成功完成任务,无需人工干预。
打开Simulin万博1manbetxk模型。避名避免系统包含多个组件:
工厂模型发生器:产生新的工厂模型和标称值。
障碍物探测器:检测障碍物(不包括激光雷达传感器)。
约束生成器:产生新的混合I/O约束。
Adaptive MPC:控制障碍避免机动。
mdl =“mpc_ObstacleAvoidance”;open_system (mdl) sim (mdl)
模拟结果与命令行结果相同。为了支万博1manbetx持快速原型工作流程,您可以为避障系统中的块生成C/ c++代码。
bdclose (mdl)