Изучение и применение ограничений для ПИД-регуляторов

В этом примере показано, как узнать ограничения из данных и применить эти ограничения для приложения управления ПИД. Функция ограничения выучена с помощью глубокой нейронной сети, которая требовала программного обеспечения Deep Learning Toolbox™. Затем можно применить ограничения к действиям по управлению ПИД с помощью блока «Принудительное применение ограничений».

В данном примере динамика объекта описывается следующими уравнениями [1].

x˙1=-x1+(x12+1)u1x˙2=-x2+(x22+1)u2

Цель для объекта - отследить следующие траектории.

θ˙=0.1πx˙1d=-rcos(θ)x˙2d=rsin(θ)

Пример, который применяет известную функцию ограничений к тому же приложению управления ПИД, см. в Enforce Constraints for ПИД-регуляторы.

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

rng(0);             % random seed
r = 1.5;            % radius for desired trajectory
Ts = 0.1;           % sample time
Tf = 22;            % duration
x0_1 = -r;          % initial condition for x1
x0_2 = 0;           % initial condition for x2
maxSteps = Tf/Ts;   % simulation steps

Проект ПИД-регуляторов

Перед обучением и применением ограничений проекта ПИД-регуляторов для отслеживания траекторий ссылки. The trackingWithPIDs модель содержит два ПИД-регуляторов с усилениями, настроенными с помощью приложения PID Tuner. Для получения дополнительной информации о настройке ПИД-регуляторов в моделях Simulink, см. Введение в основанную на модели настройку ПИД в Simulink.

mdl = 'trackingWithPIDs';
open_system(mdl)

Симулируйте ПИД-регуляторы и постройте график их эффективности отслеживания.

% Simulate the model.
out = sim(mdl);

% Extract trajectories.
logData = out.logsout;
x1_traj = logData{3}.Values.Data;
x2_traj = logData{4}.Values.Data;
x1_des = logData{1}.Values.Data;
x2_des = logData{2}.Values.Data;

% Plot trajectories.
figure('Name','Tracking')
xlim([-2,2])
ylim([-2,2])
plot(x1_des,x2_des,'r')
xlabel('x1')
ylabel('x2')
hold on
plot(x1_traj,x2_traj,'b:','LineWidth',2)
hold on
plot(x1_traj(1),x2_traj(1),'g*')
hold on
plot(x1_traj(end),x2_traj(end),'go')
legend('desired','traj','start','end')

Функция ограничения

В этом примере вы изучаете ограничения приложения и изменяете действия управления ПИД-регуляторов, чтобы удовлетворить этим ограничениям.

Допустимая область для объекта определяется ограничениями {x:x11,x21}. Поэтому траектории xk+1=[x1(k+1)x2(k+1)] должен удовлетворять xk+11.

Можно аппроксимировать динамику объекта следующим уравнением.

xk+1Axk+[g1(xk)00g2(xk)]uk.

Применение ограничений к этому уравнению создает следующую функцию ограничения.

Axk+[g1(xk)00g2(xk)]uk[11].

Блок Constraint Enforcement принимает ограничения формы fx+gxuc. Для этого приложения коэффициенты этой ограничительной функции следующие.

fx=Axk,gx=[g1(xk)00g2(xk)],c=[11].

Изучение функции ограничения

В данном примере коэффициенты ограничительной функции неизвестны. Поэтому их необходимо вывести из обучающих данных. Чтобы собрать обучающие данные, используйте rlCollectDataPID модель. Эта модель позволяет вам передать нулевые или случайные входы в модель объекта управления и записать результирующие выходы объекта.

mdl = 'rlCollectDataPID';
open_system(mdl)

Чтобы узнать неизвестную матрицу Aобнулите входы объекта нуля. Когда вы делаете это, динамика объекта становится xk+1Axk.

mdl = 'rlCollectDataPID';
open_system(mdl)

