Этот пример демонстрирует, что регулировка скорости постоянного магнита синхронного двигателя (PMSM) с помощью близнеца задержала глубоко детерминированный градиент политики (TD3) агент.
Цель этого примера состоит в том, чтобы показать, что можно использовать обучение с подкреплением в качестве альтернативы линейным контроллерам, таким как ПИД-регуляторы, в регулировке скорости систем PMSM. За пределами их областей линейности линейные контроллеры часто не производят хорошую эффективность отслеживания. В таких случаях обучение с подкреплением обеспечивает нелинейную альтернативу управления.
Загрузите параметры для этого примера.
sim_data
model: 'Maxon-645106' sn: '2295588' p: 7 Rs: 0.2930 Ld: 8.7678e-05 Lq: 7.7724e-05 Ke: 5.7835 J: 8.3500e-05 B: 7.0095e-05 I_rated: 7.2600 QEPSlits: 4096 N_base: 3477 N_max: 4300 FluxPM: 0.0046 T_rated: 0.3472 PositionOffset: 0.1650 model: 'BoostXL-DRV8305' sn: 'INV_XXXX' V_dc: 24 I_trip: 10 Rds_on: 0.0020 Rshunt: 0.0070 CtSensAOffset: 2295 CtSensBOffset: 2286 ADCGain: 1 EnableLogic: 1 invertingAmp: 1 ISenseVref: 3.3000 ISenseVoltPerAmp: 0.0700 ISenseMax: 21.4286 R_board: 0.0043 model: 'LAUNCHXL-F28379D' sn: '123456' CPU_frequency: 200000000 PWM_frequency: 5000 PWM_Counter_Period: 20000 ADC_Vref: 3 ADC_MaxCount: 4095 SCI_baud_rate: 12000000 V_base: 13.8564 I_base: 21.4286 N_base: 3477 T_base: 1.0249 P_base: 445.3845
Откройте модель Simulink.
mdl = 'mcb_pmsm_foc_sim_RL';
open_system(mdl)
В линейной версии управления этого примера можно использовать ПИ-контроллеры и в скорости и в текущих циклах управления. ПИ-контроллер внешнего контура может контролировать скорость, в то время как два ПИ-контроллера внутреннего цикла управляют токи q-оси и d-ось. Полная цель состоит в том, чтобы отследить задающую скорость в Speed_Ref
сигнал. Этот пример использует агента обучения с подкреплением, чтобы управлять токами во внутреннем цикле управления, в то время как ПИ-контроллер управляет внешним контуром.
Среда в этом примере состоит из системы PMSM, исключая токовый контроллер внутреннего цикла, который является агентом обучения с подкреплением. Чтобы просмотреть интерфейс между агентом обучения с подкреплением и средой, откройте подсистему Управления Замкнутым циклом.
open_system('mcb_pmsm_foc_sim_RL/Current Control/Control_System/Closed Loop Control')
Подсистема Обучения с подкреплением содержит RL Agent
блокируйтесь, создание вектора наблюдения и премиальное вычисление.
Для этой среды:
Наблюдения являются задающей скоростью внешнего контура Speed_ref
, обратная связь скорости Speed_fb
, d-ось и токи q-оси и ошибки (, , и ), и интегралы вероятности.
Действия от агента являются напряжениями vd_rl
и vq_rl
.
Шаг расчета агента является 2e-4 секундами. Управление внутреннего цикла происходит в различном шаге расчета, чем управление внешним контуром.
Симуляция запускается для 5 000 временных шагов, если она не отключена рано когда сигнал насыщается в 1.
Вознаграждение на каждом временном шаге:
Здесь, , и константы, d-ось текущая ошибка, q-ось текущая ошибка, действия от предыдущего временного шага, и флаг, который равен 1, когда симуляция отключена рано.
Создайте спецификации наблюдений и спецификации действия для среды. Для получения информации о создании непрерывных технических требований смотрите 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), 1 390,8 об/мин (0.4 pu), 2 086,2 об/мин (0.6 pu) или 2 781,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
. В данном примере используйте следующие опции.
Запустите каждое обучение самое большее 1 000 эпизодов с каждым эпизодом, длящимся в большей части 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 на модуль) и 1 738,5 об/мин (0.5 pu). PI и контроллеры обучения с подкреплением отслеживают изменения опорного сигнала в течение 0,5 секунд.
Несмотря на то, что агент был обучен отследить задающую скорость 0,2 на модуль а не 0,5 на модуль, это смогло сделать вывод хорошо.
Следующий рисунок показывает соответствующую текущую эффективность отслеживания. Агент смог отследить и текущие ссылки с установившейся ошибкой меньше чем 2%.