Этот пример демонстрирует управление скоростью синхронного двигателя с постоянным магнитом (PMSM) с использованием агента с двойным замедленным глубоким детерминированным градиентом (TD3) политики.
Цель этого примера - показать, что в управлении скоростью систем PMSM в качестве альтернативы линейным контроллерам, таким как контроллеры PID, можно использовать обучение усилению. За пределами своих областей линейности линейные контроллеры часто не обеспечивают хороших характеристик отслеживания. В таких случаях обучение усилению обеспечивает нелинейную альтернативу управления.
Загрузите параметры для этого примера.
sim_data
Откройте модель Simulink.
mdl = 'mcb_pmsm_foc_sim_RL';
open_system(mdl)
В линейной управляющей версии этого примера можно использовать PI-контроллеры как в петлях управления скоростью, так и в контурах управления током. Контроллер PI внешнего контура может управлять скоростью, в то время как два контроллера PI внутреннего контура управляют токами d-оси и q-оси. Общая цель состоит в отслеживании опорной скорости в Speed_Ref сигнал. В этом примере для управления токами во внутреннем контуре управления используется усиливающий обучающий агент, в то время как PI-контроллер управляет внешним контуром.
Среда в этом примере состоит из системы PMSM, исключая контроллер тока внутреннего контура, который является агентом обучения усилению. Для просмотра интерфейса между агентом обучения усилению и средой откройте подсистему управления замкнутым контуром.
open_system('mcb_pmsm_foc_sim_RL/Current Control/Control_System/Closed Loop Control')
Подсистема обучения усилению содержит блок агента RL, создание вектора наблюдения и расчет вознаграждения.
Для этой среды:
Наблюдениями является опорная скорость внешнего контура Speed_ref, обратная связь по скорости Speed_fb, токи и ошибки d-оси и q-оси (, , и интегралы ошибок.
Действием агента являются напряжения. vd_rl и vq_rl.
Время взятия пробы агента составляет 2-4 секунды. Управление внутренним контуром происходит в другое время выборки, чем управление внешним контуром.
Моделирование выполняется в течение 5000 временных шагов, если оно не прекращается раньше, когда сигнал iqref насыщается на 1.
Вознаграждение на каждом шаге времени:
100d
Здесь = 5, = 0,1 - iderror - тока d-оси, iqerror - тока q-оси,
Создайте спецификации наблюдения и действий для среды. Сведения о создании непрерывных спецификаций см. в разделе rlNumericSpec.
% Create observation specifications. numObservations = 8; observationInfo = rlNumericSpec([numObservations 1]); observationInfo.Name = 'observations'; observationInfo.Description = 'Information on error and reference signal'; % Create action specifications. numActions = 2; actionInfo = rlNumericSpec([numActions 1]); actionInfo.Name = 'vqdRef';
Создайте интерфейс среды Simulink с помощью спецификаций наблюдения и действий. Дополнительные сведения о создании сред Simulink см. в разделе rlSimulinkEnv.
agentblk = 'mcb_pmsm_foc_sim_RL/Current Control/Control_System/Closed Loop Control/Reinforcement Learning/RL Agent';
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);Предоставление функции сброса для этой среды с помощью ResetFcn параметр. В начале каждого учебного эпизода resetPMSM функция случайным образом инициализирует конечное значение опорной скорости в SpeedRef блок до 695,4 об/мин (0,2 pu), 1390,8 об/мин (0,4 pu), 2086,2 об/мин (0,6 pu) или 2781,6 об/мин (0,8 pu).
env.ResetFcn = @resetPMSM;
Агент, используемый в этом примере, является агентом с двойным отложенным глубоким детерминированным градиентом политики (TD3). Агент TD3 аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия с использованием двух критиков. Дополнительные сведения об агентах TD3 см. в разделе Агенты градиента глубоких детерминированных политик с двойной задержкой.
Чтобы создать критиков, сначала создайте глубокую нейронную сеть с двумя входами (наблюдение и действие) и одним выходом. Дополнительные сведения о создании представления функции значений см. в разделе Создание представлений политик и функций значений.
rng(0) % fix the random seed statePath = [featureInputLayer(numObservations,'Normalization','none','Name','State') fullyConnectedLayer(64,'Name','fc1')]; actionPath = [featureInputLayer(numActions, 'Normalization', 'none', 'Name','Action') fullyConnectedLayer(64, 'Name','fc2')]; commonPath = [additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(32, 'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(16, 'Name','fc4') fullyConnectedLayer(1, 'Name','CriticOutput')]; criticNetwork = layerGraph(); criticNetwork = addLayers(criticNetwork,statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork,'fc1','add/in1'); criticNetwork = connectLayers(criticNetwork,'fc2','add/in2');
Создайте критическое представление, используя указанную нейронную сеть и опции. Необходимо также указать действие и спецификацию наблюдения для критика. Дополнительные сведения см. в разделе rlQValueRepresentation.
criticOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1); critic1 = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,... 'Observation',{'State'},'Action',{'Action'},criticOptions); critic2 = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,... 'Observation',{'State'},'Action',{'Action'},criticOptions);
Агент TD3 решает, какое действие предпринять, учитывая наблюдения с использованием представления актера. Для создания актёра сначала создать глубокую нейронную сеть и сконструировать актёра аналогично критику. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation.
actorNetwork = [featureInputLayer(numObservations,'Normalization','none','Name','State') fullyConnectedLayer(64, 'Name','actorFC1') reluLayer('Name','relu1') fullyConnectedLayer(32, 'Name','actorFC2') reluLayer('Name','relu2') fullyConnectedLayer(numActions,'Name','Action') tanhLayer('Name','tanh1')]; actorOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',0.001); actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,... 'Observation',{'State'},'Action',{'tanh1'},actorOptions);
Чтобы создать TD3 агента, сначала укажите параметры агента с помощью rlTD3AgentOptions объект. Агент переходит из буфера опыта максимальной емкости 2e6 путем случайного выбора мини-партий размера 512. Используйте коэффициент дисконтирования 0,995 для поощрения долгосрочных вознаграждений. TD3 агенты сохраняют задержанные по времени копии актера и критиков, известных как целевой актер и критики. Настройте целевые объекты для обновления каждые 10 шагов агента во время обучения с коэффициентом сглаживания 0,005.
Ts_agent = Ts; agentOptions = rlTD3AgentOptions("SampleTime",Ts_agent, ... "DiscountFactor", 0.995, ... "ExperienceBufferLength",2e6, ... "MiniBatchSize",512, ... "NumStepsToLookAhead",1, ... "TargetSmoothFactor",0.005, ... "TargetUpdateFrequency",10);
Во время обучения агент исследует пространство действия с помощью гауссовой модели шума действия. Установите дисперсию шума и скорость затухания с помощью ExplorationModel собственность. Дисперсия шума затухает со скоростью 2e-4, что благоприятствует разведке к началу обучения и эксплуатации на более поздних стадиях. Дополнительные сведения о модели шума см. в разделе rlTD3AgentOptions.
agentOptions.ExplorationModel.Variance = 0.05; agentOptions.ExplorationModel.VarianceDecayRate = 2e-4; agentOptions.ExplorationModel.VarianceMin = 0.001;
Агент также использует модель шума действия Гаусса для сглаживания обновлений целевой политики. Укажите дисперсию и скорость затухания для этой модели с помощью TargetPolicySmoothModel собственность.
agentOptions.TargetPolicySmoothModel.Variance = 0.1; agentOptions.TargetPolicySmoothModel.VarianceDecayRate = 1e-4;
Создайте агент с использованием указанного актера, критиков и параметров.
agent = rlTD3Agent(actor,[critic1,critic2],agentOptions);
Для обучения агента сначала укажите параметры обучения с помощью rlTrainingOptions. В этом примере используются следующие опции.
Запускать каждый тренинг максимум для 1000 эпизодов, с каждым эпизодом, длящимся максимум ceil(T/Ts_agent) временные шаги.
Прекратите обучение, когда агент получит среднее совокупное вознаграждение, превышающее -190 за 100 последовательных эпизодов. На этом этапе агент может отслеживать эталонные скорости.
T = 1.0; maxepisodes = 1000; maxsteps = ceil(T/Ts_agent); trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-190,... 'ScoreAveragingWindowLength',100);
Обучение агента с помощью train функция. Обучение этого агента - интенсивный вычислительный процесс, который занимает несколько минут. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.
doTraining = false; if doTraining trainingStats = train(agent,env,trainingOpts); else load('rlPMSMAgent.mat') end
Снимок хода обучения показан на следующем рисунке. Можно ожидать разных результатов из-за случайности в тренировочном процессе.

Чтобы проверить производительность обучаемого агента, смоделируйте модель и просмотрите производительность в замкнутом цикле через блок Speed Tracking Scope.
sim(mdl);
Можно также моделировать модель с различными ссылочными скоростями. Установите для эталонной скорости в блоке SpeedRef другое значение от 0,2 до 1,0 на единицу и снова смоделируйте модель.
set_param('mcb_pmsm_foc_sim_RL/SpeedRef','After','0.6') sim(mdl);
На следующем рисунке показан пример производительности отслеживания с замкнутым контуром. В этом моделировании эталонная скорость проходит через значения 695,4 об/мин (0,2 на единицу) и 1738,5 об/мин (0,5 pu). Контроллеры обучения PI и усиления отслеживают изменения опорного сигнала в течение 0,5 секунды.
Хотя агент был обучен отслеживать эталонную скорость 0,2 на единицу, а не 0,5 на единицу, он был хорошо обобщен.

На следующем рисунке показана соответствующая текущая производительность отслеживания. Агенту удалось отследить текущие ссылки id и iq с постоянной ошибкой менее 2%.
