В этом примере используется обучение усилению на основе Deep Deterministic Policy Gradient (DDPG) для разработки стратегии для мобильного робота, чтобы избежать препятствий. Краткое описание алгоритма DDPG см. в разделе Deep Deterministic Policy Gradient Agents (Enhancement 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));
Действие агента представляет собой двумерный вектор λ], где 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

Создайте модель среды, которая выполняет действие и выдает сигналы наблюдения и вознаграждения. Укажите предоставленное имя модели примера, напримерampleHelperAvoidObstaclesMobileRobot, параметры времени моделирования и имя блока агента.
mdl = "exampleHelperAvoidObstaclesMobileRobot"; Tfinal = 100; sampleTime = 0.1; agentBlk = mdl + "/Agent";
Откройте модель.
open_system(mdl)

Модель содержит Environment и Agent блоки. Agent блок еще не определен.
Внутри Environment Блок подсистемы, вы должны увидеть модель для моделирования робота и данных датчика. Подсистема выполняет действие, генерирует сигнал наблюдения на основе показаний датчика дальности и вычисляет вознаграждение на основе расстояния от препятствий и усилий команд действия.
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. Действие представляет собой управляющий командный вектор, λ], нормализованный 1,1].
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 и агента обучения (инструментарий обучения по усилению).
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдениям и действиям, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Дополнительные сведения о создании представления функции значений глубоких нейронных сетей см. в разделе Создание представлений функций политик и значений (панель обучения усилению).
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(Панель инструментов для обучения усилению).
Наконец, создайте критическое представление, используя заданную глубокую нейронную сеть и опции. Необходимо также указать параметры действий и наблюдения для критика, которые будут получены из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation(Панель инструментов для обучения усилению).
criticOpts = rlRepresentationOptions("LearnRate",1e-3,"L2RegularizationFactor",1e-4,"GradientThreshold",1); critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,"Observation",{'State'},"Action",{'Action'},criticOpts);
Агент DDPG решает, какое действие предпринять для данных наблюдений, используя представление актера. Чтобы создать актера, сначала создайте глубокую нейронную сеть с одним входом, наблюдением и одним выходом, действием.
Наконец, построить актера в такой же манере, как критик. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation(Панель инструментов для обучения усилению).
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 объект. obstacleAvoidanceAgent используется в модели для Agent блок.
obstacleAvoidanceAgent = rlDDPGAgent(actor,critic,agentOpts);
open_system(mdl + "/Agent")
Функция вознаграждения для агента смоделирована, как показано на рисунке.

Агент вознаграждается, чтобы избежать ближайшего препятствия, которое минимизирует наихудший сценарий. Дополнительно агент получает положительное вознаграждение за более высокие линейные скорости и отрицательное вознаграждение за более высокие угловые скорости. Эта стратегия поощрения отбивает поведение агента ходить в кругах. Настройка вознаграждения является ключом к правильному обучению агента, поэтому вознаграждение зависит от приложения.
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции:
Поезд максимум для 10000 эпизоды, причем каждый эпизод длится не более maxSteps временные шаги.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и включите отображение командной строки (установите Verbose значение true).
Прекратите обучение, когда агент получит среднее совокупное вознаграждение более 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

Теперь этот агент можно использовать для моделирования движения на другой карте. Другая карта, генерируемая при сканировании lidar офисной среды, используется с той же обученной моделью. Эта карта представляет более реалистичный сценарий для применения обученной модели после обучения.
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
