Main Content

PID コントローラーの制約の学習と適用

この例では、データから制約を学習させ、それらの制約を PID 制御アプリケーションに適用する方法を示します。最初に、深層ニューラル ネットワークを使用して制約関数に学習させます。これには Deep Learning Toolbox™ ソフトウェアが必要です。その後、Constraint Enforcement ブロックを使用して PID 制御動作に制約を適用します。

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

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

プラントの目標は、次の軌跡を追跡することです。

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

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

乱数シードを設定し、モデルのパラメーターと初期条件を構成します。

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

PID コントローラーの設計

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

mdl = 'trackingWithPIDs';
open_system(mdl)

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

% 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','Trajectory','Start','End')

Figure Tracking contains an axes object. The axes object contains 4 objects of type line. These objects represent Desired, Trajectory, Start, End.

制約関数

この例では、アプリケーションの制約を学習させ、それらの制約を満たすように PID コントローラーの制御動作を変更します。

プラントの実行可能領域は、制約 {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) の 6 列で構成される配列にします。

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);

補助関数 trainConstraintPID を使用して、深層ニューラル ネットワークに学習させて関数 gx を近似します。この関数は、学習するデータの形式を整えてから、深層ニューラル ネットワークを作成して学習させます。深層ニューラル ネットワークの学習には 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;

この例では、再現性を確保するために、事前学習済みのネットワークを読み込みます。自分でネットワークに学習させる場合は、trainConstrainttrue に設定します。

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

次の図は、学習の進行状況の例を示しています。

制約の適用を使用した PID コントローラーのシミュレーション

制約の適用を使用した PID コントローラーのシミュレーションには trackingWithLearnedConstraintPID モデルを使用します。このモデルでは、コントローラーの出力をプラントへの適用前に制約します。

mdl = 'trackingWithLearnedConstraintPID';
open_system(mdl)

制約の実装を表示するには、Constraint サブシステムを開きます。ここで、学習済みの深層ニューラル ネットワークによって現在のプラントの状態に基づいて 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','Trajectory','Start','End','Location','best')

Figure Tracking with Constraint contains an axes object. The axes object contains 4 objects of type line. These objects represent Desired, Trajectory, Start, End.

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

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

参考文献

[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

参考

ブロック

アプリ

関連するトピック