Имитируйте нелинейный контроллер MPC для летающего робота

Этот пример показывает, как обучить, подтвердить и протестировать глубокую нейронную сеть (DNN), которая имитирует поведение нелинейного прогнозирующего контроллера модели для летающего робота. Затем он сравнивает поведение глубокой нейронной сети с поведением исходного контроллера. Чтобы обучить глубокую нейронную сеть, этот пример использует подход агрегирования данных (DAgger), как в [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))

Figure contains an axes. The axes contains an object of type graphplot.

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

Одним из подходов к изучению экспертной политики с использованием контролируемого обучения является метод клонирования поведения. Этот метод разделяет экспертные демонстрации (действия управления 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 можно научиться политике интерактивным методом демонстратора. DAgger является итерационным методом, где DNN запускается в окружении с обратной связью. Эксперт, в данном случае контроллер NLMPC, выводит действия на основе состояний, посещаемых DNN. Таким образом, больше обучающих данных агрегируется, и DNN переобучается для улучшенной производительности. Для получения дополнительной информации см. раздел [1].

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

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

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

  • finalData: общее количество обучающих данных, собранных до окончательной итерации

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

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

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

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

doTraining = false;

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

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

Сравнение обученной сети DAgger с контроллером 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 46.217801 seconds.

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

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

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

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

Figure contains 6 axes. Axes 1 with title x1 contains 2 objects of type line. These objects represent DNN, MPC. Axes 2 with title x2 contains 2 objects of type line. These objects represent DNN, MPC. Axes 3 with title theta contains 2 objects of type line. These objects represent DNN, MPC. Axes 4 with title v1 contains 2 objects of type line. These objects represent DNN, MPC. Axes 5 with title v2 contains 2 objects of type line. These objects represent DNN, MPC. Axes 6 with title omega contains 2 objects of type line. These objects represent DNN, MPC.

Figure contains 2 axes. Axes 1 with title Thrust T1 contains 2 objects of type stair. These objects represent DNN, MPC. Axes 2 with title Thrust T2 contains 2 objects of type stair. These objects represent DNN, MPC.

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

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

Чтобы подтвердить эффективность обученного 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

Figure Flying Robot Visualizer contains an axes. The axes contains 3 objects of type quiver, patch, line.

% Turn on MPC messages
mpcverbosity on;

Ссылки

[1] Osa, Takayuki, Joni Pajarinen, Gerhard Neumann, J. Andrew Bagnell, Pieter Abbeel, and Jan Peters. «Algorithmic Perspective on Imitation Learning». Основы и тренды в робототехнике 7, № 1-2 (2018): 1-179. https://doi.org/10.1561/2300000053.

См. также

|

Похожие темы