主要内容

模仿MPC控制器,用于车道保持辅助

此示例显示了如何训练,验证和测试深度神经网络,其模仿用于汽车通道保持辅助系统的模型预测控制器的行为。在该示例中,您还可以将深神经网络与原始控制器的行为进行比较。

模型预测控制(MPC)基于工厂的当前状态来实时解决约束的二次编程(QP)优化问题。由于MPC以开环方式解决了其优化问题,因此您可以使用深神经网络替换控制器。评估深度神经网络比实时解决QP问题更加计算效率。

如果网络训练充分遍历应用程序的状态空间,则可以创建控制器行为的合理近似。然后,您可以部署网络应用程序。您还可以使用该网络作为培训钢筋学习代理的演员网络的温暖起点。例如,看到用掠过的演员网络训练DDPG代理

MPC控制器设计

设计MPC控制器,用于车道保持辅助。为此,首先为车辆创建动态模型。

[sys,vx] = createmodelformpcimlka;

创建和设计MPC控制器对象mpcobj。另外,创建一个MPCState.用于设置初始控制器状态的对象。有关控制器设计的详细信息,请键入编辑creatempcobjimlka.

[mpcobj,initialstate] = creatempcobjimlka(sys);

有关为车道保持辅助应用设计模型预测控制器的更多信息,请参见基于模型预测控制的车道保持辅助系统(模型预测控制工具箱)车道保持辅助车道检测(模型预测控制工具箱)

准备输入数据

加载输入数据InputDataFileImLKA.mat。数据集的列遵循:

  1. 横向速度 V. y

  2. 偏航角度率 R.

  3. 横向偏差 E. 1

  4. 相对偏航角 E. 2

  5. 前舵角(控制变量)

  6. 实测扰动(道路偏航率:纵向速度*曲率( ρ ))

  7. 成本函数值

  8. MPC迭代

  9. MPC控制器计算的转向角: *

数据in.InputDataFileImLKA.mat通过计算随机生成的状态,先前的控制动作和测量干扰来计算MPC控制操作来创建。要生成自己的培训数据,请使用collectdataimlka.函数。

加载输入数据。

dataStruct = load('inputdatafileimlka.mat');数据= dataStruct.Data;

将输入数据划分为培训,验证和测试数据。首先,根据给定百分比确定验证数据行的数量。

totalrows = size(数据,1);validationsplitpercent = 0.1;numvalidationDatarows =楼层(validationsplitpercent * totallows);

根据给定百分比确定测试数据行数。

testsplitpercent = 0.05;numtestdatarows =地板(testsplittpercent * potserrows);

从输入数据集中随机提取验证和测试数据。为此,首先为两个数据集随机提取足够的行。

randomidx = randperm(potserrows,numvalidationdatarows + numtestdatorows);randomData =数据(randomidx,:);

将随机数据分为验证数据和测试数据。

ValidationData = randomData(1:NumValidationDatorows,:);testdata = randomData(NumValidationDatarows + 1:结束,:);

将剩余行提取为培训数据。

traindataidx = setdiff(1:突出血,randomidx);traindata =数据(traindataidx,:);

随机化培训数据。

numTrainDataRows =大小(trainData, 1);shuffleIdx = randperm (numTrainDataRows);shuffledTrainData = trainData (shuffleIdx:);

将训练和验证数据重塑为4-D矩阵以供使用trainNetwork

numObservations = 6;numActions = 1;trainInput = shuffledTrainData (: 1:6);trainOutput = shuffledTrainData (: 9);validationInput = validationData (: 1:6);validationOutput = validationData (: 9);validationCellArray = {validationInput, validationOutput};

重塑测试数据以供使用预测

testDataInput = testData (: 1:6);testDataOutput = testData (: 9);

创建深度神经网络

深层神经网络架构使用以下几层。

  • imageInputlayer.是神经网络的输入层。

  • 全康统计层将输入乘以权重矩阵,然后添加偏置向量。

  • 抵押者为神经网络的激活函数。

  • Tanhlayer.将值约束到[-1,1]的范围。

  • scalinglayer.将该值缩放到[-1.04,1.04]范围,意味着转向角度被限制为[-60,60]度。

  • regressionLayer定义神经网络的损失函数。

创建将在培训后模拟MPC控制器的深神经网络。

imitatempcnetwork = [featureInputLayer(numobservations,“归一化”“没有”'姓名'“InputLayer”)全康连接层(45,'姓名''fc1')剥离('姓名''relu1')全康连接层(45,'姓名''fc2')剥离('姓名''relu2')全康连接层(45,'姓名'“一个Fc3”文件)剥离('姓名''relu3') fullyConnectedLayer (numActions'姓名''outputlayer')Tanhlayer('姓名''tanh1') scalingLayer ('姓名'“Scale1”“规模”,1.04)回归层('姓名''回归输出')];

