ドキュメンテーション

2 ループ自動操縦の調整

この例では、Simulink Control Design を使用して機体のピッチ レートと垂直加速度を制御する 2 ループ自動操縦を調整する方法を説明します。

機体自動操縦のモデル

```open_system('rct_airframe1') ```

```opspec = operspec('rct_airframe1'); % Specify trim condition % Xe,Ze: known, not steady opspec.States(1).Known = [1;1]; opspec.States(1).SteadyState = [0;0]; % u,w: known, w steady opspec.States(3).Known = [1 1]; opspec.States(3).SteadyState = [0 1]; % theta: known, not steady opspec.States(2).Known = 1; opspec.States(2).SteadyState = 0; % q: unknown, steady opspec.States(4).Known = 0; opspec.States(4).SteadyState = 1; % integrator states unknown, not steady opspec.States(5).SteadyState = 0; opspec.States(6).SteadyState = 0; op = findop('rct_airframe1',opspec); ```
``` Operating point search report: --------------------------------- Operating point search report for the Model rct_airframe1. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- (1.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position x: 0 dx: 984 x: -3.05e+03 dx: 0 (2.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta x: 0 dx: -0.00972 (3.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w x: 984 dx: 22.7 x: 0 dx: -1.44e-11 (0) (4.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q x: -0.00972 dx: 1.72e-16 (0) (5.) rct_airframe1/Integrator x: 0.000708 dx: -0.00972 (6.) rct_airframe1/az Control/Integrator x: 0 dx: 0.000242 Inputs: ---------- (1.) rct_airframe1/delta trim u: 0.000708 [-Inf Inf] Outputs: None ---------- ```

```G = linearize('rct_airframe1','rct_airframe1/Airframe Model',op); G.InputName = 'delta'; G.OutputName = {'az','q'}; bodemag(G), grid ```

```pole(G) ```
```ans = -0.0320 -0.0255 0.1253 -29.4685 ```

LOOPTUNE を使用した周波数領域の調整

```ST0 = slTuner('rct_airframe1',{'az Control','q Gain'},op); ```

```addPoint(ST0,{'az ref','delta fin','az','q'}); ```

```wc = 5; Controls = 'delta fin'; Measurements = {'az','q'}; [ST,gam,Info] = looptune(ST0,Controls,Measurements,wc); ```
```Final: Peak gain = 1.01, Iterations = 58 ```

```figure('Position',[100,100,560,714]) loopview(ST,Info) ```

1 つ目のプロットでは開ループ応答に積分動作と目的のゲイン交差周波数があることが確認でき、2 つ目のプロットでは MIMO 安定余裕が満たされている (青い曲線が黄色の範囲を下回る状態) ことがわかります。次に、ステップ コマンド `azref` から垂直加速度 `az` への応答をチェックします。

```T = getIOTransfer(ST,'az ref','az'); figure step(T,5) ```

ループ内に積分器が存在しても、加速度 `az``azref` を追従しません。これは、フィードバック ループが 2 つの変数 `az` および `q` で動作し、どちらが `azref` を追従する変数であるかを指定していないためです。

追従要件の追加

この問題を修正するには、`az` は 1 秒の応答時間でステップ コマンド `azref` に追従するという明示的な要件を追加します。また、ゲイン交差要件を間隔 [3,12] に緩和して、調整器が適切なゲイン交差周波数を検出できるようにします。

```TrackReq = TuningGoal.Tracking('az ref','az',1); ST = looptune(ST0,Controls,Measurements,[3,12],TrackReq); ```
```Final: Peak gain = 1.23, Iterations = 52 ```

これで、`azref` から `az` へのステップ応答は満たされます。

```Tr1 = getIOTransfer(ST,'az ref','az'); step(Tr1,5) grid ```

また、プラント入力に入る外乱からの応答を確認して外乱の抑制の特性をチェックします。

```Td1 = getIOTransfer(ST,'delta fin','az'); bodemag(Td1) grid ```

```step(Td1,5) grid title('Disturbance rejection') ```

`showBlockValue` を使用して、PI コントローラーと内側のループ ゲインの調整後の値を確認します。

```showBlockValue(ST) ```
```AnalysisPoints_ = D = u1 u2 u3 u4 y1 1 0 0 0 y2 0 1 0 0 y3 0 0 1 0 y4 0 0 0 1 Name: AnalysisPoints_ Static gain. ----------------------------------- az_Control = 1 Kp + Ki * --- s with Kp = 0.00166, Ki = 0.0017 Name: az_Control Continuous-time PI controller in parallel form. ----------------------------------- q_Gain = D = u1 y1 1.985 Name: q_Gain Static gain. ```

