Подражайте нелинейному контроллеру MPC для полета роботом

В этом примере показано, как обучаться, подтвердите и протестируйте глубокую нейронную сеть (DNN), которая подражает поведению нелинейного прогнозирующего контроллера модели для летающего робота. Это затем сравнивает поведение глубокой нейронной сети с тем из исходного контроллера. Чтобы обучить глубокую нейронную сеть, этот пример использует агрегацию данных (Крестик) подход как в [1].

Нелинейное прогнозирующее управление модели (NLMPC) решает ограниченную нелинейную задачу оптимизации в режиме реального времени на основе текущего состояния объекта. Поскольку NLMPC решает свою задачу оптимизации способом разомкнутого контура, существует потенциал, чтобы заменить контроллер на обученный DNN. Выполнение так является привлекательной опцией, начиная с оценки DNN может быть более в вычислительном отношении эффективным, чем решение нелинейной задачи оптимизации в режиме реального времени.

Если обучение DNN создает разумное приближение поведения контроллера, можно затем развернуть сеть для приложения управления. Можно также использовать сеть в качестве точки "теплого" запуска для того, чтобы обучить сеть агента агента обучения с подкреплением. Для примера, который делает так с DNN, обученным приложению MPC, смотрите, Обучают Агента DDPG с Предварительно обученной Сетью Агента.

Спроектируйте нелинейный контроллер MPC

Спроектируйте нелинейный контроллер MPC для летающего робота. Движущие силы для летающего робота совпадают с в Оптимизации Траектории и Управлении Летающего Робота Используя Нелинейный MPC (Model Predictive Control Toolbox) примером. Во-первых, задайте предел для контрольных переменных, которые являются уровнями тяги робота.

umax = 3;

Создайте нелинейный контроллер MPC объект nlobj. Чтобы сократить командное окно выход, отключите сообщения обновления MPC.

mpcverbosity off;
nlobj = createMPCobjImFlyingRobot(umax);

Подготовьте входные данные

Загрузите входные данные от DAggerInputDataFileImFlyingRobot.mat. Столбцы набора данных содержат:

  1. x положение робота вдоль оси X.

  2. y положение робота вдоль оси Y.

  3. θ ориентация робота.

  4. x˙ скорость робота вдоль оси X.

  5. y˙ скорость робота вдоль оси Y.

  6. θ˙ скорость вращения робота.

  7. ul тяга на левой стороне летающего робота

  8. ur тяга на правой стороне летающего робота

  9. ul* тяга на левой стороне, вычисленной NLMPC

  10. ur* тяга на правой стороне, вычисленной NLMPC

Данные в DAggerInputDataFileImFlyingRobot.mat создается путем вычисления действия управления NLMPC для случайным образом сгенерированных состояний (x, y, θ, x˙, y˙, θ˙), и предыдущие действия управления (ul, ur). Чтобы сгенерировать ваши собственные обучающие данные, используйте collectDataImFlyingRobot функция.

Загрузите входные данные.

fileName = 'DAggerInputDataFileImFlyingRobot.mat';
DAggerData = load(fileName);
data = DAggerData.data;
existingData = data;
numCol = size(data,2);

Создайте глубокую нейронную сеть

Архитектура глубоких нейронных сетей использует следующие типы слоев.

  • imageInputLayer входной слой нейронной сети.

  • fullyConnectedLayer умножает вход на матрицу веса и затем добавляет вектор смещения.

  • reluLayer функция активации нейронной сети.

  • tanhLayer ограничивает значение к области значений к [-1,1].

  • scalingLayer масштабирует значение к области значений к [-3,3].

  • regressionLayer задает функцию потерь нейронной сети.

Создайте глубокую нейронную сеть, которая будет подражать контроллеру NLMPC после обучения.

numObservations = numCol-2;
numActions = 2;
hiddenLayerSize = 256;

imitateMPCNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc4')
    reluLayer('Name','relu4')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc5')
    reluLayer('Name','relu5')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc6')
    reluLayer('Name','relu6')    
    fullyConnectedLayer(numActions,'Name','fcLast')
    tanhLayer('Name','tanhLast')
    scalingLayer('Name','ActorScaling','Scale',umax)
    regressionLayer('Name','routput')];

Постройте сеть.

plot(layerGraph(imitateMPCNetwork))

Подход клонирования поведения

Один подход к изучению опытной политики с помощью контролируемого изучения является методом клонирования поведения. Этот метод делит опытные демонстрации (действия управления NLMPC в ответ на наблюдения) в пары состояния активности и применяет контролируемое обучение обучить сеть.

Задайте опции обучения.

% intialize validation cell array
validationCellArray = {0,0};

options = trainingOptions('adam', ...
    'Verbose', false, ...
    'Plots', 'training-progress', ...
    'Shuffle', 'every-epoch', ...
    'MiniBatchSize', 512, ...
    'ValidationData', validationCellArray, ...
    'InitialLearnRate', 1e-3, ...
    'ExecutionEnvironment', 'cpu', ...
    'GradientThreshold', 10, ...
    'MaxEpochs', 40 ...
    );

