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

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

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

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

Цель для объекта состоит в том, чтобы отследить следующие траектории.

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

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

Установите случайный 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

Спроектируйте ПИД-регуляторы

Прежде, чем учиться и применить ограничения, спроектируйте ПИД-регуляторы для отслеживания ссылочных траекторий. 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] Robey, Александр, Хайминь Ху, Ларс Линдеманн, Ханьвэнь Чжан, Димос В. Димэрогонас, Стивен Ту и Николай Матни. "Узнавая о Барьерных функциях Управления из Опытных Демонстраций". Предварительно распечатайте, представленный 7 апреля 2020. https://arxiv.org/abs/2004.03315

Смотрите также

Блоки

Приложения

Похожие темы