Этот пример использует основанное на Глубоко детерминированном градиенте политики (DDPG) обучение с подкреплением, чтобы разработать стратегию для мобильного робота, чтобы избежать препятствий. Для краткого обзора алгоритма DDPG смотрите Глубоко Детерминированных Агентов Градиента политики (Reinforcement Learning Toolbox).
Этот сценарий в качестве примера обучает мобильного робота избегать препятствий, данных показания датчика области значений, которые обнаруживают препятствия в карте. Цель алгоритма обучения с подкреплением состоит в том, чтобы изучить, какие средства управления (линейный и скорость вращения), робот должен использовать, чтобы не сталкиваться в препятствия. Этот пример использует карту заполнения известной среды, чтобы сгенерировать показания датчика области значений, обнаружить препятствия и столкновения проверки, которые может сделать робот. Показания датчика области значений являются наблюдениями для агента DDPG, и линейные средства управления и средства управления скоростью вращения являются действием.
Загрузите матрицу карты, simpleMap
, это представляет среду для робота.
load exampleMaps simpleMap 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));
Действие агента является двумерным вектором где и линейное и скорости вращения нашего робота. Использование агента 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
, similation параметры времени и имя блока агента.
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
. Действие является коммандным вектором управления, , нормированный к .
numActions = 2; actInfo = rlNumericSpec([numActions 1],... "LowerLimit",-1,... "UpperLimit",1);
Создайте объект интерфейса среды с помощью rlSimulinkEnv
. Задайте модель, имя блока агента, параметры наблюдения и параметры действия. Установите функцию сброса для симуляции с помощью exampleHelperRLAvoidObstaclesResetFcn
. Эта функция перезапускает симуляцию путем размещения робота в новое случайное местоположение, чтобы начать избегать препятствий.
env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);
env.ResetFcn = @(in)exampleHelperRLAvoidObstaclesResetFcn(in,scanAngles,maxRange,mapMatrix);
env.UseFastRestart = "Off";
Для другого примера, который настраивает среду Simulink® для обучения, смотрите, Создают окружение Simulink и Обучают Агента (Reinforcement Learning Toolbox).
Агент DDPG аппроксимирует долгосрочные премиальные заданные наблюдения и действия с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают политику и Представления Функции ценности (Reinforcement Learning Toolbox).
statePath = [ imageInputLayer([numObservations 1 1], "Normalization", "none", "Name", "State") fullyConnectedLayer(50, "Name", "CriticStateFC1") reluLayer("Name", "CriticRelu1") fullyConnectedLayer(25, "Name", "CriticStateFC2")]; actionPath = [ imageInputLayer([numActions 1 1], "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
.
Наконец, создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать действие и спецификации наблюдений для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation
.
criticOpts = rlRepresentationOptions("LearnRate",1e-3,"L2RegularizationFactor",1e-4,"GradientThreshold",1); critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},criticOpts);
Агент DDPG решает который действие взять заданные наблюдения с помощью представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.
Наконец, создайте агента подобным образом как критика. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ imageInputLayer([numObservations 1 1], "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);
Задайте опции агента.
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
.
maxEpisodes = 10000; maxSteps = ceil(Tfinal/sampleTime); trainOpts = rlTrainingOptions(... "MaxEpisodes",maxEpisodes, ... "MaxStepsPerEpisode",maxSteps, ... "ScoreAveragingWindowLength",50, ... "StopTrainingCriteria","AverageReward", ... "StopTrainingValue",400, ... "Verbose", true, ... "Plots","training-progress");
Обучите агента с помощью train
функция. Обучение является в вычислительном отношении интенсивным процессом, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой 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