Обучите агента RL для помощи в поддержании маршрута с ограничениями

В этом примере показано, как обучить агента обучения с подкреплением (RL) для помощника по хранению маршрута (LKA) с ограничениями, применяемыми с помощью блока с ограничениями.

Обзор

В этом примере цель состоит в том, чтобы сохранить автомобиль , оборудованный датчиком, перемещающийся по осевой линии маршрута, путем регулировки угла поворота переднего руля. Этот пример использует ту же модель и параметры транспортного средства, что и пример Train DQN Agent for Lane Keeping Assist Using Parallel Computing (Reinforcement Learning Toolbox).

Установите случайный seed и сконфигурируйте параметры модели.

% set random seed
rng(0);
% paramters
m = 1575;           % total vehicle mass (kg)
Iz = 2875;          % yaw moment of inertia (mNs^2)
lf = 1.2;           % longitudinal distance from center of gravity to front tires (m)
lr = 1.6;           % longitudinal distance from center of gravity to rear tires (m)
Cf = 19000;         % cornering stiffness of front tires (N/rad)
Cr = 33000;         % cornering stiffness of rear tires (N/rad)
Vx = 15;            % longitudinal velocity (m/s)
Ts = 0.1;           % sample time (s)
T = 15;             % duration (s)
rho = 0.001;        % road curvature (1/m)
e1_initial = 0.2;   % initial lateral deviation from center line (m)
e2_initial = -0.1;  % initial yaw angle error (rad)
steerLimit = 0.2618;% maximum steering angle for driver comfort (rad)

Создайте окружение и агент для сбора данных

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

Для этого сначала создайте окружение RL с помощью rlLearnConstraintLKA модель. Эта модель применяет случайные внешние действия через блок Агент к окружению.

mdl = 'rlLearnConstraintLKA';
open_system(mdl)

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

obsInfo = rlNumericSpec([6 1]);

Действие от блока RL Agent является углом рулевого управления спереди, который может взять одно из 31 возможных значений от -15 до 15 степеней. Создайте дискретное пространство действий для этого сигнала.

actInfo = rlFiniteSetSpec((-15:15)*pi/180);

Создайте окружение RL для этой модели.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);

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

env.ResetFcn = @(in)localResetFcn(in);

Затем создайте агента обучения с подкреплением DQN, который поддерживает дискретные действия и непрерывные наблюдения, используя createDQNAgentLKA вспомогательная функция. Эта функция создает представление критика на основе действия и спецификаций наблюдений и использует представление для создания агента DQN.

agent = createDQNAgentLKA(Ts,obsInfo,actInfo);

В rlLearnConstraintLKA модель, блок Агент не генерирует действия. Вместо этого он сконфигурирован для передачи случайного внешнего действия в окружение. Цель использования модели сбора данных с неактивным блоком RL Agent состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.

Изучение функции ограничения

В этом примере сигнал безопасности является боковым отклонением e1. Ограничение для этого сигнала является -1e11; то есть расстояние от осевой линии маршрута должно быть меньше 1. Ограничение зависит от состояний в x: боковое отклонение и его производная, ошибка угла рыскания и его производная. Действие u - передний угол рулевого управления. Отношения от состояний к боковому отклонению описываются следующим уравнением.

e1(k+1)=f(xk)+g(xk)uk

Чтобы позволить некоторое ослабление, установите максимальное боковое расстояние равным 0,9.

Блок Constraint Enforcement принимает ограничения формы fx+gxuc . Для вышеприведенного уравнения и ограничений коэффициенты ограничительной функции:

fx=[f(xk)-f(xk)],gx=[g(xk)-g(xk)],c=[0.90.9]

Чтобы узнать неизвестные функции fx и gxагент RL передает случайное внешнее действие окружению, которая равномерно распределена в области значений [-0.2618,0.2618].

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

  • Интеграл бокового отклонения

  • Боковое отклонение

  • Интеграл ошибки угла рыскания

  • Ошибка угла рыскания

  • Производная от бокового отклонения

  • Производная ошибки угла рыскания

  • Угол поворота руля

  • Боковое отклонение на следующем временном шаге

В данном примере загружает предварительно собранные обучающие данные. Чтобы собрать данные самостоятельно, установите collectData на true.

collectData = false;
if collectData
    count = 1050;
    data = collectDataLKA(env,agent,count);
else
    load trainingDataLKA data
end

В данном примере динамика эго-автомобиля линейная. Поэтому можно найти решение методом наименьших квадратов для ограничений бокового отклонения.

Линейные приближения могут быть применены, чтобы узнать неизвестные функции fx и gx.

% Extract state and input data.
inputData = data(1:1000,[2,5,4,6,7]);
% Extract data for the lateral deviation in the next time step.
outputData = data(1:1000,8); 
% Compute the relation from the state and input to the lateral deviation.
relation = inputData\outputData;
% Extract the components of the constraint function coefficients.
Rf = relation(1:4)';
Rg = relation(5);

Проверьте выученные ограничения с помощью validateConstraintACC вспомогательная функция. Эта функция обрабатывает входные обучающие данные, используя выученные ограничения. Затем он сравнивает вывод сети с выходом обучения и вычисляет корневую среднеквадратичную ошибку (RMSE).

validateConstraintLKA(data,Rf,Rg);
Test Data RMSE = 8.569169e-04

Маленькое значение RMSE указывает на успешное обучение с ограничениями.

Обучите агента RL с ограничениями

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

mdl = 'rlLKAwithConstraint';
open_system(mdl)

Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь модель генерирует значения fi и gi от линейных ограничительных уравнений. Эти значения вместе с ограничениями отправляются в блок «Принудительное применение ограничений».

Создайте окружение RL с помощью этой модели. Спецификации действия те же, что и для окружения ограничения-обучения.

Подсистема Окружения создает isDone сигнал, который true когда боковое отклонение превышает заданное ограничение. Блок Агент использует этот сигнал для раннего завершения эпизодов тренировки.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Укажите опции для настройки агента. Обучите агента на самое большее 5000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает -1.

maxepisodes = 5000;
maxsteps = ceil(T/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',-1);

Обучите агента. Обучение является длительным процессом. В данном примере загружает предварительно обученный агент. Чтобы обучить агента самостоятельно, установите trainAgent на true.

trainAgent = false;
if trainAgent
    trainingStats = train(agent,env,trainingOpts);
else
    load rlAgentConstraintLKA agent
end

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

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

Запустите обученного агента и просмотрите результаты симуляции.

e1_initial = -0.4;
e2_initial = 0.2;
sim(mdl)

bdclose('rlLearnConstraintLKA')
bdclose('rlLKAwithConstraint')

Функция локального сброса

function in = localResetFcn(in)
% Set initial lateral deviation to random value.
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand));
% Set initial relative yaw angle to random value.
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand));
end

См. также

Блоки

Похожие темы