主要内容

飞行机器人非线性MPC控制器的仿真

这个例子展示了如何训练、验证和测试一个模拟飞行机器人非线性模型预测控制器行为的深度神经网络(DNN)。然后将深度神经网络的行为与原控制器的行为进行比较。为了训练深度神经网络,本例使用[1]中的数据聚合(DAgger)方法。

非线性模型预测控制(NLMPC)是一个基于被控对象当前状态的实时非线性优化问题。由于NLMPC以开环方式解决其优化问题,因此有可能用训练有素的DNN来替代控制器。这样做是一个吸引人的选择,因为评估DNN比实时解决非线性优化问题的计算效率更高。

如果经过训练的DNN合理地接近控制器的行为,那么您就可以为您的控制应用程序部署网络。您还可以将该网络用作训练强化学习代理的actor网络的温暖起点。要获得一个使用经过MPC应用程序训练的DNN的示例,请参见用预先训练好的Actor网络训练DDPG Agent

设计非线性MPC控制器

设计一种用于飞行机器人的非线性MPC控制器。飞行机器人的动力学和基于非线性MPC的飞行机器人轨迹优化与控制(模型预测控制工具箱)的例子。首先,定义控制变量的极限,即机器人的推力水平。

umax = 3;

创建非线性MPC控制器对象nlobj.为了减少命令窗口输出,禁用MPC更新消息。

mpcverbosity;nlobj = createMPCobjImFlyingRobot (umax);

准备输入数据

从加载输入数据DAggerInputDataFileImFlyingRobot.mat.数据集的列包含:

  1. x 为机器人沿x轴的位置。

  2. y 为机器人在y轴上的位置。

  3. θ 为机器人的方向。

  4. x ˙ 是机器人沿x轴的速度。

  5. y ˙ 是机器人沿y轴的速度。

  6. θ ˙ 为机器人的角速度。

  7. u l 推力是在飞行机器人的左侧吗

  8. u r 推力是在飞行机器人的右侧吗

  9. u l 左侧推力是由NLMPC计算的吗

  10. u r 右侧推力是由NLMPC计算的吗

中的数据DAggerInputDataFileImFlyingRobot.mat是通过计算随机生成状态的NLMPC控制动作( x y θ x ˙ y ˙ θ ˙ ),以及以前的控制操作( u l u r ).要生成您自己的培训数据,请使用collectDataImFlyingRobot函数。

加载输入数据。

文件名=“DAggerInputDataFileImFlyingRobot.mat”;DAggerData =负载(文件名);数据= DAggerData.data;existingData =数据;numCol =大小(数据,2);

创建深度神经网络

深度神经网络架构使用以下类型的层。

  • imageInputLayer为神经网络的输入层。

  • fullyConnectedLayer将输入乘以一个权值矩阵,然后加上一个偏置向量。

  • reluLayer为神经网络的激活函数。

  • tanhLayer将取值范围限制为[-1,1]。

  • scalingLayer将值缩放到[-3,3]的范围。

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

建立深度神经网络,训练后模拟NLMPC控制器。

numObservations = numCol-2;numActions = 2;hiddenLayerSize = 256;imitateMPCNetwork = [featureInputLayer(numobobservations,“归一化”“没有”“名字”“观察”) fullyConnectedLayer (hiddenLayerSize“名字”“fc1”) reluLayer (“名字”“relu1”) fullyConnectedLayer (hiddenLayerSize“名字”“取得”) reluLayer (“名字”“relu2”) fullyConnectedLayer (hiddenLayerSize“名字”“一个fc3”文件) reluLayer (“名字”“relu3”) fullyConnectedLayer (hiddenLayerSize“名字”“fc4”) reluLayer (“名字”“relu4”) fullyConnectedLayer (hiddenLayerSize“名字”“fc5”) reluLayer (“名字”“relu5”) fullyConnectedLayer (hiddenLayerSize“名字”“fc6”) reluLayer (“名字”“relu6”) fullyConnectedLayer (numActions“名字”“fcLast”) tanhLayer (“名字”“tanhLast”) scalingLayer (“名字”“ActorScaling”“规模”umax) regressionLayer (“名字”“routput”));

画出网络。

情节(layerGraph (imitateMPCNetwork))

图中包含一个坐标轴。坐标轴包含一个graphplot类型的对象。

行为克隆方法

使用监督学习学习专家策略的一种方法是行为克隆方法。该方法将专家演示(响应观测的NLMPC控制动作)分解为状态-动作对,并应用监督学习对网络进行训练。

指定培训选项。

初始化验证单元格数组validationCellArray = {0};选择= trainingOptions (“亚当”...“详细”假的,...“阴谋”“训练进步”...“洗牌”“every-epoch”...“MiniBatchSize”, 512,...“ValidationData”validationCellArray,...“InitialLearnRate”1 e - 3,...“ExecutionEnvironment”“cpu”...“GradientThreshold”10...“MaxEpochs”,40...);

你可以通过以下步骤训练行为克隆神经网络

  1. 使用collectDataImFlyingRobot函数。

  2. 训练行为克隆网络使用behaviorCloningTrainNetwork函数。

训练DNN是一个计算密集型的过程。为了节省时间,加载一个预先训练好的神经网络对象。

负载(“behaviorCloningMPCImDNNObject.mat”);imitateMPCNetBehaviorCloningObj = behaviorCloningNNObj.imitateMPCNetObj;

