此示例演示如何训练、验证和测试模拟飞行机器人非线性模型预测控制器行为的深层神经网络(DNN)。然后将深层神经网络的行为与原始控制器的行为进行比较。为了训练深层神经网络,此示例使用数据聚合(DAgger)方法如[1]所示。
非线性模型预测控制(NLMPC)解决了一个约束的非线性优化,实时,基于植物的当前状态的问题。由于NLMPC解决了开环方式的优化问题,还有就是更换与受过训练的DNN控制器的潜力。这样做是一个有吸引力的选择,因为评估DNN可以比实时求解非线性优化问题,计算效率更高。
如果训练的DNN合理地估计控制器行为,则可以为控制应用程序部署网络。您还可以使用该网络作为培训钢筋学习代理的演员网络的温暖起点。有关使用用于MPC应用程序的DNN培训的示例,请参阅用掠过的演员网络训练DDPG代理。
设计了一种用于飞行机器人的非线性MPC控制器,该飞行机器人的动力学特性与实际情况相同非线性MPC飞行机器人的轨迹优化与控制(模型预测控制工具箱)例子。首先,定义限制的控制变量,它们是机器人推力水平。
umax=3;
创建非线性MPC控制器对象nlobj
。要减少命令窗口输出,请禁用MPC更新消息。
MPC可靠性关;nlobj = creatempcobjimflyingrobot(umax);
加载从输入数据DAggerInputDataFileImFlyingRobot.mat
。该数据集的列包括:
是机器人沿x轴的位置。
是机器人沿y轴的位置。
是机器人的方向。
是沿X轴的机器人的速度。
是沿y轴的机器人的速度。
是机器人的角速度。
是飞行机器人左侧的推力
是对飞行机器人的右侧的推力
是NLMPC计算的左侧的推力
是NLMPC计算的右侧的推力
数据in.DAggerInputDataFileImFlyingRobot.mat
通过计算为随机生成的状态下的NLMPC控制动作(在
那
那
那
那
那
)和之前的控制操作(
那
)。要生成自己的培训数据,请使用collectdataimflyingrobot.
功能。
加载输入数据。
filename =.'dgragrinputdatafileimflyingrobot.mat';DAggerData =负载(文件名);数据= DAggerData.data;existingData =数据;numCol =大小(数据,2);
深层的神经网络体系结构使用以下类型的层。
imageInputLayer
是神经网络的输入层。
fullyConnectedLayer
将输入乘以权重矩阵,然后添加偏移向量。
抵押者
是神经网络的激活功能。
Tanhlayer.
约束的值到范围为[-1,1]。
scalingLayer
将值缩放到[-3,3]的范围。
回归金属
定义神经网络的损耗功能。
创建深度神经网络,在培训后将模拟NLMPC控制器。
numObservations=numCol-2;numActions=2;hiddenLayerSize=256;模仿网络=[featureInputLayer(numObservations,'正常化'那'没有任何'那'姓名'那'观察')全连接列(HiddenLayersize,'姓名'那'FC1')reluLayer('姓名'那“relu1”)全连接列(HiddenLayersize,'姓名'那“F” c2)reluLayer('姓名'那'relu2')全连接列(HiddenLayersize,'姓名'那'FC3')reluLayer('姓名'那'relu3')全连接列(HiddenLayersize,'姓名'那'fc4')reluLayer('姓名'那'relu4')全连接列(HiddenLayersize,'姓名'那'fc5')reluLayer('姓名'那'relu5')全连接列(HiddenLayersize,'姓名'那'fc6')reluLayer('姓名'那'relu6')完全连接层(numActions,'姓名'那“fcLast”)坦莱尔('姓名'那'tanhLast')缩放层('姓名'那“ActorScaling”那“规模”,umax)海退层('姓名'那“routput”)];
绘制网络图。
图(layerGraph(imitateMPCNetwork))
一种方法来学习使用监督学习的专家政策的行为克隆方法。此方法把专家演示(NLMPC控制动作响应于观察)到的状态 - 动作对与应用监督学习训练网络。
指定培训选项。
%初始化验证单元格数组validationCellArray = {0,0};选项= trainingOptions('亚当'那......'verbose', 错误的,......'plots'那“训练进度”那......'洗牌'那“每个时代”那......'minibatchsize', 512,......“验证数据”,验证函数,......'italllearnrate',1E-3,......'executionenvironment'那'中央处理器'那......'gradientthreshold', 10,......'maxepochs',40......);
您可以通过以下步骤来训练克隆神经网络的行为
使用collectdataimflyingrobot.
功能。
使用行为cloningtrainnetwork.
功能。
训练DNN是一个计算密集型的过程。为了节省时间,加载一个预训练的神经网络对象。
加载('behaviorCloningMPCImDNNObject.mat');imitateMPCNetBehaviorCloningObj = behaviorCloningNNObj.imitateMPCNetObj;
使用行为克隆的DNN训练降低了DNN和NLMPC性能之间的间隙。然而,克隆神经网络的行为不能在一些随机生成的数据上正确模仿NLMPC控制器的行为。
为了提高DNN的性能,您可以使用一个交互式的演示方法学政策。匕首是其中DNN在闭环环境中运行的迭代方法。专家,在这种情况下,NLMPC控制器,基于DNN参观了美国输出的动作。以这种方式,更多的训练数据被聚集并且被DNN重新训练,以提高性能。有关详细信息,请参见[1]。
使用训练深层神经网络DAggerTrainNetwork
功能。它创建DAggerImFlyingRobotDNNObj.mat
包含以下信息的文件。
数据集路径:
其中对应于每一迭代的数据集被存储路径
政策对象:
在每次迭代中培训的策略
FinalData的:
最终迭代前收集的总培训数据
finalPolicy:
所有收集的策略中的最佳策略
首先,创建和初始化参数进行训练。通过使用克隆的行为训练网络(模仿empcnetbehavior克隆bj
)作为匕首训练的起点。
[DataStruct,NLMPCStruct,TuningParamsstruct,NeuralNetStruct] = LoadDaggerParameters(现有数据,......numcol,nlobj,umax,选项,imitatempcnetbehaviorcloningobj);
为了节省时间,通过设置用圆形
到错误的
。自己训练匕首,套装用圆形
到符合事实的
。
doTraining=false;如果doTraining DAgger=DAggerTrainNetwork(nlmpcStruct、dataStruct、neuralNetStruct、tuningParamsStruct);别的加载(“DAggerImFlyingRobotDNNObj.mat”);结尾dnn = dgger.finalpolicy;
作为替代方案,您可以使用使用修改的策略更新规则训练神经网络DAggerModifiedTrainNetwork
功能。在此功能中,每20次训练迭代后,DNN的是从以前的20次迭代设置为最优化的配置。运行具有与改性匕首方法神经网络对象本实施例中,可使用DAggerModifiedImFlyingRobotDNNObj.mat
文件。
要比较NLMPC控制器和培训的DNN的性能,并使用飞行机器人模型运行闭环模拟。
设置飞行机器人状态的初始条件( 那 那 那 那 那 )和飞行机器人的控制变量( 那 )。
X0 = [-1.8200 0.5300 -2.3500 1.1700 -1.0400 0.3100]'U0 = [-2.1800 -2.6200]';
运行NLMPC控制器的闭环仿真。
% 期间tf = 15;%采样时间ts = nlobj.ts;%模拟步骤t步骤=Tf/Ts+1;%在闭环中运行nlmpc。抽动[xHistoryMPC,uHistoryMPC] = simModelMPCImFlyingRobot(X0,U0,nlobj,TF);TOC
运行时间为31.406812秒。
运行训练有素的匕首网络的闭环仿真。
tic [xhistorydnn,uhistorydnn] = simmodeldimbleimflyingrobot(x0,u0,dnn,ts,tf);TOC
经过时间为2.453657秒。
绘制结果,并比较NLMPC和训练的DNN轨迹。
plotSimResultsImFlyingRobot(nlobj,xHistoryMPC,uHistoryMPC,xHistoryDNN,uHistoryDNN,UMAX,TF)
匕首神经网络成功地模仿NLMPC控制器的行为。控制器和匕首飞行机器人的状态和控制动作轨迹深层神经网络紧密地结合起来。闭环仿真时间DNN比NLMPC控制器显著以下。
要验证培训的DNN性能,请将飞行机器人与DNN闭环仿真的数据设置动画。飞行机器人成功地在原产地上落地。
lx = 5;ly = 5;为了CT = 1:Tsteps X = xHistoryDNN(CT,1);Y = xHistoryDNN(CT,2);THETA = xHistoryDNN(CT,3);TL = uHistoryDNN(CT,1);TR = uHistoryDNN(CT,2);rl.env.viz.plotFlyingRobot(X,Y,θ,TL,TR,LX,LY);暂停(0.05);结尾
%打开MPC消息MPC可靠性在…上;
[1] OSA,Takayuki,Joni Paarinen,Gerhard Neumann,J. Andrew Bagnell,Pieter Bebeel和Jan Peters。'模仿学习的算法视角'。机器人的基础和趋势7,不。1-2(2018):1-179。https://doi.org/10.1561/2300000053.。