绘制网络。

绘图(层图(IMITATEMPCNETWORK))

火车深神经网络

指定培训选项。

选项=培训选项('亚当'......“详细”,错误的,......'plots''培训 - 进步'......“洗牌”'每个时代'......'maxepochs'30岁的......'minibatchsize'512,......“ValidationData”validationCellArray,......“InitialLearnRate”,1e-3,......'GradientThresholdMethod'“绝对值”......'executionenvironment''中央处理器'......“GradientThreshold”10,......'epsilon'1 e-8);

训练深度神经网络。要在命令窗口中查看详细的培训信息,请设置“详细”培训选择真的

imitateMPCNetObj = trainNetwork (trainInput trainOutput、imitateMPCNetwork选项);

最终迭代后深度神经网络的培训停止。

每个小批的训练和验证损失几乎相同,这表明训练后的网络没有过拟合。

测试训练网络

检查训练有素的深神经网络是否返回类似于测试输入数据的MPC控制器控制操作的转向角。使用该计算网络输出预测函数。

predigeTestDataOutput = predict(imitatempcnetobj,testdatainpul);

计算网络输出和测试数据之间的均方根误差(RMSE)。

= sqrt(mean((testDataOutput - predictedTestDataOutput).^2));流('测试数据RMSE =%d \ n', testRMSE);
测试数据RMSE = 3.578066E-02

RMSE值较小,表明网络输出与MPC控制器输出非常接近。

比较训练网络和MPC控制器

为了比较MPC控制器和训练的深神经网络的性能,使用车辆厂模型运行闭环模拟。

为非原始输入数据集的车辆生成用于车辆的随机初始条件,其中从以下范围中选择的值:

  1. 横向速度 V. y - 范围(-2,2)米/秒

  2. 偏航角度率 R. - 范围(-60,60)度/秒

  3. 横向偏差 E. 1 - 范围(-1,1)m

  4. 相对偏航角 E. 2 - 范围(-45,45)de

  5. 最后的转向角度(控制变量) - 范围(-60,60)de

  6. 实测扰动(道路偏航率,定义为纵向速度*曲率( ρ 范围(-0.01,0.01),最小道路半径为100m

rng(5e7) [x0,u0,rho] = generateRandomDataImLKA(data); / /数据

设置初始工厂状态和控制操作MPCState.目的。

initialState。工厂= x0;initialState。LastMove =情况;

从MPC控制器中提取采样时间。此外,请设置仿真步骤的数量。

ts = mpcobj.ts;tsteps = 30;

获得一种B.车辆模型的状态空间矩阵。

一个= sys.A;B = sys.B;

初始化MPC控制器仿真的状态和输入轨迹。

xhistorympc = repmat(x0',tsteps + 1,1);UhistoryMPC = Repmat(U0',Tsteps,1);

使用MPC控制器和工厂运行闭环仿真MPCMOVE.函数。

为了k = 1:tsteps%获得植物输出测量,与工厂输出相对应。: xk = xHistoryMPC (k) ';%使用MPC控制器计算下一个COTNROL操作。UK = MPCMove(MPCobj,InitialState,XK,零(1,4),VX * Rho);%存储控制操作。: uHistoryMPC (k) =英国;%使用控制操作更新状态。xhistorympc(k + 1,:) =(a * xk + b * [英国; vx * rho])';结束

初始化深度神经网络仿真的状态和输入轨迹。

xhistorydnn = repmat(x0',tsteps + 1,1);UhistoryDnn = Repmat(U0',TSTEPS,1);lastmv = u0;

对训练过的网络和电厂进行闭环仿真。的neuralnetlkamove.功能计算使用的深神经网络输出预测函数。

为了k = 1:tsteps%获得植物输出测量,与工厂输出相对应。: xk = xHistoryDNN (k) ';使用培训的深神经网络预测下一个移动。UK = neuralnetlkamove(imitatempcnetobj,xk,lastmv,rho);%存储控制操作并更新下一步的最后一个MV。: uHistoryDNN (k) =英国;lastMV =英国;%使用控制操作更新状态。xhistorydnn(k + 1,:) =(a * xk + b * [英国; vx * rho])';结束

绘制结果,并比较MPC控制器和训练的深度神经网络(DNN)轨迹。

plotValidationResultsImLKA (Ts、xHistoryDNN uHistoryDNN、xHistoryMPC uHistoryMPC);

深度神经网络成功地模拟了MPC控制器的行为。控制器的车辆状态和控制动作轨迹与深度神经网络紧密匹配。

也可以看看

||(模型预测控制工具箱)

相关话题