Обучите агента DDPG управлять летающим роботом

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

Модель летающего робота

Окружение обучения с подкреплением для этого примера является летающим роботом с его начальным условием, рандомизированным вокруг звонка радиуса 15 м. Ориентация робота также рандомизирована. Робот имеет два двигателя, установленных со стороны корпуса, которые используются для движения и управления роботом. Цель обучения состоит в том, чтобы прогнать робота от его начального условия к источнику, обращенной к востоку.

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

mdl = 'rlFlyingRobotEnv';
open_system(mdl)

Установите переменные начального состояния модели.

theta0 = 0;
x0 = -15;
y0 = 0;

Определите шаг расчета Ts и длительность симуляции Tf.

Ts = 0.4;
Tf = 30;

Для этой модели:

  • Ориентация цели 0 рад (робот, обращенный к востоку).

  • Тяга от каждого привода ограничена -1 на 1 N

  • Наблюдениями от окружения являются положение, ориентация (синус и косинус ориентации), скорость и скорость вращения робота.

  • Вознаграждение rt обеспечивается в каждый временной шаг,

r1=10((xt2+yt2+θt2)<0.5)

r2=-100(|xt|20|||yt|20)

r3=-(0.2(Rt-1+Lt-1)2+0.3(Rt-1-Lt-1)2+0.03xt2+0.03yt2+0.02θt2)

rt=r1+r2+r3

где:

  • xt - положение робота вдоль оси X.

  • yt - положение робота вдоль оси Y.

  • θt - ориентация робота.

  • Lt-1 - усилие управления от левого двигателя тяги.

  • Rt-1 - усилие управления от правого двигателя малой тяги.

  • r1 - вознаграждение, когда робот близок к цели.

  • r2 - штраф, когда робот выезжает за пределы 20 m в направлении x или y. Симуляция прекращается, когда r2<0.

  • r3 - QR-штраф, который штрафует расстояние от цели и усилия по управлению.

Создайте интегрированную модель

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

integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);

Действия и наблюдения

Перед созданием объекта окружения задайте имена для наблюдений и спецификаций действия и связайте действия тяги между -1 и 1.

Сигналы наблюдения для этого окружения observation=[xyx˙y˙sin(θ)cos(θ)θ˙]T.

numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';

Сигналы действия для этого окружения action=[TRTL]T .

numAct = prod(actionInfo.Dimension);
actionInfo.LowerLimit = -ones(numAct,1);
actionInfo.UpperLimit =  ones(numAct,1);
actionInfo.Name = 'thrusts';

Создайте интерфейс окружения

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

env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);

Функция сброса

Создайте пользовательскую функцию сброса, которая рандомизирует начальное положение робота вдоль звонка радиуса 15 m и начальная ориентация. Для получения дополнительной информации о функции сброса смотрите flyingRobotResetFcn.

env.ResetFcn = @(in) flyingRobotResetFcn(in);

Исправьте начальное значение генератора для повторяемости.

rng(0)

Создайте агента DDPG

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

% Specify the number of outputs for the hidden layers.
hiddenLayerSize = 100; 

observationPath = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];
actionPath = [
    featureInputLayer(numAct,'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc5')];

% Create the layer graph.
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);

% Connect actionPath to observationPath.
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');

Задайте опции для критика, используя rlRepresentationOptions.

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также указать действие и спецификацию наблюдений для критика. Для получения дополнительной информации смотрите rlQValueRepresentation.

critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

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

Построение актёра подобно критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation.

actorNetwork = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numAct,'Name','fc4')
    tanhLayer('Name','tanh1')];

actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);

actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},'Action',{'tanh1'},actorOptions);

Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions.

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6 ,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',256);
agentOptions.NoiseOptions.StandardDeviation = 1e-1;
agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-6;

Затем создайте агента с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOptions);

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

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

  • Запускайте каждое обучение самое большее для 20000 эпизоды с каждым эпизодом, длящимся самое большее ceil(Tf/Ts) временные шаги.

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

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше 415 более 10 последовательных эпизодов. На данной точке агент может привести летающего робота в положение цели.

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 415.

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

maxepisodes = 20000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'StopOnError',"on",...
    'Verbose',false,...
    'Plots',"training-progress",...
    'StopTrainingCriteria',"AverageReward",...
    'StopTrainingValue',415,...
    'ScoreAveragingWindowLength',10,...
    'SaveAgentCriteria',"EpisodeReward",...
    'SaveAgentValue',415); 

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

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions);
else
    % Load the pretrained agent for the example.
    load('FlyingRobotDDPG.mat','agent')       
end

Моделирование агента DDPG

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

simOptions = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agent,simOptions);

Figure Flying Robot Visualizer contains an axes. The axes contains 3 objects of type quiver, patch, line.

См. также

|

Похожие темы