采用行为克隆的方法对神经网络进行训练,减少了神经网络与NLMPC之间的性能差距。然而,行为克隆神经网络在某些随机生成的数据上不能正确地模拟NLMPC控制器的行为。

数据聚合方法

为了提高DNN的性能,您可以使用交互式演示方法来学习该策略。DAgger是一种在闭环环境中运行DNN的迭代方法。专家,在本例中是NLMPC控制器,根据DNN访问的状态输出动作。通过这种方式,可以聚合更多的训练数据,并对DNN进行再训练,以提高性能。有关更多信息,请参见[1]。

训练深度神经网络使用DAggerTrainNetwork函数。它创造了DAggerImFlyingRobotDNNObj.mat包含以下信息的文件。

  • DatasetPath:存储与每个迭代相对应的数据集的路径

  • policyObjs:在每次迭代中训练的策略

  • finalData:直到最终迭代收集的全部训练数据

  • finalPolicy:所有保单中最好的保单

首先,创建并初始化训练的参数。使用行为克隆训练的网络(imitateMPCNetBehaviorCloningObj)作为匕首训练的起点。

[dataStruct, nlmpcStruct tuningParamsStruct neuralNetStruct] = loadDAggerParameters (existingData,...numCol、nlobj umax,选项,imitateMPCNetBehaviorCloningObj);

为了节省时间,通过设置加载预先训练好的神经网络doTraining.亲自训练匕首,完毕doTraining真正的

doTraining = false;如果doTraining DAgger = DAggerTrainNetwork(nlmpcStruct,dataStruct,neuralNetStruct,tuningParamsStruct);其他的负载(“DAggerImFlyingRobotDNNObj.mat”);结束款= DAgger.finalPolicy;

作为一种替代方法,您可以使用修改的策略更新规则来训练神经网络DAggerModifiedTrainNetwork函数。在该函数中,每20次训练迭代后,将DNN设置为前20次迭代的最优配置。要使用带有修改过的DAgger方法的神经网络对象运行此示例,请使用DAggerModifiedImFlyingRobotDNNObj.mat文件

比较训练匕首网络与NLMPC控制器

为了比较NLMPC控制器和训练后的DNN的性能,对飞行机器人模型进行了闭环仿真。

设定飞行机器人状态的初始条件( x y θ x ˙ y ˙ θ ˙ )和飞行机器人的控制变量( u l u r ).

X0 = [-1.8200 0.5300 -2.3500 1.1700 -1.0400 0.3100]';U0 = [-2.1800 -2.6200]';

对NLMPC控制器进行闭环仿真。

%的持续时间Tf = 15;%样品时间Ts = nlobj.Ts;%仿真步骤Tsteps = Tf / Ts + 1;%闭环运行NLMPC。tic [xHistoryMPC,uHistoryMPC] = simModelMPCImFlyingRobot(x0,u0,nlobj,Tf);toc
运行时间为31.406812秒。

对训练过的DAgger网络进行闭环模拟。

tic [xHistoryDNN,uHistoryDNN] = simModelDAggerImFlyingRobot(x0,u0,DNN,Ts,Tf);toc
运行时间为2.453657秒。

绘制结果,并比较NLMPC和训练的DNN轨迹。

plotSimResultsImFlyingRobot (nlobj、xHistoryMPC uHistoryMPC、xHistoryDNN uHistoryDNN, umax, Tf)

图中包含6个轴。标题x1的轴1包含2个类型为line的对象。这些对象代表DNN, MPC。标题x2的轴2包含2个类型为line的对象。这些对象代表DNN, MPC。标题为theta的轴3包含两个类型为line的对象。这些对象代表DNN, MPC。标题v1的轴4包含2个类型为line的对象。这些对象代表DNN, MPC。标题v2的轴5包含2个类型为line的对象。 These objects represent DNN, MPC. Axes 6 with title omega contains 2 objects of type line. These objects represent DNN, MPC.

图中包含2个轴。标题为“推力T1”的轴1包含2个楼梯类型的物体。这些对象代表DNN, MPC。标题为“推力T2”的轴线2包含2个楼梯类型的物体。这些对象代表DNN, MPC。

DAgger神经网络成功地模拟了NLMPC控制器的行为。飞行机器人的状态和控制动作轨迹与控制器和DAgger深度神经网络紧密对齐。DNN的闭环仿真时间明显小于NLMPC控制器。

用训练有素的匕首网络动画飞行机器人

为了验证训练后的DNN的性能,使用DNN闭环仿真的数据对飞行机器人进行动画处理。飞行机器人在原点成功着陆。

Lx = 5;Ly = 5;ct = 1:Tsteps x = xHistoryDNN(ct,1);y = xHistoryDNN (ct, 2);θ= xHistoryDNN (ct, 3);tL = uHistoryDNN (ct, 1);tR = uHistoryDNN (ct, 2);rl.env.viz.plotFlyingRobot (x, y,θ,tL、tR、Lx, Ly);暂停(0.05);结束

图飞行机器人可视化器包含一个轴。轴包含三种类型的物体颤抖,贴片,线。

%打开MPC消息mpcverbosity

参考文献

欧莎,Takayuki, Joni Pajarinen, Gerhard Neumann, J. Andrew Bagnell, Pieter Abbeel, Jan Peters。“模仿学习的算法视角”。机器人技术的基础和趋势7,不。1 - 2(2018): 1 - 179。https://doi.org/10.1561/2300000053

另请参阅

|

相关的话题