Main Content

# 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:
---------------------------------

opreport =

Operating point search report for the Model rct_airframe1.
(Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States:
----------
Min          x          Max        dxMin        dx         dxMax
___________ ___________ ___________ ___________ ___________ ___________

(1.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position
0           0           0         -Inf         984         Inf
-3047.9999  -3047.9999  -3047.9999     -Inf          0          Inf
(2.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta
0           0           0         -Inf     -0.0097235      Inf
(3.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w
984         984         984        -Inf       22.6897       Inf
0           0           0           0      -1.4367e-11      0
(4.) rct_airframe1/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q
-Inf     -0.0097235      Inf          0      1.1477e-16       0
(5.) rct_airframe1/Integrator
-Inf     0.00070807      Inf        -Inf     -0.0097235      Inf
(6.) rct_airframe1/az Control/Integrator/Continuous/Integrator
-Inf          0          Inf        -Inf     0.00024207      Inf

Inputs:
----------
Min         u         Max
__________ __________ __________

(1.) rct_airframe1/delta trim
-Inf    0.00070807    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 = 73

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

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

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

ループ内に積分器が存在しても、加速度 azazref を追従しません。これは、フィードバック ループが 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 = 54

これで、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:
---------------------------------

opreport =

Operating point search report for the Model rct_airframe2.
(Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States:
----------
Min          x          Max        dxMin        dx         dxMax
___________ ___________ ___________ ___________ ___________ ___________

(1.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Position
0           0           0         -Inf         984         Inf
-3047.9999  -3047.9999  -3047.9999     -Inf          0          Inf
(2.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/Theta
0           0           0         -Inf     -0.0097235      Inf
(3.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/U,w
984         984         984        -Inf       22.6897       Inf
0           0           0           0      2.4588e-11       0
(4.) rct_airframe2/Airframe Model/Aerodynamics & Equations of Motion/ Equations of Motion (Body Axes)/q
-Inf     -0.0097235      Inf          0      -4.0169e-16      0
(5.) rct_airframe2/MIMO Controller
-Inf     0.00065361      Inf        -Inf     -0.0089973      Inf
-Inf     2.6167e-19      Inf        -Inf      0.030259       Inf

Inputs:
----------
Min         u         Max
__________ __________ __________

(1.) rct_airframe2/delta trim
-Inf    0.00043574    Inf

Outputs: None
----------

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

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

e から delta fin へのゼロの直達を使用する 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. 追従: azazref コマンドに約 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.42, Hard = -Inf, Iterations = 47
Final: Soft = 1.42, Hard = -Inf, Iterations = 62
Final: Soft = 1.14, Hard = -Inf, Iterations = 78
Final: Soft = 1.14, Hard = -Inf, Iterations = 118

figure('Position',[100,100,987,474])
viewGoal(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')

## 参考

(Simulink Control Design) | (Simulink Control Design)