Подражайте контроллер MPC для маршрута сохраняют, помогают

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

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

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

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

Проект контроллер MPC для хранения маршрута помогает. Для этого сначала создайте динамическую модель для транспортного средства.

[sys,Vx] = createModelForMPCImLKA;

Создайте и спроектируйте контроллер MPC объект mpcobj. Кроме того, создайте mpcstate объект для установки начального состояния контроллера. Для получения дополнительной информации на проектировании контроллера, введите edit createMPCobjImLKA.

[mpcobj,initialState] = createMPCobjImLKA(sys);

Для получения дополнительной информации о разработке прогнозирующих контроллеров модели для хранения маршрута помогают приложениям, видят, что Маршрут Сохранить Помогает Системе Используя Прогнозирующее Управление Модели (Model Predictive Control Toolbox), и Хранение Маршрута Помогают с Обнаружением Маршрута (Model Predictive Control Toolbox).

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

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

  1. Боковая скорость Vy

  2. Угловой уровень отклонения от курса r

  3. Боковое отклонение e1

  4. Относительный угол отклонения от курса e2

  5. Предыдущий руководящий угол (контрольная переменная) u

  6. Измеренное воздействие (дорожный уровень отклонения от курса: продольная скорость * искривление (ρ))

  7. Значение функции стоимости

  8. Итерации MPC

  9. Регулирование угла, вычисленного контроллером MPC: u*

Данные в InputDataFileImLKA.mat был создан путем вычисления действия MPC управления для случайным образом сгенерированных состояний, предыдущих действий управления и измеренных воздействий. Чтобы сгенерировать ваши собственные обучающие данные, используйте collectDataImLKA функция.

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

dataStruct = load('InputDataFileImLKA.mat');
data = dataStruct.Data;

Разделите входные данные на обучение, валидацию и данные о тестировании. Во-первых, определите количество строк данных о валидации на основе данного процента.

totalRows = size(data,1);
validationSplitPercent = 0.1;
numValidationDataRows = floor(validationSplitPercent*totalRows);

Определите количество строк тестовых данных на основе данного процента.

testSplitPercent = 0.05;
numTestDataRows = floor(testSplitPercent*totalRows);

Случайным образом извлеките данные о валидации и тестировании из набора входных данных. Для этого сначала случайным образом извлеките достаточно строк для обоих наборов данных.

randomIdx = randperm(totalRows,numValidationDataRows + numTestDataRows);
randomData = data(randomIdx,:);

Разделите случайные данные на данные о валидации и тестировании.

validationData = randomData(1:numValidationDataRows,:);
testData = randomData(numValidationDataRows + 1:end,:);

Извлеките остающиеся строки как обучающие данные.

trainDataIdx = setdiff(1:totalRows,randomIdx);
trainData = data(trainDataIdx,:);

Рандомизируйте обучающие данные.

numTrainDataRows = size(trainData,1);
shuffleIdx = randperm(numTrainDataRows);
shuffledTrainData = trainData(shuffleIdx,:);

Измените данные об обучении и валидации в 4-D матрицы, которые будут использоваться с trainNetwork.

numObservations = 6; 
numActions = 1;