Сбор обучающих данных с помощью collectDataPID функция. Эта функция моделирует модель несколько раз и извлекает входные/выходные данные. Функция также форматирует обучающие данные в массив с шестью столбцами: x1(k), x2(k), u1(k), u2(k), x1(k+1), и x2(k+1).

numSamples = 1000;
data = collectDataPID(mdl,numSamples);

Найдите решение методом наименьших квадратов для матрицы A использование входных/выходных данных.

inputData = data(:,1:2);
outputData = data(:,5:6);
A = inputData\outputData;

Соберите обучающие данные. Чтобы узнать неизвестную функцию gx, сконфигурируйте модель, чтобы использовать случайные входные значения, которые следуют нормальному распределению.

% Configure model to use random input data.
blk = [mdl '/Manual Switch'];
set_param(blk,'sw','0');
% Collect data.
data = collectDataPID(mdl,numSamples);

Обучите глубокую нейронную сеть, чтобы аппроксимировать gx функция, использующая trainConstraintPID вспомогательная функция. Эта функция форматирует данные для обучения, затем создает и обучает глубокую нейронную сеть. Для настройки глубокой нейронной сети требуется программное обеспечение Deep Learning Toolbox™.

Входами в глубокую нейронную сеть являются состояния объекта. Создайте входные обучающие данные путем извлечения собранной информации о состоянии.

inputData = data(:,1:2);

Поскольку выход глубокой нейронной сети соответствует gx, вы должны вывести выходные обучающие данные с помощью собранных входных/выходных данных и вычисленных A матрица.

u = data(:,3:4);
x_next = data(:,5:6);
fx = (A*inputData')';
outputData = (x_next - fx)./u;

В данном примере, чтобы гарантировать воспроизводимость, загружает предварительно обученную сеть. Чтобы обучить сеть самостоятельно, установите trainConstraint на true.

trainConstraint = false;
if trainConstraint
    network = trainConstraintPID(inputData,outputData);
else
   load trainedNetworkPID network
end

Следующий рисунок показывает пример процесса обучения.

Симулируйте ПИД-регуляторы с ограничениями

Чтобы симулировать ПИД-регуляторы с ограничениями, используйте trackingWithLearnedConstraintPID модель. Эта модель ограничивает контроллер выходы перед применением их к объекту.

mdl = 'trackingWithLearnedConstraintPID';
open_system(mdl)

Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь обученная глубокая нейронная сеть аппроксимирует gx на основе текущего состояния объекта, и блок Constraint Enforcement применяет функцию ограничения.

Симулируйте модель и постройте график результатов.

% Simulate the model.
out = sim(mdl);

% Extract trajectories.
logData = out.logsout;
x1_traj = zeros(size(out.tout));
x2_traj = zeros(size(out.tout));
for ct = 1:size(out.tout,1)
    x1_traj(ct) = logData{4}.Values.Data(:,:,ct);
    x2_traj(ct) = logData{5}.Values.Data(:,:,ct);
end

x1_des = logData{2}.Values.Data;
x2_des = logData{3}.Values.Data;

% Plot trajectories.
figure('Name','Tracking with Constraint');
plot(x1_des,x2_des,'r')
xlabel('x1')
ylabel('x2')
hold on
plot(x1_traj,x2_traj,'b:','LineWidth',2)
hold on
plot(x1_traj(1),x2_traj(1),'g*')
hold on
plot(x1_traj(end),x2_traj(end),'go')
legend('desired','traj','start','end','Location','best')

Блок Constraint Enforcement успешно ограничивает действия управления таким образом, чтобы состояния объекта оставалось меньше единицы.

bdclose('rlCollectDataPID')
bdclose('trackingWithLearnedConstraintPID')

Ссылки

[1] Робей, Александр, Хаймин Ху, Ларс Линдеманн, Ханвэнь Чжан, Димос В. Димарогонас, Стивен Ту, и Николай Матни. «Барьерные функции управления обучением из экспертных демонстраций». Препринт, представленный 7 апреля 2020 года. https://arxiv.org/abs/2004.03315

См. также

Блоки

Приложения

Похожие темы