Этот пример показывает, как обучить двуногого робота, смоделированного в Simscape™ Multibody™, чтобы обойти использование агента изучения укрепления глубоко детерминированного градиента политики (DDPG). Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики.
Среда обучения укрепления для этого примера является двуногим роботом. Учебная цель состоит в том, чтобы сделать обход робота в прямой линии без агрессивных или нереалистичных движений с помощью минимального усилия по управлению.
Добавьте необходимые пути и загрузите параметры модели к основной рабочей области MATLAB®.
addpath(genpath('Scripts'),genpath('Lib')) robotParametersRL;
Откройте модель.
mdl = 'rlWalkingBipedRobot';
open_system(mdl)
Робот моделируется с помощью Simscape Multibody и Библиотеки Сил Контакта Simscape Multibody.
Для этой модели:
Нейтральное положение радиана 0
с обоими участками прямо и плоскими лодыжками.
Контакт ноги моделируется, пользуясь Библиотекой Сил Контакта Simscape Multibody.
Агент может управлять 3 отдельными соединениями, лодыжкой, коленом и бедром, на обоих участках робота путем применения сигналов крутящего момента от -3
до 3
Nm. Фактические вычисленные сигналы действия нормированы, чтобы быть от -1
до 1.
Среда предоставляет 29 наблюдений агенту. Наблюдения: Y (ответвление) и Z (вертикальные) переводы центра туловища массы; X (прямой), Y (ответвление) и Z (вертикальные) скорости перевода; отклоняйтесь от курса, сделайте подачу, и углы вращения туловища; отклоняйтесь от курса, сделайте подачу и прокрутите угловые скорости; угловое положение и скорость 3 соединений (лодыжка, колено, бедро) на обоих участках; и предыдущие действия от агента. Перевод в направлении Z нормирован к подобной области значений как другие наблюдения.
Эпизод останавливается, если центр туловища робота массы составляет меньше чем 0,1 м в (упавшем) направлении Z или больше чем 1 м в направлении Y (боковое движение). Эпизод также останавливается, если абсолютное значение или списка, подачи или отклонения от курса больше, чем 0,7854.
Премиальная функция , если в каждый такт, вдохновлен [1]. Эта премиальная функция поощряет агент продвигаться путем предоставления положительного вознаграждения за прямую скорость. Это также поощряет агент избегать завершения эпизода путем предоставления постоянного вознаграждения () каждый временной шаг. С другой стороны, это штрафует существенные изменения в боковых и горизонтальных переводах, наряду с усилием по управлению.
где:
скорость перевода в направлении X (вперед к цели) робота.
боковое смещение перевода робота от целевой траектории прямой линии.
нормированное горизонтальное перемещение перевода центра робота массы.
крутящий момент от соединения от предыдущего временного шага.
шаг расчета среды.
итоговое время симуляции среды.
Создайте спецификацию наблюдения.
numObs = 29;
obsInfo = rlNumericSpec([numObs 1]);
obsInfo.Name = 'observations';
Создайте спецификацию действия.
numAct = 6; actInfo = rlNumericSpec([numAct 1],'LowerLimit',-1,'UpperLimit', 1); actInfo.Name = 'foot_torque';
Создайте интерфейс среды для модели робота обхода.
blk = [mdl,'/RL Agent'];
env = rlSimulinkEnv(mdl,blk,obsInfo,actInfo);
env.ResetFcn = @(in) walkerResetFcn(in,upper_leg_length/100,lower_leg_length/100,h/100);
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Агент и сети критика для этого примера вдохновлены [2].
Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения. Для примера, который создает нейронные сети для агентов DDPG, смотрите Train Агент DDPG, чтобы Управлять Двойной Системой Интегратора.
Создайте агента и сети критика с помощью функции помощника createRobotNetworks
.
[criticNetwork,actorNetwork] = createNetworks(numObs,numAct);
Просмотрите конфигурацию сети критика.
figure plot(criticNetwork)
Задайте опции для критика и представлений агента с помощью rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3, ... 'GradientThreshold',1,'L2RegularizationFactor',1e-5); actorOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-4, ... 'GradientThreshold',1,'L2RegularizationFactor',1e-5);
Создайте критика и представления агента с помощью заданных глубоких нейронных сетей и опций. Необходимо также указать информацию действия и наблюдения для каждого представления, которое вы уже получили из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOptions); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'ActorTanh1'},actorOptions);
Чтобы создать агент DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions; agentOptions.SampleTime = Ts; agentOptions.DiscountFactor = 0.99; agentOptions.MiniBatchSize = 128; agentOptions.ExperienceBufferLength = 1e6; agentOptions.TargetSmoothFactor = 1e-3; agentOptions.NoiseOptions.MeanAttractionConstant = 1; agentOptions.NoiseOptions.Variance = 0.1;
Затем создайте агент DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый учебный эпизод для самое большее 20 000 эпизодов с каждым эпизодом, длящимся самое большее 400 временных шагов.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 100 более чем 250 последовательных эпизодов. На данном этапе агент может быстро сбалансировать маятник в вертикальном положении с помощью минимального усилия по управлению.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше, чем 150.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxEpisodes = 20000; maxSteps = Tf/Ts; trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxEpisodes,... 'MaxStepsPerEpisode',maxSteps,... 'ScoreAveragingWindowLength',250,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',100,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',150);
Чтобы обучить агент параллельно, задайте следующие опции обучения.
Установите опцию UseParallel
на true
.
Обучите агент параллельно асинхронно.
После каждых 32 шагов каждый рабочий отправляет события в хост.
Агенты DDPG требуют, чтобы рабочие отправили 'Experiences'
в хост.
trainOpts.UseParallel = true; trainOpts.ParallelizationOptions.Mode = 'async'; trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32; trainOpts.ParallelizationOptions.DataToSendFromWorkers = 'Experiences';
Обучите агент с помощью функции train
. Этот процесс в вычислительном отношении интенсивен и занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой doTraining
к false
. Чтобы обучить агент самостоятельно, установите doTraining
на true
. Из-за случайности параллельного обучения, можно ожидать, что различное обучение следует из графика ниже. Пример обучен с шестью рабочими.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load pretrained agent for the example. load('rlWalkingBipedRobotDDPG.mat','agent') end
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Чтобы подтвердить производительность обученного агента, моделируйте его в полюсной корзиной среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',maxSteps);
experience = sim(env,agent,simOptions);
[1] Н. Хисс и др., "Появление Поведений Передвижения в Богатых Средах", Технический отчет, ArXiv, 2017.
[2] Т.П. Лилликрэп и др., "Непрерывное Управление с Глубоким Изучением Укрепления", Международная конференция по вопросам Изучения Представлений, 2016.
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.