Избегайте Препятствий с помощью Обучения с подкреплением для Мобильных Роботов

Этот пример использует основанное на Глубоко детерминированном градиенте политики (DDPG) обучение с подкреплением, чтобы разработать стратегию для мобильного робота, чтобы избежать препятствий. Для краткого обзора алгоритма DDPG смотрите Глубоко Детерминированных Агентов Градиента политики (Reinforcement Learning Toolbox).

Этот сценарий в качестве примера обучает мобильного робота избегать препятствий, данных показания датчика области значений, которые обнаруживают препятствия в карте. Цель алгоритма обучения с подкреплением состоит в том, чтобы изучить, какие средства управления (линейный и скорость вращения), робот должен использовать, чтобы не сталкиваться в препятствия. Этот пример использует карту заполнения известной среды, чтобы сгенерировать показания датчика области значений, обнаружить препятствия и столкновения проверки, которые может сделать робот. Показания датчика области значений являются наблюдениями для агента DDPG, и линейные средства управления и средства управления скоростью вращения являются действием.

Карта

Загрузите матрицу карты, simpleMap, это представляет среду для робота.

load exampleMaps simpleMap 
load exampleHelperOfficeAreaMap office_area_map
mapMatrix = simpleMap;
mapScale = 1;

Параметры датчика области значений

Затем настройте rangeSensor объект, который симулирует шумный датчик области значений. Показания датчика области значений рассматриваются наблюдениями агентом. Задайте угловые положения показаний области значений, макс. области значений и шумовых параметров.

scanAngles = [-3*pi/8 : pi/8 :3*pi/8];
maxRange = 12;
lidarNoiseVariance = 0.1^2;
lidarNoiseSeeds = randi(intmax,size(scanAngles));

Параметры робота

Действие агента является двумерным вектором a=[v,ω] где v и ω линейное и скорости вращения нашего робота. Использование агента DDPG нормировало входные параметры и для угловых и для линейных скоростей, означая, что действия агента являются скаляром между-1 и 1, который умножается на maxLinSpeed и maxAngSpeed параметры, чтобы получить фактический контроль. Задайте этот линейный максимум и скорость вращения.

Кроме того, задайте исходное положение робота как [x y theta].

% Max speed parameters
maxLinSpeed = 0.3;
maxAngSpeed = 0.3;

% Initial pose of the robot
initX = 17;
initY = 15;
initTheta = pi/2;

Визуализация

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

fig = figure("Name","simpleMap");
set(fig, "Visible", "on");
ax = axes(fig);

show(binaryOccupancyMap(mapMatrix),"Parent",ax);
hold on
plotTransforms([initX, initY, 0], eul2quat([initTheta, 0, 0]), "MeshFilePath","groundvehicle.stl", "View", "2D");
light;
hold off

Интерфейс среды

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

mdl = "exampleHelperAvoidObstaclesMobileRobot";
Tfinal = 100;
sampleTime = 0.1;

agentBlk = mdl + "/Agent";

Откройте модель.

open_system(mdl)

Модель содержит Environment и Agent блоки. Agent блок еще не задан.

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

open_system(mdl + "/Environment")

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

obsInfo = rlNumericSpec([numel(scanAngles) 1],...
    "LowerLimit",zeros(numel(scanAngles),1),...
    "UpperLimit",ones(numel(scanAngles),1)*maxRange);
numObservations = obsInfo.Dimension(1);

Задайте параметры действия, actInfo. Действие является коммандным вектором управления, a=[v,ω], нормированный к [-1,1].

numActions = 2;
actInfo = rlNumericSpec([numActions 1],...
    "LowerLimit",-1,...
    "UpperLimit",1);

Создайте объект интерфейса среды с помощью rlSimulinkEnv (Reinforcement Learning Toolbox). Задайте модель, имя блока агента, параметры наблюдения и параметры действия. Установите функцию сброса для симуляции с помощью exampleHelperRLAvoidObstaclesResetFcn. Эта функция перезапускает симуляцию путем размещения робота в новое случайное местоположение, чтобы начать избегать препятствий.

env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);
env.ResetFcn = @(in)exampleHelperRLAvoidObstaclesResetFcn(in,scanAngles,maxRange,mapMatrix);
env.UseFastRestart = "Off";

Для другого примера, который настраивает среду Simulink® для обучения, смотрите, Создают окружение Simulink и Обучают Агента (Reinforcement Learning Toolbox).

Агент DDPG

Агент DDPG аппроксимирует долгосрочные премиальные заданные наблюдения и действия с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают политику и Представления Функции ценности (Reinforcement Learning Toolbox).

statePath = [
    featureInputLayer(numObservations, "Normalization", "none", "Name", "State")
    fullyConnectedLayer(50, "Name", "CriticStateFC1")
    reluLayer("Name", "CriticRelu1")
    fullyConnectedLayer(25, "Name", "CriticStateFC2")];
actionPath = [
    featureInputLayer(numActions, "Normalization", "none", "Name", "Action")
    fullyConnectedLayer(25, "Name", "CriticActionFC1")];
