Этот пример использует обучение с подкреплением на основе глубокой детерминированной политики (DDPG) для разработки стратегии для мобильного робота, чтобы избежать препятствий. Краткие сводные данные алгоритма DDPG смотрите в Deep Deterministic Policy Gradient Agents (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));
Действие агента является двумерным вектором где и линейные и угловые скорости нашего робота. Агент 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
Создайте модель окружения, которая принимает действие и выдает сигналы наблюдения и вознаграждения. Укажите предоставленный пример модели, ex ampleHelperAvoidObstaclesMobileRobot
, параметры времени симуляции и имя блока агента.
mdl = "exampleHelperAvoidObstaclesMobileRobot"; Tfinal = 100; sampleTime = 0.1; agentBlk = mdl + "/Agent";
Откройте модель.
open_system(mdl)
Модель содержит Environment
и Agent
блоки. The 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
(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 аппроксимирует долгосрочное вознаграждение, заданное наблюдениями и действиями, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают Политику и Представления Функции Ценности (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);
Укажите опции агента.
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
объект. The obstacleAvoidanceAgent
переменная используется в модели для Agent
блок.
obstacleAvoidanceAgent = rlDDPGAgent(actor,critic,agentOpts);
open_system(mdl + "/Agent")
Функция вознаграждения для агента моделируется как показано.
Агент вознаграждается, чтобы избежать ближайшего препятствия, которое минимизирует худший сценарий. Кроме того, агент получает положительное вознаграждение при более высоких линейных скоростях и отрицательное вознаграждение при более высоких угловых скоростях. Эта стратегия вознаграждения препятствует поведению агента в кругах. Настройка ваших вознаграждений является ключом к правильному обучению агента, поэтому ваши вознаграждения варьируются в зависимости от вашего приложения.
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции:
Обучайте на самое большее 10000
эпизоды с каждым эпизодом, длящимся самое большее maxSteps
временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и включите отображение командной строки (установите Verbose
опция true).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше 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