Main Content

HL-20 の自動操縦における角速度の制御

これは、HL-20 機体用の飛行制御システムの設計と調整に関する例のシリーズのパート 2 です。このパートでは、機体の角速度を制御する内側のループを閉じる作業について説明します。

制御アーキテクチャ

飛行制御システムをもつ HL-20 モデルを開きます。

open_system('csthl20_control')

この 6-DOF モデルはNASA HL-20 Lifting Body Airframe (Aerospace Blockset)から応用したものです。モデルは着陸地への最終アプローチをシミュレートするように構成されています。"Guidance System" は、滑空角の軌跡および対応するロール、迎角 (alpha)、および横滑り角 (beta) の各コマンドを生成します。"Flight Control System" は、コントロール サーフェスがこれらのコマンドに追従するよう調整を行います。"Flight Control System" 内の "Controller" ブロックは、異なる自動操縦構成をもつバリアント サブシステムです。

"Baseline" コントローラーと "Classical" コントローラーは、内側の 3 つの P のみのループで角速度 p、q、r を制御し、外側の 3 つの PI ループで角度位置 phi、alpha、beta を制御するクラシックなカスケードループ アーキテクチャを使用します。6 つの比例ゲインと 3 つの積分ゲインはすべて alpha と beta の関数としてスケジュールされます。"Baseline" バリアントには、NASA HL-20 Lifting Body Airframe (Aerospace Blockset)で取り上げられているベースライン設計が含まれます。このシリーズのパート 2 と 3 では "Classical" バリアントを使って調整プロセスについて順を追って説明します。アクティブなバリアントはワークスペース変数 CTYPE によって制御されます。その値を 2 に設定すると、コントローラーの "Classical" バリアントが有効になります。

% Select "Classical" variant of controller
CTYPE = 2;

% call model update to make sure only active variant signals are analyzed during linearization
set_param('csthl20_control', 'SimulationCommand', 'update');

このバリアントでは、自動操縦ゲインをスケジュールするためにルックアップ テーブルと MATLAB Function ブロックを組み合わせて使用する点に注意してください。

コントローラー調整の設定

このシリーズのパート 1 (HL-20 機体の平衡化と線形化) では、40 の異なる機体方向、つまり 40 の異なる (alpha,beta) 値ペアについて "HL20 Airframe" ブロックと "Controls Selector" ブロックの線形化モデルを取得しました。これらの線形化モデルの配列を読み込みます。

load csthl20_TrimData G7 CS

size(G7)
8x5 array of state-space models.
Each model has 34 outputs, 9 inputs, and 7 states.
size(CS)
8x5 array of state-space models.
Each model has 6 outputs, 5 inputs, and 0 states.

制御システムの設計と解析に適した "csthl20_control" の線形化モデルを取得するには、slTuner インターフェイスを使用すると便利です。このインターフェイスを使用すると、着目するモデル内の信号やポイントを指定し、調整を行うブロックを指定することができます。

ST0 = slTuner('csthl20_control');
ST0.Ts = 0;   % ask for continuous-time linearizations

ここでは着目するポイントに、角度と速度の要求、対応する応答、および偏向角 da、de、dr が含まれます。

AP = {'da;de;dr'
   'HL20 Airframe/pqr'
   'Alpha_deg'
   'Beta_deg'
   'Phi_deg'
   'Controller/Classical/Demands'  % angular demands
   'p_demand'
   'q_demand'
   'r_demand'};
ST0.addPoint(AP)

"HL20 Airframe" ブロックと "Controls Selector" ブロックの線形化されたモデルを既に (alpha,beta) の関数として取得してあるので、"csthl20_control" モデル全体を線形化するには、各非線形成分を線形モデル群に置き換えるのが一番簡単な方法です。これは "ブロック置換" と呼ばれ、通常の場合、複雑なモデルを複数の操作条件で線形化する最も効果的な方法です。

