Обучайтесь агент RL для Хранения Маршрута Помогают с Ограничительным Осуществлением

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

Обзор

В этом примере цель состоит в том, чтобы сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрута путем корректировки переднего руководящего угла. Этот пример использует ту же модель транспортного средства и параметры, как Обучение Агента DQN для Хранения Маршрута Помогает Используя Параллельные вычисления (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 модель. Эта модель применяет случайные внешние действия через блок RL Agent к среде.

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 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 от линейных ограничительных отношений. Эти значения наряду с ограничительными границами отправляются в блок Constraint Enforcement.

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

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

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

Задайте опции для обучения агент. Обучите агента самое большее 5 000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает –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

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

Блоки

Похожие темы