この設計で十分である場合は、`writeBlockValue` を使用して調整後の値を Simulink モデルに適用し、調整後のコントローラーを Simulink でシミュレートします。

```writeBlockValue(ST) ```

SYSTUNE による MIMO の設計

```open_system('rct_airframe2') ```

```opspec = operspec('rct_airframe2'); % Specify trim condition % Xe,Ze: known, not steady opspec.States(1).Known = [1;1]; opspec.States(1).SteadyState = [0;0]; % u,w: known, w steady opspec.States(3).Known = [1 1]; opspec.States(3).SteadyState = [0 1]; % theta: known, not steady opspec.States(2).Known = 1; opspec.States(2).SteadyState = 0; % q: unknown, steady opspec.States(4).Known = 0; opspec.States(4).SteadyState = 1; % controller states unknown, not steady opspec.States(5).SteadyState = [0;0]; op = findop('rct_airframe2',opspec); ```
``` Operating point search report: --------------------------------- Operating point search report for the Model rct_airframe2. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- (1.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position x: 0 dx: 984 x: -3.05e+03 dx: 0 (2.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta x: 0 dx: -0.00972 (3.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w x: 984 dx: 22.7 x: 0 dx: 2.46e-11 (0) (4.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q x: -0.00972 dx: 2.3e-16 (0) (5.) rct_airframe2/MIMO Controller x: 0.000654 dx: -0.009 x: 2.01e-19 dx: 0.0303 Inputs: ---------- (1.) rct_airframe2/delta trim u: 0.000436 [-Inf Inf] Outputs: None ---------- ```

`looptune` と同様に、`slTuner` インターフェイスを使用して Simulink モデルを調整用に構成します。対象の信号が Simulink モデルで既に線形解析ポイントとしてマークされていることに注意してください。

```ST0 = slTuner('rct_airframe2','MIMO Controller',op); ```

`e` から `delta fin` への 0 のフィードスルーを使用する 2 次 MIMO コントローラーを試します。これを行うには、目的のコントローラー パラメーター化を作成し、それを `setBlockParam` を使用して "MIMO Controller" ブロックに関連付けます。

```C0 = tunableSS('C',2,1,2); % Second-order controller C0.D.Value(1) = 0; % Fix D(1) to zero C0.D.Free(1) = false; setBlockParam(ST0,'MIMO Controller',C0) ```

1. 追従: `az``azref` コマンドに約 1 秒で応答する

2. 帯域幅とロールオフ: `delta fin` のループ ゲインは、-20 dB/decade の勾配で 25 rad/s の後にロールオフする

3. 安定余裕: `delta fin` の余裕は 7 dB および 45 度を超える

4. 外乱の抑制: 入力外乱の減衰係数は 1 rad/s で 40 dB となり、0.001 rad/s で 100 dB まで増える

```% Tracking Req1 = TuningGoal.Tracking('az ref','az',1); % Bandwidth and roll-off Req2 = TuningGoal.MaxLoopGain('delta fin',tf(25,[1 0])); % Margins Req3 = TuningGoal.Margins('delta fin',7,45); % Disturbance rejection % Use an FRD model to sketch the desired attenuation profile with a few points Freqs = [0 0.001 1]; MinAtt = [100 100 40]; % in dB Req4 = TuningGoal.Rejection('delta fin',frd(db2mag(MinAtt),Freqs)); Req4.Focus = [0 1]; ```

`systune` を使用して、これらの要件に従ってコントローラー パラメーターを調整できます。

```AllReqs = [Req1,Req2,Req3 Req4]; Opt = systuneOptions('RandomStart',3); rng(0) [ST,fSoft] = systune(ST0,AllReqs,Opt); ```
```Final: Soft = 1.14, Hard = -Inf, Iterations = 136 Final: Soft = 1.14, Hard = -Inf, Iterations = 135 Final: Soft = 1.14, Hard = -Inf, Iterations = 93 Final: Soft = 1.14, Hard = -Inf, Iterations = 98 ```

```figure('Position',[100,100,987,474]) viewSpec(AllReqs,ST) ```

```T = getIOTransfer(ST,{'az ref','delta fin'},'az'); figure step(Tr1,'b',T(1),'r',5) title('Tracking') legend('Cascade','2 dof') ```

```step(Td1,'b',T(2),'r',5) title('Disturbance rejection') legend('Cascade','2 dof') ```