Можно обучить поведение, клонирующее нейронную сеть следующим ниже шагов

  1. Соберите данные с помощью collectDataImFlyingRobot функция.

  2. Обучите сеть клонирования поведения использование behaviorCloningTrainNetwork функция.

Обучение DNN является в вычислительном отношении интенсивным процессом. Чтобы сэкономить время, загрузите предварительно обученный объект нейронной сети.

load('behaviorCloningMPCImDNNObject.mat');
imitateMPCNetBehaviorCloningObj = behaviorCloningNNObj.imitateMPCNetObj;

Обучение DNN использование клонирования поведения уменьшает разрыв между DNN и эффективностью NLMPC. Однако поведению, клонирующему нейронную сеть, не удается подражать поведению контроллера NLMPC правильно на некоторых случайным образом сгенерированных данных.

Подход агрегации данных

Чтобы улучшать производительность DNN, можно изучить политику с помощью интерактивного метода демонстранта. Крестик является итерационным методом, куда DNN запущен в среде с обратной связью. Эксперт, в этом случае диспетчер NLMPC, выходные действия на основе состояний посещает DNN. Этим способом больше обучающих данных агрегировано, и DNN переобучен для улучшенной производительности. Для получения дополнительной информации см. [1].

Обучите глубокую нейронную сеть с помощью DAggerTrainNetwork функция. Это создает DAggerImFlyingRobotDNNObj.mat файл, который содержит следующую информацию.

  • DatasetPath: путь, где набор данных, соответствующий каждой итерации, хранится

  • policyObjs: политики, которые были обучены в каждой итерации

  • finalData: общие обучающие данные собраны до итоговой итерации

  • finalPolicy: лучшая политика среди всех собранных политик

Во-первых, создайте и инициализируйте параметры для обучения. Используйте сеть, обученную с помощью клонирования поведения (imitateMPCNetBehaviorCloningObj) как начальная точка для обучения Крестика.

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

Чтобы сэкономить время, загрузите предварительно обученную нейронную сеть установкой doTraining к false. Чтобы обучить Крестик самостоятельно, установите doTraining к true.

doTraining = false;

if doTraining
    DAgger = DAggerTrainNetwork(nlmpcStruct,dataStruct,neuralNetStruct,tuningParamsStruct);
else
    load('DAggerImFlyingRobotDNNObj.mat');
end
DNN = DAgger.finalPolicy;

Как альтернатива, можно обучить нейронную сеть с модифицированным правилом обновления политики с помощью DAggerModifiedTrainNetwork функция. В этой функции, после каждых 20 учебных итераций, DNN установлен в самую оптимальную настройку от предыдущих 20 итераций. Чтобы запустить этот пример с объектом нейронной сети с модифицированным подходом Крестика, используйте DAggerModifiedImFlyingRobotDNNObj.mat file.

Сравните обучил сеть крестика с контроллером NLMPC

Чтобы сравнить эффективность контроллера NLMPC и обученного DNN, запустите симуляции с обратной связью с летающей моделью робота.

Установите начальное условие для состояний летающего робота (x, y, θ, x˙, y˙, θ˙) и контрольные переменные летающего робота (ul, ur).

x0 = [-1.8200    0.5300   -2.3500    1.1700   -1.0400    0.3100]';
u0 = [-2.1800   -2.6200]';

Запустите симуляцию с обратной связью контроллера NLMPC.

% Duration
Tf = 15;
% Sample time
Ts = nlobj.Ts;
% Simulation steps
Tsteps = Tf/Ts+1;
% Run NLMPC in closed loop.
tic
[xHistoryMPC,uHistoryMPC] = simModelMPCImFlyingRobot(x0,u0,nlobj,Tf);
toc
Elapsed time is 127.805198 seconds.

Запустите симуляцию с обратной связью обученной сети DAgger.

tic
[xHistoryDNN,uHistoryDNN] = simModelDAggerImFlyingRobot(x0,u0,DNN,Ts,Tf);
toc
Elapsed time is 3.690874 seconds.

Постройте результаты и сравните NLMPC и обученные траектории DNN.

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

Нейронная сеть Крестика успешно подражает поведению контроллера NLMPC. Летающие состояния робота и траектории действия управления для контроллера и глубокой нейронной сети Крестика практически ориентированы. Время симуляции с обратной связью для DNN значительно меньше времени симуляции контроллера NLMPC.

Анимируйте летающего робота с обученной сетью крестика

Чтобы подтвердить эффективность обученного DNN, анимируйте летающего робота с данными из симуляции с обратной связью DNN. Летающий робот приземляется в начале координат успешно.

Lx = 5;
Ly = 5;
for 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,theta,tL,tR,Lx,Ly);
    pause(0.05);
end

% Turn on MPC messages
mpcverbosity on;

Ссылки

[1] Osa, Такаюки, Джони Пэджэринен, Герхард Нейман, Дж. Эндрю Бэгнелл, Питер Аббеель и Ян Питерс. ‘Алгоритмический Взгляд на Изучение Имитации’. Основы и Тренды в Робототехнике 7, № 1-2 (2018): 1–179. https://doi.org/10.1561/2300000053.

Смотрите также

|

Похожие темы