% Replace "HL20 Airframe" block by 8-by-5 array of linearized models G7
BlockSub1 = struct('Name','csthl20_control/HL20 Airframe','Value',G7);

% Replace "Controls Selector" by CS
BlockSub2 = struct('Name','csthl20_control/Flight Control System/Controls Selector','Value',CS);

% Replace "Actuators" by direct feedthrough (ignore saturations and second-order actuator dynamics)
BlockSub3 = struct('Name','csthl20_control/Actuators','Value',eye(6));

ST0.BlockSubstitutions = [BlockSub1 ; BlockSub2 ; BlockSub3];

これで、制御の設計部分に進む準備が整いました。

内側のループを閉じる

角速度 p、q、r を制御する 3 つの内側のループから開始します。方向付けのため、偏向角 (da,de,dr) から角速度 (p,q,r) への開ループ伝達関数をプロットします。slTuner インターフェイスでは、関心のある任意の伝達関数についてモデルにクエリできます。

% NOTE: The second 'da;de;dr' opens all feedback loops at the plant input
Gpqr = getIOTransfer(ST0,'da;de;dr','pqr','da;de;dr');

bode(Gpqr(1,1),Gpqr(2,2),Gpqr(3,3),{1e-1,1e3}), grid
legend('da to p','de to q','dr to r')
ans = 

  Legend (da to p, de to q, dr to r) with properties:

         String: {'da to p'  'de to q'  'dr to r'}
       Location: 'northeast'
    Orientation: 'vertical'
       FontSize: 8.1000
       Position: [0.7795 0.8188 0.1750 0.1278]
          Units: 'normalized'

  Use GET to show all properties

このボード線図には、5 rad/s を超えると対角項が積分器 (符号まで) として動作することが示されています。したがって、比例のみの制御の使用が正当化されます。ベースライン設計と同じように、p、q、r ループのターゲットの帯域幅をそれぞれ 30、22.5、37.5 rad/s に設定します。(alpha,beta) の各値に対するゲイン Kp、Kq、Kr は、これらの周波数でのプラント周波数応答から簡単に得ることができ、位相プロットには、Kp が正 (負のフィードバック)、Kq と Kr は負 (正のフィードバック) になる必要があることが示されています。

% Compute Kp,Kq,Kr for each (alpha,beta) condition. Resulting arrays
% have size [1 1 8 5]
Kp = 1./abs(evalfr(Gpqr(1,1),30i));
Kq = -1./abs(evalfr(Gpqr(2,2),22.5i));
Kr = -1./abs(evalfr(Gpqr(3,3),37.5i));

bode(Gpqr(1,1)*Kp,Gpqr(2,2)*Kq,Gpqr(3,3)*Kr,{1e-1,1e3}), grid
legend('da to p','de to q','dr to r')
ans = 

  Legend (da to p, de to q, dr to r) with properties:

         String: {'da to p'  'de to q'  'dr to r'}
       Location: 'northeast'
    Orientation: 'vertical'
       FontSize: 8.1000
       Position: [0.7795 0.8188 0.1750 0.1278]
          Units: 'normalized'

  Use GET to show all properties

内側のループの設計を完了するため、これらのゲイン値を Simulink® モデルの対応するルックアップ テーブルにプッシュして slTuner オブジェクトを更新します。

MWS = get_param('csthl20_control','ModelWorkspace');
MWS.assignin('Kp',squeeze(Kp))
MWS.assignin('Kq',squeeze(Kq))
MWS.assignin('Kr',squeeze(Kr))

refresh(ST0)

次に、ロール、迎角、横滑り角を制御する外側のループを調整する必要があります。このシリーズのパート 3 (HL-20 の自動操縦の姿勢制御 - SISO 設計) ではクラシックな SISO アーキテクチャを調整する方法を説明し、パート 4 (HL-20 の自動操縦の姿勢制御 - MIMO 設計) では MIMO アーキテクチャの利点について学びます。

関連するトピック