commonPath = [
    additionLayer(2,"Name", "add")
    reluLayer("Name","CriticCommonRelu")
    fullyConnectedLayer(1, "Name", "CriticOutput")];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,"CriticStateFC2","add/in1");
criticNetwork = connectLayers(criticNetwork,"CriticActionFC1","add/in2");

Затем задайте опции для представления критика с помощью rlRepresentationOptions (Reinforcement Learning Toolbox).

Наконец, создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать действие и спецификации наблюдений для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation (Reinforcement Learning Toolbox).

criticOpts = rlRepresentationOptions("LearnRate",1e-3,"L2RegularizationFactor",1e-4,"GradientThreshold",1);
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},criticOpts);

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

Наконец, создайте агента подобным образом как критика. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation (Reinforcement Learning Toolbox).

actorNetwork = [
    featureInputLayer(numObservations, "Normalization", "none", "Name", "State")
    fullyConnectedLayer(50, "Name", "actorFC1")
    reluLayer("Name","actorReLU1")
    fullyConnectedLayer(50, "Name", "actorFC2")
    reluLayer("Name","actorReLU2")
    fullyConnectedLayer(2, "Name", "actorFC3")
    tanhLayer("Name", "Action")];


actorOptions = rlRepresentationOptions("LearnRate",1e-4,"L2RegularizationFactor",1e-4,"GradientThreshold",1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},actorOptions);

Создайте объект агента DDPG

Задайте опции агента.

agentOpts = rlDDPGAgentOptions(...
    "SampleTime",sampleTime,...
    "TargetSmoothFactor",1e-3,...
    "DiscountFactor",0.995, ...
    "MiniBatchSize",128, ...
    "ExperienceBufferLength",1e6); 

agentOpts.NoiseOptions.Variance = 0.1;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;

Создайте rlDDPGAgent объект. obstacleAvoidanceAgent переменная используется в модели для Agent блок.

obstacleAvoidanceAgent = rlDDPGAgent(actor,critic,agentOpts);
open_system(mdl + "/Agent")

Вознаграждение

Премиальная функция для агента моделируется как показано.

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

Обучите агента

Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:

  • Обучайтесь для в большей части 10000 эпизоды, с каждым эпизодом, длящимся в большей части maxSteps временные шаги.

  • Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots опция), и включают отображение командной строки (установите Verbose опция к истине).

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 400 более чем пятьдесят последовательных эпизодов.

Для получения дополнительной информации смотрите rlTrainingOptions (Reinforcement Learning Toolbox).

maxEpisodes = 10000;
maxSteps = ceil(Tfinal/sampleTime);
trainOpts = rlTrainingOptions(...
    "MaxEpisodes",maxEpisodes, ...
    "MaxStepsPerEpisode",maxSteps, ...
    "ScoreAveragingWindowLength",50, ...
    "StopTrainingCriteria","AverageReward", ...
    "StopTrainingValue",400, ...
    "Verbose", true, ...
    "Plots","training-progress");

Обучите агента с помощью train (Reinforcement Learning Toolbox) функция. Обучение является в вычислительном отношении интенсивным процессом, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining к false. Чтобы обучить агента самостоятельно, установите doTraining к true.

doTraining = false; % Toggle this to true for training. 

if doTraining
    % Train the agent.
    trainingStats = train(obstacleAvoidanceAgent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load exampleHelperAvoidObstaclesAgent obstacleAvoidanceAgent
end

Менеджер по Эпизоду Обучения с подкреплением может использоваться, чтобы отследить мудрый эпизодом процесс обучения. Когда номер эпизода увеличивается, вы хотите видеть увеличение премиального значения.

Симулировать

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

out = sim("exampleHelperAvoidObstaclesMobileRobot.slx");

Визуализация

Чтобы визуализировать симуляцию управления робота вокруг среды с показаниями датчика области значений, используйте помощника, exampleHelperAvoidObstaclesPosePlot.

for i = 1:5:size(out.range, 3)
    u = out.pose(i, :);
    r = out.range(:, :, i);
    exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);
end

Расширяемость

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

Измените карту

mapMatrix = office_area_map.occupancyMatrix > 0.5;
mapScale = 10;
initX = 20;
initY = 30;
initTheta = 0;
fig = figure("Name","office_area_map");
set(fig, "Visible", "on");
ax = axes(fig);
show(binaryOccupancyMap(mapMatrix, mapScale),"Parent",ax);
hold on
plotTransforms([initX, initY, 0], eul2quat([initTheta, 0, 0]), "MeshFilePath","groundvehicle.stl", "View", "2D");
light;
hold off

Симулировать

out = sim("exampleHelperAvoidObstaclesMobileRobot.slx");

Визуализировать

for i = 1:5:size(out.range, 3)
    u = out.pose(i, :);
    r = out.range(:, :, i);
    exampleHelperAvoidObstaclesPosePlot(u, mapMatrix, mapScale, r, scanAngles, ax);
end

Для просмотра документации необходимо авторизоваться на сайте