此示例显示了如何训练,验证和测试深度神经网络,其模仿用于汽车通道保持辅助系统的模型预测控制器的行为。在该示例中,您还可以将深神经网络与原始控制器的行为进行比较。
模型预测控制(MPC)基于工厂的当前状态来实时解决约束的二次编程(QP)优化问题。由于MPC以开环方式解决了其优化问题,因此您可以使用深神经网络替换控制器。评估深度神经网络比实时解决QP问题更加计算效率。
如果网络训练充分遍历应用程序的状态空间,则可以创建控制器行为的合理近似。然后,您可以部署网络应用程序。您还可以使用该网络作为培训钢筋学习代理的演员网络的温暖起点。例如,看到用掠过的演员网络训练DDPG代理。
设计MPC控制器,用于车道保持辅助。为此,首先为车辆创建动态模型。
[sys,vx] = createmodelformpcimlka;
创建和设计MPC控制器对象mpcobj
。另外,创建一个MPCState.
用于设置初始控制器状态的对象。有关控制器设计的详细信息,请键入编辑creatempcobjimlka.
。
[mpcobj,initialstate] = creatempcobjimlka(sys);
有关为车道保持辅助应用设计模型预测控制器的更多信息,请参见基于模型预测控制的车道保持辅助系统(模型预测控制工具箱)和车道保持辅助车道检测(模型预测控制工具箱)。
加载输入数据InputDataFileImLKA.mat
。数据集的列遵循:
横向速度
偏航角度率
横向偏差
相对偏航角
前舵角(控制变量)
实测扰动(道路偏航率:纵向速度*曲率( ))
成本函数值
MPC迭代
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控制器和训练的深神经网络的性能,使用车辆厂模型运行闭环模拟。
为非原始输入数据集的车辆生成用于车辆的随机初始条件,其中从以下范围中选择的值:
横向速度 - 范围(-2,2)米/秒
偏航角度率 - 范围(-60,60)度/秒
横向偏差 - 范围(-1,1)m
相对偏航角 - 范围(-45,45)de
最后的转向角度(控制变量) - 范围(-60,60)de
实测扰动(道路偏航率,定义为纵向速度*曲率( 范围(-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控制器的行为。控制器的车辆状态和控制动作轨迹与深度神经网络紧密匹配。
预测
|trainNetwork
|MPCMOVE.
(模型预测控制工具箱)