Main Content

PID コントローラーに対するバリア証明書の制約の適用

この例では、Barrier Certificate Enforcement ブロックを使用して PID コントローラー アプリケーションに対するバリア証明書の制約を適用する方法を示します。

概要

この例では、プラント ダイナミクスは次の方程式 [1] で記述されます。

x˙1=-x1+(x12+1)u1

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

プラントの目標は、次のように定義された望ましい軌跡を追従することです。

θ˙=0.1π

x˙1d=-rcos(θ)

x˙2d=rsin(θ)

同じ PID 制御アプリケーションに予測された制約関数を適用する例については、PID コントローラーに対する制約の適用を参照してください。

モデル パラメーターと初期状態を設定します。

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

PID コントローラーの設計

制約を適用する前に、基準軌跡を追従するための PID コントローラーを設計します。barrierCertificatePID モデルには、調整されたゲインをもつ 2 つの PID コントローラーが含まれています。Simulink® モデルにおける PID コントローラーの調整の詳細については、Simulink でのモデルベースの PID 調整の紹介を参照してください。

Simulink モデルを開きます。

constrained = 0; % Disable barrier certificate constraint enforcement
mdl = 'barrierCertificatePID';
open_system(mdl)

PID コントローラーをシミュレートし、追従性能をプロットします。

% 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{3}.Values.Data(:,:,ct);
    x2_traj(ct) = logData{4}.Values.Data(:,:,ct);
end

x1_des = logData{1}.Values.Data;
x2_des = logData{2}.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','Trajectory','Start','End','Location','best')

バリア証明書

この例では、同じプラント モデルと PID コントローラーに対してバリア証明書の制約を適用します。

プラントの実行可能領域は、{x:x11,x21} で求められます。したがって、バリア証明書は h(x)=[1-x11-x2]0 によって求められます。

x に対する h(x) の偏導関数は q(x)=[-100-1] によって求められます。

Barrier Certificate Enforcement ブロックは形式 x˙=f(x)+g(x)u のプラント ダイナミクスを受け入れます。このアプリケーションの場合、f(x)=[-x1-x2] および g(x)=[x12+100x22+1] となります。

バリア証明書の制約を使用した PID コントローラーのシミュレーション

制約の実装を表示するには、ConstraintConstrained サブシステムを開きます。

バリア証明書の制約の適用を有効にします。

constrained = 1;

モデルを実行し、シミュレーション結果をプロットします。このプロットから、プラントの状態が 1 より小さいことがわかります。

% 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{3}.Values.Data(:,:,ct);
    x2_traj(ct) = logData{4}.Values.Data(:,:,ct);
end

x1_des = logData{1}.Values.Data;
x2_des = logData{2}.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','Trajectory','Start','End','Location','best')

Barrier Certificate Enforcement ブロックによって、プラント状態が 1 より小さい状態を維持するように、正常に制御動作が制約されています。

モデルを閉じます。

bdclose(mdl)

参考文献

[1] Robey, Alexander, Haimin Hu, Lars Lindemann, Hanwen Zhang, Dimos V. Dimarogonas, Stephen Tu, and Nikolai Matni. "Learning Control Barrier Functions from Expert Demonstrations." Preprint, submitted April 7, 2020. https://arxiv.org/abs/2004.03315

参考

関連するトピック