ゲイン スケジュール 3 ループ自動操縦の調整
この例では、systune
を使用して、3 ループ自動操縦向けの滑らかなゲイン スケジュールを生成します。
機体モデルおよび 3 ループ自動操縦
この例では、機体のピッチ軸ダイナミクスの 3 自由度のモデルを使用します。状態には、地球座標 、機体座標 、ピッチ角度 、ピッチ レート があります。次の図では、慣性座標系および機体座標系、飛行経路の角度 、入射角 、ピッチ角 の関係をまとめています。
飛行経路の角度 を制御するために、従来の 3 ループ自動操縦構造を使用します。この自動操縦は、法線加速度 ( に沿った加速度) の適切なバーストを加えることで飛行経路を調整します。この法線加速度は、昇降舵の偏向角 の調整によりピッチングを引き起こし、上昇量を変化させることで生成されます。自動操縦は、ピッチ レート ループ で比例-積分 (PI) 制御を使用し、 ループおよび ループで比例制御を使用します。閉ループ システム (機体および自動操縦) は、Simulink® でモデル化されます。
open_system('rct_airframeGS')
自動操縦ゲイン スケジューリング
機体のダイナミクスは非線形であり、空力は速度 に、モーメントは入射角 に依存します。 飛行エンベロープ全体で適切な性能を得るには、自動操縦ゲインは、プラント ダイナミクスでの変更を補正するために および の関数として調整されなければなりません。この調整プロセスは "ゲイン スケジューリング" と呼ばれ、 はスケジューリング変数と呼ばれます。Simulink モデルでは、ゲイン スケジュールは および の測定によって決定されるルックアップ テーブルとして実装されています。
ゲイン スケジューリングは非線形プラントまたは時変プラントの制御のための線形手法の 1 つです。考え方は、さまざまな操作条件においてプラントの線形近似を計算し、各操作条件においてコントローラー ゲインを調整して、操作中に操作条件の関数としてゲインを入れ替える、ということです。従来のゲイン スケジューリングには、次の主要な手順が 3 つあります。
各操作条件でのプラントの平衡化と線形化
各操作条件での線形ダイナミクスのコントローラー ゲインの調整
操作条件間の滑らかな遷移を行うためのゲイン値の調整
この例では、 で自動操縦ゲインを 1 次多項式としてパラメーター化し、飛行エンベロープ全体の多項式係数を直接調整することで、手順 2 と 3 を組み合わせます。この方法により手順 3 がなくなり、ゲインの変動は および の関数として滑らかになることが保証されます。さらに、ゲイン スケジュール係数は systune
で自動的に調整できます。
平衡化と線形化
入射角 は -20 ~ 20 度の間で変動し、速度 は 700 ~ 1400 m/s の間で変動すると仮定します。重力を無視すると、機体のダイナミクスは において対称です。したがって、 の正の値のみを考察します。線形に等間隔な ペアの 5 行 9 列のグリッドを使用して、飛行エンベロープをカバーします。
nA = 5; % number of alpha values nV = 9; % number of V values [alpha,V] = ndgrid(linspace(0,20,nA)*pi/180,linspace(700,1400,nV));
各飛行条件 に対して、平衡点における機体のダイナミクスを線形化します (法線加速度とピッチのモーメントが 0)。そのためには、 および が定常値となる昇降舵の偏向角 およびピッチ レート を計算する必要があります。これを行うには、最初に機体モデルを別の Simulink モデルに分離します。
mdl = 'rct_airframeTRIM';
open_system(mdl)
operspec
を使用して平衡化条件を指定し、findop
を使用して および の平衡値を計算して、結果の操作点で機体のダイナミクスを線形化します。詳細については、機体の平衡化と線形化 (Simulink Control Design)を参照してください。以上の手順を、45 の飛行条件 について繰り返します。
各 ペアに対する平衡化条件を計算します。
for ct=1:nA*nV alpha_ini = alpha(ct); % Incidence [rad] v_ini = V(ct); % Speed [m/s] % Specify trim condition opspec(ct) = operspec(mdl); % Xe,Ze: known, not steady opspec(ct).States(1).Known = [1;1]; opspec(ct).States(1).SteadyState = [0;0]; % u,w: known, w steady opspec(ct).States(3).Known = [1 1]; opspec(ct).States(3).SteadyState = [0 1]; % theta: known, not steady opspec(ct).States(2).Known = 1; opspec(ct).States(2).SteadyState = 0; % q: unknown, steady opspec(ct).States(4).Known = 0; opspec(ct).States(4).SteadyState = 1; end opspec = reshape(opspec,[nA nV]);
与えられた仕様のモデルを平衡化します。
Options = findopOptions('DisplayReport','off'); op = findop(mdl,opspec,Options);
平衡化条件でモデルを線形化します。
G = linearize(mdl,op); G.u = 'delta'; G.y = {'alpha','V','q','az','gamma','h'}; G.SamplingGrid = struct('alpha',alpha,'V',V);
このプロセスにより、45 の飛行条件 で線形化されたプラント モデルの 5 行 9 列の配列が生成されます。プラントのダイナミクスは飛行エンベロープ内で大きく変動します。
sigma(G)
title('Variations in airframe dynamics')
調整可能なゲイン曲面
自動操縦には、 および の関数として "スケジュール" (調整) される 4 つのゲイン があります。実質的に、これは対応する 4 つのルックアップ テーブルのそれぞれの 88 個の値を調整することになります。各テーブルのエントリを別々に調整するよりも、ゲインを、たとえば、 および に対して単純な多重線形の依存性をもつ曲面といった 2 次元のゲイン曲面としてパラメーター化します。
.
これにより、各ルックアップ テーブルについて変数の数が 88 個から 4 個に減ります。tunableSurface
オブジェクトを使用して、各ゲイン曲面をパラメーター化します。次の点に注意してください。
TuningGrid
は "調整グリッド" (設計点) を指定。このグリッドは、線形化に使用されるグリッドと一致する必要がありますが、ルックアップ テーブルのブレークポイントと一致する必要はありません。ShapeFcn
は、曲面パラメーター化 (、、および ) の基底関数を指定
各曲面は、 = 10 deg および = 1050 m/s (中間の範囲の設計) の調整結果を使用して、定数ゲインに初期化されます。
TuningGrid = struct('alpha',alpha,'V',V); ShapeFcn = @(alpha,V) [alpha,V,alpha*V]; Kp = tunableSurface('Kp',0.1, TuningGrid,ShapeFcn); Ki = tunableSurface('Ki',2, TuningGrid,ShapeFcn); Ka = tunableSurface('Ka',0.001, TuningGrid,ShapeFcn); Kg = tunableSurface('Kg',-1000, TuningGrid,ShapeFcn);
次にゲイン曲面の調整のために slTuner
インターフェイスを作成します。ブロック置換を使用して、非線形プラント モデルを調整グリッド上で線形化されたモデルで置き換えます。setBlockParam
を使用して、調整可能なゲイン曲面 Kp
、Ki
、Ka
、Kg
を同名の Interpolation ブロックに関連付けます。
BlockSubs = struct('Name','rct_airframeGS/Airframe Model','Value',G); ST0 = slTuner('rct_airframeGS',{'Kp','Ki','Ka','Kg'},BlockSubs); % Register points of interest ST0.addPoint({'az_ref','az','gamma_ref','gamma','delta'}) % Parameterize look-up table blocks ST0.setBlockParam('Kp',Kp,'Ki',Ki,'Ka',Ka,'Kg',Kg);
自動操縦の調整
systune
は飛行エンベロープ全体のゲイン曲面係数を自動的に調整できます。TuningGoal
オブジェクトを使用して、性能目的を指定します。
ループ: 1 秒の応答時間、2% 未満の定常偏差および 30% 未満のピーク偏差の設定点を追従します。
Req1 = TuningGoal.Tracking('gamma_ref','gamma',1,0.02,1.3); viewGoal(Req1)
ループ: 低周波数で (加速度の要求の追従のため)、そして 10 rad/s を超えた時点での (測定ノイズの影響を受けないようにするため) 良好な外乱の抑制を確保します。外乱は
az_ref
の位置で加えられます。
RejectionProfile = frd([0.02 0.02 1.2 1.2 0.1],[0 0.02 2 15 150]); Req2 = TuningGoal.Gain('az_ref','az',RejectionProfile); viewGoal(Req2)
ループ: 最大 10 rad/s の良好な外乱の抑制を確保します。外乱はプラント入力
delta
で加えられます。
Req3 = TuningGoal.Gain('delta','az',600*tf([0.25 0],[0.25 1])); viewGoal(Req3)
過渡状態: 発振のない過渡状態については 0.35 の最小 damping 比を確保します。
MinDamping = 0.35; Req4 = TuningGoal.Poles(0,MinDamping);
systune
を使用して、45 の飛行条件すべてでこれらの性能要件が最もよく満たされるように、16 のゲイン曲面係数を調整します。
ST = systune(ST0,[Req1 Req2 Req3 Req4]);
Final: Soft = 1.13, Hard = -Inf, Iterations = 57
結合された目的の最終値は 1 に近く、すべての要件がほぼ満たされていることを示します。結果のゲイン曲面を可視化します。
% Get tuned gain surfaces. TGS = getBlockParam(ST); % Plot gain surfaces. clf subplot(2,2,1) viewSurf(TGS.Kp) title('Kp') subplot(2,2,2) viewSurf(TGS.Ki) title('Ki') subplot(2,2,3) viewSurf(TGS.Ka) title('Ka') subplot(2,2,4) viewSurf(TGS.Kg) title('Kg')
検証
最初に、上記で考慮した 45 の飛行条件で調整された自動操縦を検証します。飛行経路の角度のステップ変化への応答および昇降舵の偏向でのステップ外乱への応答をプロットします。
clf subplot(2,1,1) step(getIOTransfer(ST,'gamma_ref','gamma'),5) grid title('Tracking of step change in flight path angle') subplot(2,1,2) step(getIOTransfer(ST,'delta','az'),3) grid title('Rejection of step disturbance at plant input')
すべての飛行条件で満足のいく応答です。次に、非線形機体モデルに対して自動操縦を検証します。まず writeBlockValue
を使用して調整結果を Simulink モデルに適用します。これにより、2 つの Prelookup ブロックで指定されたブレークポイントでゲイン曲面の公式が評価され、結果が対応する Interpolation ブロックに書き込まれます。
writeBlockValue(ST)
飛行エンベロープの大きな部分を介して機体を導く操縦に対する自動操縦の性能をシミュレートします。次のコードは、Simulink モデルで [実行] ボタンを押して、Scope ブロックでの応答を検査することと同じです。
% Specify the initial conditions. h_ini = 1000; alpha_ini = 0; v_ini = 700; % Simulate the model. SimOut = sim('rct_airframeGS', 'ReturnWorkspaceOutputs', 'on'); % Extract simulation data. SimData = get(SimOut,'sigsOut'); Sim_gamma = getElement(SimData,'gamma'); Sim_alpha = getElement(SimData,'alpha'); Sim_V = getElement(SimData,'V'); Sim_delta = getElement(SimData,'delta'); Sim_h = getElement(SimData,'h'); Sim_az = getElement(SimData,'az'); t = Sim_gamma.Values.Time; % Plot the main flight variables. clf subplot(2,1,1) plot(t,Sim_gamma.Values.Data(:,1),'r--',t,Sim_gamma.Values.Data(:,2),'b') grid legend('Commanded','Actual','location','SouthEast') title('Flight path angle \gamma in degrees') subplot(2,1,2) plot(t,Sim_delta.Values.Data) grid title('Elevator deflection \delta in degrees')
subplot(2,1,1) plot(t,Sim_alpha.Values.Data) grid title('Incidence \alpha in degrees') subplot(2,1,2) plot(t,Sim_V.Values.Data) grid title('Speed V in m/s')
subplot(2,1,1) plot(t,Sim_h.Values.Data) grid title('Altitude h in meters') subplot(2,1,2) plot(t,Sim_az.Values.Data) grid title('Normal acceleration a_z in g''s')
飛行経路角プロファイルの追従は、操縦全体で引き続き良好です。入射角 および速度 の変動は、ここで考慮される飛行エンベロープの大部分をカバーすることに注意してください ( については [-20,20] 度、 については [700,1400])。自動操縦は、3000 m のノミナル高度で調整されたものですが、1,000 から 10,000 m への高度変更に対応して良好に動作します。
非線形シミュレーションの結果により、ゲイン スケジュール自動操縦は飛行エンベロープ全体で常にすぐれた性能を発揮することが確認されます。"ゲイン曲面調整" 手順によって、スケジューリング変数に対するゲイン依存関係についての簡単で明示的な式が得られます。ルックアップ テーブルを使用せずに、これらの式をさらにメモリ効率が高いハードウェア実装に直接使用できます。
参考
slTuner
(Simulink Control Design) | tunableSurface
| setBlockParam
(Simulink Control Design)