exponenta event banner

Подготовка агента RL для помощи по поддержанию полосы движения с применением ограничений

В этом примере показано, как обучить агента обучения усилению (RL) для помощи по поддержанию полосы движения (LKA) ограничениям, применяемым с помощью блока «Применение ограничений» (Constraint Enforcement).

Обзор

В этом примере цель заключается в удержании эго-транспортного средства, движущегося вдоль осевой линии полосы движения, путем регулировки угла поворота переднего рулевого управления. В этом примере используется та же модель транспортного средства и те же параметры, что и в примере "Train DQN Agent for Lane Keeping Assist Using Parallel Computing" ("Training DQN Agent for Lane Keeping Assist Using Parallel Computing

Задайте случайное начальное значение и настройте параметры модели.

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

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

В этом примере функция ограничения, выполняемая блоком «Применение ограничения», неизвестна. Для изучения функции необходимо сначала собрать данные обучения из среды.

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

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 не генерирует действия. Вместо этого он конфигурируется для передачи случайного внешнего действия в среду. Целью использования модели сбора данных с неактивным блоком агента RL является обеспечение соответствия модели среды, конфигураций сигналов действий и наблюдений и функции сброса модели, используемой во время сбора данных, тем, которые используются во время последующего обучения агента.

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

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

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

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

Блок «Применение ограничений» принимает ограничения fx+gxu≤c формы. Для вышеприведенного уравнения и ограничений коэффициенты функции ограничения:

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

Чтобы узнать неизвестные функции fx и gx, агент RL передает случайное внешнее действие в среду, которая равномерно распределена в диапазоне [-.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 с помощью этой модели. Характеристики наблюдения и действия те же, что и для среды обучения ограничениям.

Подсистема Environment создает isDone сигнал, который является true если боковое отклонение превышает заданное ограничение. Блок агента RL использует этот сигнал для раннего завершения обучающих эпизодов.

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

См. также

Блоки

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