exponenta event banner

Имитация контроллера MPC для помощи по поддержанию полосы движения

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

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

Если обучение сети достаточно пересекает состояние-пространство для приложения, можно создать разумное приближение поведения контроллера. Затем можно развернуть сеть для приложения управления. Сеть также можно использовать в качестве начальной точки для обучения актерской сети агента обучения усилению. Пример см. в разделе Подготовка агента DDPG с предварительно обученной сетью акторов.

Проектирование контроллера MPC

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

[sys,Vx] = createModelForMPCImLKA;

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

[mpcobj,initialState] = createMPCobjImLKA(sys);

Дополнительные сведения о проектировании модельных контроллеров прогнозирования для приложений помощи в сохранении полосы движения см. в разделах Система помощи в сохранении полосы движения с использованием управления прогнозом модели (панель инструментов управления прогнозом модели) и Помощь в сохранении полосы движения с обнаружением полосы движения (панель инструментов управления прогнозом модели).

Подготовка входных данных

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

  1. Поперечная скорость Vy

  2. Скорость угла рыскания r

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

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

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

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

  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);

Обучение глубокой нейронной сети прекращается после окончательной итерации.

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

Тестовая обучаемая сеть

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

predictedTestDataOutput = predict(imitateMPCNetObj,testDataInput);

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

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

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

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

Для сравнения производительности контроллера MPC и обученной глубокой нейронной сети выполните моделирование по замкнутому контуру с использованием модели завода транспортного средства.

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

  1. Поперечная скорость Vy - диапазон (-2,2) м/с

  2. Скорость угла рыскания r - Диапазон (-60,60) град/с

  3. Боковое отклонение e1 - Диапазон (-1,1) м

  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-контроллера. Состояние транспортного средства и траектории управляющих действий для контроллера и глубокой нейронной сети тесно согласуются.

См. также

| | (Панель управления прогнозом модели)

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