exponenta event banner

Имитация нелинейного 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.

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

  6. θ˙ - угловая скорость робота.

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

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

  9. ul * - тяга с левой стороны, вычисленная с помощью NLMPC

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

Данные в DAggerInputDataFileImFlyingRobot.mat создается путем вычисления управляющего действия NLMPC для случайным образом генерируемых состояний (x, y, start, , , θ˙) и предыдущих управляющих действий (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 переучивается для повышения эффективности. Для получения дополнительной информации см. [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, start, , , θ˙) и управляющих переменных летающего робота (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] Оса, Такаюки, Джони Пажаринен, Герхард Нойман, Дж. Эндрю Баньелл, Питер Аббил и Ян Питерс. «Алгоритмическая перспектива имитационного обучения». Основы и тенденции в робототехнике 7, № 1-2 (2018): 1-179. https://doi.org/10.1561/2300000053.

См. также

|

Связанные темы