trainInput = reshape(shuffledTrainData(:,1:6)',[numObservations 1 1 numTrainDataRows]);
trainOutput = reshape(shuffledTrainData(:,9)',[numActions 1 1 numTrainDataRows]);

validationInput = reshape(validationData(:,1:6)',[numObservations 1 1 numValidationDataRows]);
validationOutput = reshape(validationData(:,9)',[numActions 1 1 numValidationDataRows]);
validationCellArray = {validationInput,validationOutput};

Измените данные о тестировании, которые будут использоваться с predict.

testDataInput = reshape(testData(:,1:6)',[numObservations 1 1 numTestDataRows]);
testDataOutput = testData(:,9);

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

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

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

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

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

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

  • scalingLayer масштабирует значение к области значений к [-1.04,1.04], подразумевает, что держащийся угол ограничивается быть [-60,60] степени.

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

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

imitateMPCNetwork = [
    imageInputLayer([numObservations 1 1],'Normalization','none','Name','InputLayer')    
    fullyConnectedLayer(45,'Name','Fc1')
    reluLayer('Name','Relu1')
    fullyConnectedLayer(45,'Name','Fc2')
    reluLayer('Name','Relu2')    
    fullyConnectedLayer(45,'Name','Fc3')
    reluLayer('Name','Relu3')     
    fullyConnectedLayer(numActions,'Name','OutputLayer')
    tanhLayer('Name','Tanh1')    
    scalingLayer('Name','Scale1','Scale',1.04)    
    regressionLayer('Name','RegressionOutput')
];

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

plot(layerGraph(imitateMPCNetwork))

Обучите глубокую нейронную сеть

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

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

Обучите глубокую нейронную сеть. Чтобы просмотреть подробную учебную информацию в Командном окне, можно установить 'Verbose' опция обучения к true.

imitateMPCNetObj = trainNetwork(trainInput,trainOutput,imitateMPCNetwork,options);

Обучение глубокой нейронной сети останавливается, когда это достигает итоговой итерации.

Потеря обучения и валидации является почти тем же самым для каждого мини-пакета, указывающего, что обучивший сеть не является сверхподходящим.

Тест обучил сеть

Проверяйте, что обученная глубокая нейронная сеть возвращает держащиеся углы, похожие на контроллер MPC действия управления, учитывая данные о тестовом воздействии. Вычислите сетевой выход с помощью predict функция.

predictedTestDataOutput = predict(imitateMPCNetObj,testDataInput);

Вычислите среднеквадратическую ошибку между сетевым выходом и данными о тестировании.

testRMSE = sqrt(mean((testDataOutput - predictedTestDataOutput).^2));
fprintf('Test Data RMSE = %d\n', testRMSE);
Test Data RMSE = 3.195943e-02

Маленькое значение RMSE указывает, что сетевые выходные параметры тесно воспроизводят контроллер MPC выходные параметры.

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

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

Сгенерируйте случайные начальные условия для транспортного средства, которые не являются частью исходного набора входных данных со значениями, выбранными из следующих областей значений:

  1. боковая скорость Vy : область значений (-2,2) m/s

  2. угловой уровень отклонения от курса r : область значений (-60,60) градус/с

  3. боковое отклонение e1 : область значений (-1,1) m

  4. относительный угол отклонения от курса e2 : область значений (-45,45) градус

  5. в последний раз регулирование угла (контрольная переменная) u : область значений (-60,60) градус

  6. измеренное воздействие (дорожный уровень отклонения от курса: продольная скорость * искривление (ρ)): область значений (-0.01,0.01), минимальный дорожный радиус: 100 м.

rng(5e7)
[x0,u0,rho] = generateRandomDataImLKA(data);

Установите начальное состояние объекта и управляйте действием в mpcstate объект.

initialState.Plant = x0;
initialState.LastMove = u0;

Извлеките шаг расчета от диспетчера MPC. Кроме того, определите номер шагов симуляции.

Ts = mpcobj.Ts;
Tsteps = 30;     

Получите A и B матрицы пространства состояний для модели транспортного средства.

A = sys.A;
B = sys.B;

Инициализируйте состояние и введите траектории для контроллера MPC симуляция.

xHistoryMPC = repmat(x0',Tsteps+1,1);
uHistoryMPC = repmat(u0',Tsteps,1);

Запустите симуляцию с обратной связью контроллера MPC и объекта с помощью mpcmove функция.

for k = 1:Tsteps
    % Obtain plant output measurements, which correspond to the plant outputs.
    xk = xHistoryMPC(k,:)';
    % Compute the next cotnrol action using the MPC controller.
    uk = mpcmove(mpcobj,initialState,xk,zeros(1,4),Vx*rho);
    % Store the control action.
    uHistoryMPC(k,:) = uk;
    % Update the state using the control action.
    xHistoryMPC(k+1,:) = (A*xk + B*[uk;Vx*rho])';
end

Инициализируйте состояние и введите траектории для симуляции глубокой нейронной сети.

xHistoryDNN = repmat(x0',Tsteps+1,1);
uHistoryDNN = repmat(u0',Tsteps,1);
lastMV = u0;

Запустите симуляцию с обратной связью обучившего сеть и объекта. neuralnetLKAmove функция вычисляет глубокую нейронную сеть выход с помощью predict функция.

for k = 1:Tsteps
    % Obtain plant output measurements, which correspond to the plant outputs.
    xk = xHistoryDNN(k,:)';
    % Predict the next move using the trained deep neural network.
    uk = neuralnetLKAmove(imitateMPCNetObj,xk,lastMV,rho);
    % Store the control action and update the last MV for the next step.
    uHistoryDNN(k,:) = uk;
    lastMV = uk;
    % Update the state using the control action.
    xHistoryDNN(k+1,:) = (A*xk + B*[uk;Vx*rho])';
end

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

plotValidationResultsImLKA(Ts,xHistoryDNN,uHistoryDNN,xHistoryMPC,uHistoryMPC);

Нейронная сеть успешно подражает поведению контроллера MPC. Состояние транспортного средства и траектории действия управления для контроллера и глубокой нейронной сети тесно выравниваются.

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте