Подражайте контроллер 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 = shuffledTrainData(:,1:6);
trainOutput = shuffledTrainData(:,9);

validationInput = validationData(:,1:6);
validationOutput = validationData(:,9);
validationCellArray = {validationInput,validationOutput};

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

testDataInput = testData(:,1:6);
testDataOutput = testData(:,9);

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

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

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

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

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

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

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

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

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

imitateMPCNetwork = [
    featureInputLayer(numObservations,'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);

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

testRMSE = sqrt(mean((testDataOutput - predictedTestDataOutput).^2));
fprintf('Test Data RMSE = %d\n', testRMSE);
Test Data RMSE = 3.200035e-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. Состояние транспортного средства и траектории действия управления для контроллера и глубокой нейронной сети практически ориентированы.

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

| | (Model Predictive Control Toolbox)

Похожие темы