使用自适应模型预测控制避障
本例展示了如何使用自适应MPC使车辆(自我车)遵循参考速度并避开车道上的障碍物。为此,您需要在运行时更新工厂模型和线性混合输入/输出约束。
避障
具有避障(或通过辅助)功能的车辆有一个传感器,如激光雷达,可以测量车辆前方和同一车道上障碍物的距离。障碍物可以是静态的,比如一个大坑,也可以是移动的,比如一辆缓慢移动的车辆。司机最常见的动作是暂时移到另一条车道,开过障碍物,然后移回原来的车道。
作为自动驾驶体验的一部分,避障系统可以在没有人为干预的情况下进行机动。在本例中,您设计了一个避障系统,该系统利用油门和转向角度使汽车绕过车道上的静态障碍物。该系统采用自适应模型预测控制器,在每个控制区间更新预测模型和混合输入/输出约束。
汽车模型
小轿车的外形为长5米、宽2米的矩形。该模型有四个状态:
-汽车中心的全局X位置
-汽车中心全局Y位置
-车辆的航向角(
0
向东时,逆时针正)-车速(正数)
有两个被操纵的变量:
-油门(加速时为正,减速时为负)
-转向角度(与汽车对齐时为0,逆时针正)
用一个简单的非线性模型来描述自我车的动力学:
利用非线性状态空间模型的解析雅可比矩阵,建立了在标称工作点处的线性预测模型。
在哪里是车长。
假设所有的状态都是可测量的。在标称工作点,小轿车以恒定的速度向东行驶20.
米每秒。
V = 20;X0 = [0;0;0;V];U0 = [0;0);
采用零阶保持器方法对连续时间模型进行离散化obstacleVehicleModelDT
函数。
Ts = 0.02;[Ad,Bd,Cd,Dd,U,Y,X,DX] = obstacleVehicleModelDT(Ts,x0,u0);dsys = ss(Ad,Bd,Cd,Dd,“t”、Ts);dsys。InputName = {“节流”,“δ”};dsys。StateName = {“X”,“Y”,“θ”,“V”};dsys。OutputName = dsys.StateName;
道路和障碍信息
在本例中,假设:
这条路笔直,有三条车道。
每条车道宽4米。
小轿车在不超车的时候开在中间车道的中间。
在不失去一般性的情况下,自我车只从左边(快速)车道通过障碍。
车道= 3;laneWidth = 4;
在这个例子中的障碍是一个在中心车道中间的不移动的物体,与自我汽车大小相同。
障碍物=结构;障碍。长度= 5;障碍。宽度= 2;
放置障碍50
几米远的路。
障碍。X = 50;障碍。Y = 0;
在障碍物周围创建一个虚拟的安全区,这样自我车在通过障碍物时就不会太靠近它。安全区域以障碍物为中心,具有:
长度等于两辆车的长度
宽度等于两个车道宽度
障碍。safeDistanceX = barrier . length;障碍。safeDistanceY = laneWidth;障碍物= obstacleGenerateObstacleGeometryInfo(障碍物);
在本例中,假设激光雷达设备可以检测到障碍物30.
在车辆前方几米。
障碍。DetectionDistance = 30;
在标称条件下绘制如下图:
自我车-绿色点与黑色边界
水平车道-蓝色虚线
障碍-红色
x
黑色边界安全区域-红色虚线边界。
f = obstaclePlotInitialCondition(x0,障碍物,车道宽度,车道);
标准工作点的MPC设计
设计一种模型预测控制器,使小车保持期望的速度并保持在中心车道的中间。
状态= mpcverbosity(“关闭”);Mpcobj = mpc(dsys);
预测范围是25
步数,相当于0.5秒。
mpcobj。PredictionHorizon = 60;% 25;mpcobj。ControlHorizon = 2;% 5;
为了防止小轿车加速或减速过快,在油门变化率上增加0.2 (m/s^2)的硬约束。
mpcobj.ManipulatedVariables(1)。RateMin = -0.2*Ts;mpcobj.ManipulatedVariables(1)。RateMax = 0.2*Ts;
类似地,在转向角变化率上添加每秒6度的硬约束。
mpcobj.ManipulatedVariables(2)。RateMin = -pi/30*Ts;mpcobj.ManipulatedVariables(2)。RateMax = pi/30*Ts;
按各自的操作范围缩放油门和转向角度。
mpcobj.ManipulatedVariables(1)。ScaleFactor = 2;mpcobj.ManipulatedVariables(2)。ScaleFactor = 0.2;
由于只有两个操纵变量,为了实现零稳态偏移,您可以只选择两个输出进行完美跟踪。在本例中,通过将其他两个输出(X和)的权重设置为零来选择Y位置和速度。这样做可以让这些其他输出的值浮动。
mpcobj.Weights.OutputVariables = [0 30 0 1];
更新控制器的正常工作状态。对于离散时间的植物:
U = u0
X = x0
Y = Cd*x0 + Dd*u0
DX = Ad*X0 + Bd*u0 - X0
mpcobj.Model.Nominal = struct(“U”U“Y”, Y,“X”, X,“DX”, DX);
为避障机动指定混合I/O约束
有不同的策略,使自我汽车避开道路上的障碍。例如,实时路径规划器可以在检测到障碍物后计算出一条新的路径,控制器会沿着这条路径前进。
在本例中,使用一种不同的方法,利用MPC显式处理约束的能力。当检测到障碍物时,它定义了道路上的一个区域(根据约束条件),在预测范围内,自我车不能进入。在下一个控制间隔,根据自我车和障碍物的新位置重新定义区域,直到通过。
要定义要避免的区域,使用以下混合输入/输出约束:
E*u + F*y <= G
在哪里u
被操纵的变量是向量和吗y
是输出变量向量。您可以更新约束矩阵E
,F
,G
当控制器运行时。
第一个约束是上的上界(在这条三车道的路上)。
E1 = [0 0];F1 = [0 1 0 0];G1 = laneWidth*lanes/2;
第二个约束是上的下界(在这条三车道的路上)。
E2 = [0 0];F2 = [0 -1 0 0];G2 = laneWidth*lanes/2;
第三个约束条件是避障。即使在标称操作条件下没有检测到障碍,您也必须在这里添加一个“假”约束,因为您不能在运行时更改约束矩阵的维度。对于假约束,使用与第二个约束形式相同的约束。
E3 = [0 0];F3 = [0 -1 0 0];G3 = laneWidth*lanes/2;
控件在控制器中指定混合输入/输出约束setconstraint
函数。
setconstraint (mpcobj [E1, E2、E3], [F1, F2, F3], [G1、G2、G3], [1; 1; 0.1]);
模拟控制器
在本例中,您使用了自适应MPC控制器,因为它比传统MPC控制器更有效地处理非线性车辆动力学。传统的MPC控制器采用恒定对象模型。然而,自适应MPC允许您在每个控制区间提供一个新的植物模型。由于新模型能更准确地描述新工况下的设备动态,自适应MPC控制器的性能优于传统MPC控制器。
此外,为了使控制器能够避开障碍物周围的安全区域,您需要在每个控制间隔更新第三个混合约束。基本上,自我车必须高于从自我车到安全区左上角形成的线。欲知详情,请打开obstacleComputeCustomConstraint
.
使用常数参考信号。
refSignal = [0 0 0 V];
初始化设备和控制器状态。
X = x0;U = u0;egoStates = mpcstate(mpcobj);
模拟时间为4
秒。
T = 0:Ts:4;
测井模拟数据进行绘图。
saveSlope = 0(长度(T),1);saveIntercept = 0(长度(T),1);ympc = 0(长度(T),大小(Cd,1));umpc = 0(长度(T),大小(Bd,2));
运行模拟。
为k = 1:长度(T)获得区间|k|的新工厂模型和输出测量值。[Ad,Bd,Cd,Dd,U,Y,X,DX] = obstacleVehicleModelDT(Ts, X, U);测量值= Cd * x + Dd * u;Ympc (k,:) =测量';确定车辆是否看到障碍物,并更新混合。% I/O约束时检测到障碍。检测= obstacleDetect(x,障碍物,laneWidth);[E, F, G, saveSlope (k), saveIntercept (k)] =...obstacleComputeCustomConstraint (x,检测、障碍、巷宽车道);为自适应MPC准备新的植物模型和标称条件。newPlant = ss(Ad,Bd,Cd,Dd,“t”、Ts);newNominal = struct(“U”U“Y”, Y,“X”, X,“DX”, DX);准备新的混合I/O约束。选项= mpcmoveopt;选项。CustomConstraint = struct(“E”, E,“F”F‘G’G);使用更新的植物,名义条件,计算最佳移动%和约束。[u,Info] = 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”);axis([0 ympc(end,1) -laneWidth*lanes/2 laneWidth*lanes/2])%复位轴
MPC控制器在没有人工干预的情况下成功完成了任务。
在Simulink中模拟控制器金宝app
打开Simulin金宝appk模型。避障系统包含多个组成部分:
植物模型生成器:生成新的植物模型和标称值。
障碍物检测器:检测障碍物(不包括激光雷达传感器)。
约束生成器:产生新的混合I/O约束。
自适应MPC:控制避障机动。
mdl =“mpc_ObstacleAvoidance”;open_system (mdl) sim (mdl)
模拟结果与命令行结果相同。为了支金宝app持快速原型工作流,您可以为避障系统中的块生成C/ c++代码。
bdclose (mdl)