Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ヘリコプターのマルチループ制御

この例では、slTunersystune を使用して、回転翼航空機のマルチループ コントローラーを調整する方法を説明します。

ヘリコプターのモデル

この例では、状態 8 個のヘリコプター モデルをホバリング トリム状態で使用します。状態ベクトル x = [u,w,q,theta,v,p,phi,r] は以下で構成されています。

  • 縦方向速度 u (m/s)

  • 横方向速度 v (m/s)

  • 垂直速度 w (m/s)

  • ピッチ角 theta (deg)

  • ロール角 phi (deg)

  • ロール レート p (deg/s)

  • ピッチ レート q (deg/s)

  • ヨー レート r (deg/s)

コントローラーは、thetaphipqr の測定値を使用して、縦サイクリック、横サイクリック、テール ローターのコレクティブに対するコマンド ds,dc,dT を度単位で生成します。

制御アーキテクチャ

次の Simulink モデルは、制御アーキテクチャを表しています。

open_system('rct_helico')

制御システムは 2 つのフィードバック ループで構成されています。内側のループ (静的出力フィードバック) によって、安定増大とデカップリングを行います。外側のループ (PI コントローラー) によって、設定点の追従性能を達成します。主な制御目的は次のとおりです。

  • 設定点での thetaphir の変化を、定常偏差ゼロ、立ち上がり時間約 2 秒、最小限のオーバーシュート、最小限の相互干渉で追従

  • 制御帯域幅を制限することで、考慮されていない高周波のローター ダイナミクスと測定ノイズに対処

  • 強力な多変数ゲイン余裕と位相余裕 (プラントの入出力におけるゲイン/位相の同時変化に対するロバスト性。詳細については diskmargin を参照) を提供

カットオフが 40 rad/s のローパス フィルターを使用して、2 番目の目的を一部強制的に適用します。

コントローラーの調整

内側のループと外側のループは、systune コマンドで一緒に調整することができます。このコマンドに必要なのは、プラントとコントローラーのモデルと、望ましい帯域幅 (所望の応答時間の関数) のみです。制御システムが Simulink でモデル化されている場合は、slTuner インターフェイスを使用して調整タスクをすばやく設定できます。調整するブロックのリストを使って、このインターフェイスのインスタンスを作成します。

ST0 = slTuner('rct_helico',{'PI1','PI2','PI3','SOF'});

調整可能な各ブロックは、そのタイプに応じて自動的にパラメーター化され、Simulink モデル内の値で初期化されます (PI コントローラーは $1+1/s$、静的出力フィードバックのゲインはゼロ)。モデルのシミュレーションを実行すると、この制御システムはこれらの初期値に対して不安定であることがわかります。

設定点の追従で注目する I/O 信号をマークし、安定余裕を測定するプラントの入出力 (制御信号と測定信号) を決定します。

addPoint(ST0,{'theta-ref','phi-ref','r-ref'})   % setpoint commands
addPoint(ST0,{'theta','phi','r'})               % corresponding outputs
addPoint(ST0,{'u','y'});

最後に、TuningGoal オブジェクトを使用して設計要件を取得します。この例では以下の要件を使用します。

  • 追従要件: ステップ コマンド theta_refphi_refr_ref に対する thetaphir の応答は、分離された時定数 1 秒の 1 次応答と類似していなければならない。

  • 安定余裕: プラント入力 u とプラント出力 y における多変数ゲイン余裕と位相余裕は、少なくとも 5 dB と 40 度でなければならない。

  • 高速ダイナミクス: ダイナミクスの高速化とぎくしゃくした動きの過渡特性を防ぐため、閉ループの極の振幅は 25 を超えてはならない。

% Less than 20% mismatch with reference model 1/(s+1)
TrackReq = TuningGoal.StepTracking({'theta-ref','phi-ref','r-ref'},{'theta','phi','r'},1);
TrackReq.RelGap = 0.2;

% Gain and phase margins at plant inputs and outputs
MarginReq1 = TuningGoal.Margins('u',5,40);
MarginReq2 = TuningGoal.Margins('y',5,40);

% Limit on fast dynamics
MaxFrequency = 25;
PoleReq = TuningGoal.Poles(0,0,MaxFrequency);

これで、systune を使用してすべてのコントローラー パラメーターを一緒に調整できます。そうすることで、制御システム ST0 の調整バージョン ST1 が返されます。

AllReqs = [TrackReq,MarginReq1,MarginReq2,PoleReq];
ST1 = systune(ST0,AllReqs);
Final: Soft = 1.12, Hard = -Inf, Iterations = 73

最終値は 1 に近いため、要件はほぼ満たされています。theta、phi、r のステップ コマンドに対する調整後の応答をプロットします。

T1 = getIOTransfer(ST1,{'theta-ref','phi-ref','r-ref'},{'theta','phi','r'});
step(T1,5)

立ち上がり時間は約 2 秒で、オーバーシュートはなく、相互干渉もほとんどありません。viewGoal を使用すると、多変数安定余裕の視覚的な評価など、各要件のより詳しい検証を行えます (詳細については、diskmargin を参照)。

figure('Position',[100,100,900,474])
viewGoal(AllReqs,ST1)

PI コントローラーと静的出力フィードバック ゲインの調整後の値を検査します。

showTunable(ST1)
Block 1: rct_helico/PI1 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 1.04, Ki = 2.09
 
Name: PI1
Continuous-time PI controller in parallel form.

-----------------------------------

Block 2: rct_helico/PI2 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = -0.106, Ki = -1.34
 
Name: PI2
Continuous-time PI controller in parallel form.

-----------------------------------

Block 3: rct_helico/PI3 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.139, Ki = -2.22
 
Name: PI3
Continuous-time PI controller in parallel form.

-----------------------------------

Block 4: rct_helico/SOF =
 
  D = 
              u1         u2         u3         u4         u5
   y1      2.224    -0.3139  -0.003395     0.7854   -0.01533
   y2    -0.1872     -1.272    0.01842   -0.08232    -0.1189
   y3   -0.01883   -0.01136     -1.898   0.003543    0.06665
 
Name: SOF
Static gain.

内側のループの利点

静的出力フィードバックの必要性について、PID コントローラーによるヘリコプターの制御だけでは不十分なのかという疑問があるかもしれません。その答えは、内側のループを開いてコントローラーを再調整すれば簡単にわかります。まず、次のように SOF ブロックの後にループ開始点を追加して内側のループを中断します。

addOpening(ST0,'SOF')

その後、SOF ブロックを調整可能なブロックのリストから削除し、PI ブロックを、正しいループ符号 (最初の設計から推論) を使用して、本格的な PID として再パラメーター化します。

PID = pid(0,0.001,0.001,.01);  % initial guess for PID controllers

removeBlock(ST0,'SOF');
setBlockParam(ST0,...
   'PI1',tunablePID('C1',PID),...
   'PI2',tunablePID('C2',-PID),...
   'PI3',tunablePID('C3',-PID));

3 つの PID コントローラーを再調整し、閉ループ ステップ応答をプロットします。

ST2 = systune(ST0,AllReqs);
Final: Soft = 4.94, Hard = -Inf, Iterations = 67
T2 = getIOTransfer(ST2,{'theta-ref','phi-ref','r-ref'},{'theta','phi','r'});
figure, step(T2,5)

最終値が 1 付近ではなくなり、立ち上がり時間、オーバーシュート、デカップリングにおいて性能が劣化していることがステップ応答から確認できます。内側のループには重要な安定化効果があり、この効果を保持すべきであることが示されています。

参考

(Simulink Control Design) | (Simulink Control Design) | | |

関連するトピック