这个例子展示了如何训练、验证和测试一个模拟汽车车道保持辅助系统模型预测控制器行为的深层神经网络。在本例中,您还将比较深层神经网络与原始控制器的行为。
模型预测控制(MPC)是一个基于被控对象当前状态的约束二次规划(QP)实时优化问题。由于MPC以开环方式解决其优化问题,因此可以用深度神经网络来替代控制器。评估深度神经网络比实时解决QP问题的计算效率更高。
如果网络训练充分地遍历了应用程序的状态空间,您可以创建一个合理的近似控制器行为。然后可以为控制应用程序部署网络。您还可以将该网络用作训练强化学习代理的actor网络的温暖起点。例如,请参见用预先训练好的Actor网络训练DDPG Agent.
设计一种用于车道保持辅助的MPC控制器。为此,首先为车辆创建一个动态模型。
(sys, Vx) = createModelForMPCImLKA;
创建和设计MPC控制器对象mpcobj
.此外,创建一个mpcstate
对象,用于设置控制器的初始状态。控制器的详细设计,类型编辑createMPCobjImLKA
.
[mpcobj, initialState] = createMPCobjImLKA(系统);
有关为车道保持辅助应用设计模型预测控制器的更多信息,请参见基于模型预测控制的车道保持辅助系统(模型预测控制工具箱)和车道保持辅助车道检测(模型预测控制工具箱).
从加载输入数据InputDataFileImLKA.mat
。数据集的列如下所示:
横向速度
偏航角速率
横向偏差
相对偏航角
前舵角(控制变量)
实测扰动(道路偏航率:纵向速度*曲率( ))
成本函数值
MPC迭代
MPC控制器计算的转向角:
中的数据InputDataFileImLKA.mat
是通过计算随机产生状态的MPC控制动作、之前的控制动作和测量到的扰动来创建的。要生成您自己的培训数据,请使用collectDataImLKA
函数。
加载输入数据。
数据结构=负载(“InputDataFileImLKA.mat”);数据= dataStruct.Data;
将输入数据划分为培训、验证和测试数据。首先,根据给定的百分比确定验证数据行数。
totalRows=大小(数据,1);validationSplitPercent=0.1;numValidationDataRows=楼层(validationSplitPercent*totalRows);
根据给定的百分比确定测试数据行数。
testSplitPercent=0.05;numTestDataRows=floor(testSplitPercent*totalRows);
从输入数据集中随机提取验证和测试数据。为此,首先为两个数据集随机提取足够的行。
randomIdx = randperm(totalRows,numValidationDataRows + numTestDataRows);randomData =数据(randomIdx:);
将随机数据分为验证数据和测试数据。
validationData = randomData (1: numValidationDataRows,:);testData = randomData(numValidationDataRows + 1:end,:);
提取其余行作为训练数据。
trainDataIdx=setdiff(1:totalRows,randomIdx);trainData=data(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
为神经网络的输入层。
fullyConnectedLayer
将输入乘以权重矩阵,然后添加偏移向量。
reluLayer
为神经网络的激活函数。
tanhLayer
将取值范围限制为[-1,1]。
scalingLayer
将该值缩放到[-1.04,1.04]范围,意味着转向角度被限制为[-60,60]度。
regressionLayer
定义神经网络的损失函数。
创建深度神经网络,在训练后模拟MPC控制器。
模仿者网络=[featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“InputLayer”) fullyConnectedLayer (45,“名字”,“Fc1”) reluLayer (“名字”,“Relu1”) fullyConnectedLayer (45,“名字”,“取得”) reluLayer (“名字”,“Relu2”) fullyConnectedLayer (45,“名字”,“一个Fc3”文件) reluLayer (“名字”,“Relu3”) fullyConnectedLayer (numActions“名字”,“OutputLayer”)坦莱尔(“名字”,“Tanh1”) scalingLayer (“名字”,“Scale1”,“规模”1.04) regressionLayer (“名字”,“RegressionOutput”));
绘制网络图。
情节(layerGraph (imitateMPCNetwork))
指定培训选项。
选项=培训选项(“亚当”,...“详细”错误的...“阴谋”,“训练进步”,...“洗牌”,“每个时代”,...“MaxEpochs”30岁的...“MiniBatchSize”, 512,...“ValidationData”validationCellArray,...“InitialLearnRate”1 e - 3,...“GradientThresholdMethod”,“绝对值”,...“ExecutionEnvironment”,“cpu”,...“GradientThreshold”10...‘ε’1 e-8);
训练深度神经网络。要在命令窗口中查看详细的培训信息,请设置“详细”
培训选择符合事实的
.
imitateMPCNetObj = trainNetwork (trainInput trainOutput、imitateMPCNetwork选项);
深度神经网络的训练在最终迭代后停止。
每个小批的训练和验证损失几乎相同,这表明训练后的网络没有过拟合。
在给定测试输入数据的情况下,检查经过训练的深度神经网络是否返回与MPC控制器控制动作类似的转向角。使用预测
函数。
predictedTestDataOutput =预测(imitateMPCNetObj testDataInput);
计算网络输出和测试数据之间的均方根误差(RMSE)。
= sqrt(mean((testDataOutput - predictedTestDataOutput).^2));流('测试数据RMSE = %d\n', testRMSE);
测试数据RMSE = 3.578066e-02
RMSE值较小,表明网络输出与MPC控制器输出非常接近。
为了比较MPC控制器和经过训练的深度神经网络的性能,使用车辆设备模型进行闭环仿真。
为不属于原始输入数据集的车辆生成随机初始条件,取值范围如下:
横向速度 -范围(-2,2)米/秒
偏航角速率 范围(-60、60)度/秒
横向偏差 范围(1,1)米
相对偏航角 45范围(-45)度
最后转向角(控制变量) 范围(-60、60)度
实测扰动(道路偏航率,定义为纵向速度*曲率( 范围(-0.01,0.01),最小道路半径为100米
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);Tsteps uHistoryMPC = repmat(情况',1);
对MPC控制器和装置进行了闭环仿真mpcmove
函数。
为k = 1: Tsteps获得与工厂产出相对应的工厂产出测量值。: xk = xHistoryMPC (k) ';%使用MPC控制器计算下一个cotnrol动作。英国= mpcmove (mpcobj initialState xk, 0(1、4),Vx *ρ);%存储控件操作。: uHistoryMPC (k) =英国;%使用控件操作更新状态。xHistoryMPC(k+1,:)=(A*xk+B*[uk;Vx*rho]);结束
初始化深度神经网络模拟的状态和输入轨迹。
xHistoryDNN = repmat (x0, Tsteps + 1, - 1);Tsteps uHistoryDNN = repmat(情况',1);lastMV =情况;
对训练过的网络和电厂进行闭环仿真。的neuralnetLKAmove
函数使用预测
函数。
为k = 1: Tsteps获得与工厂产出相对应的工厂产出测量值。: xk = xHistoryDNN (k) ';%使用训练的深度神经网络预测下一步动作。uk=neuralnetLKAmove(模仿EMPCNETBJ、xk、lastMV、rho);%存储控制动作并更新最后一个MV,以便进行下一步。: uHistoryDNN (k) =英国;lastMV =英国;%使用控件操作更新状态。xHistoryDNN(k+1,:) = (A*xk + B*[uk;Vx*rho])');结束
绘制结果,并比较MPC控制器和训练的深度神经网络(DNN)轨迹。
plotValidationResultsImLKA (Ts、xHistoryDNN uHistoryDNN、xHistoryMPC uHistoryMPC);
深度神经网络成功地模拟了MPC控制器的行为。控制器的车辆状态和控制动作轨迹与深度神经网络紧密匹配。
trainNetwork
|预测
|mpcmove
(模型预测控制工具箱)