Main Content

車両隊列走行用のコントローラーの設計

この例では、車両隊列走行用のコントローラーを設計する方法を示します。車両の隊列では、後続のすべての車両が前の車両と一定の間隔を維持します。間隔が厳密に維持された隊列で車両を走行させることにより、交通の流れ、安全性、燃費を向上できます。

隊列走行の制御目的は次のとおりです [1]。

  • 各車両の安定性 — 後続の各車両について、先行車両が一定の速度で走行している場合の間隔の誤差をゼロに収束させる。

  • 車列の安定性 — 間隔の誤差は車列の後方に向かって伝播するため増幅させない。

隊列走行モデル

この例では、5 台の車両が隊列を形成しています。いずれの車両も次のパラメーターをもつトラック トレーラー システムとしてモデル化されています。長さの単位はすべてメートルです。

L1 = 6;  % Truck length
L2 = 10; % Trailer length
M1 = 1;  % Interconnection length

先頭の車両は与えられた加速度プロファイルに従います。後続の各車両には自車の加速度を制御するコントローラーがあります。

Simulink® モデルを開きます。

mdl = 'fiveVehiclePlatoon';
open_system(mdl)

コントローラー設計

この例では、後続のすべての車両で同じコントローラー設計を使用します。構造は次のとおりです。

aego=C1alead+(1-C1)afront-K1(vego-vlead)-K2(xego-xfront+L)

ここで

  • aegovego、および xego は、自車、つまり制御下の後続車両の加速度、速度、および位置です。

  • afront および vfront は、自車のすぐ前の車両の加速度および速度です。

  • alead および xlead は、隊列の先頭の車両の加速度および位置です。

各車両は、この情報をオンボード センサーおよび隊列の他の車両との無線通信から取得します。

コントローラーのパラメーターは次のとおりです。

  • L は目標の車間距離です。

  • C1 は定数です。

  • K1 は定数です。

  • K2 は PID コントローラーです。

このコントローラーでは、コントローラー K1 を使用して速度の誤差 vlead-vego を最小化し、K2 を使用して間隔の誤差 xego-xfront+L を最小化します。

初期コントローラー パラメーターを定義します。

L = L1 + L2 + M1 + 5;     % Front-to-front vehicle spacing
C1 = 0.8;                 % Constant gain
K1 = 8;                   % Constant gain
K2 = [2,1];               % PD gains for spacing control [P,D]

シミュレーションを実行します。

sim(mdl);

上のプロットでは、後続の各車両の速度が先頭の速度に収束しています。下のプロットでは、車両間の間隔が目標の間隔に収束しています。

PID 調整

性能を向上させるために、PID コントローラーのゲインを調整できます。例として、隊列の 4 台目の車両の間隔を制御する PID コントローラー K2 を調整します。

コントローラーを開きます。

open_system([mdl '/4th with controller/controller/K2'])

ブロック パラメーターの [調整法の選択]Transfer Function Based (PID Tuner App) を選択します。[調整] をクリックします。

[PID 調整器] アプリで、コントローラーの応答時間と過渡動作を調整します。たとえば、[応答時間]3 秒、[過渡動作] の係数を 0.6 にすると、応答が速くオーバーシュートがない PID コントローラーが生成されます。

モデルのコントローラーのパラメーターを更新するには、[ブロックの更新] をクリックします。

この例では、4 番目のコントローラー設定のパラメーターが調整された Simulink モデルを開いてシミュレートします。

mdlTuned = 'fiveVehiclePlatoonTuned';
open_system(mdlTuned)
sim(mdlTuned);

間隔のプロットで、4 台目の車両の誤差が前のシミュレーションよりも速く収束しています。

後続車両は同じコントローラー設計を使用しているため、他の後続車両の K2 のゲインを 4 台目の車両からの調整後のゲインに設定します。

% Obtained tuned controller gains.
pTuned = get_param([mdlTuned '/4th with controller/controller/K2'],'P');
dTuned = get_param([mdlTuned '/4th with controller/controller/K2'],'D');

% Set gains in other controllers.
set_param([mdlTuned '/3rd with controller/controller/K2'],'P',pTuned)
set_param([mdlTuned '/3rd with controller/controller/K2'],'D',dTuned)
set_param([mdlTuned '/2nd with controller/controller/K2'],'P',pTuned)
set_param([mdlTuned '/2nd with controller/controller/K2'],'D',dTuned)
set_param([mdlTuned '/1st with controller/controller/K2'],'P',pTuned)
set_param([mdlTuned '/1st with controller/controller/K2'],'D',dTuned)

すべての後続車両のコントローラー K2 が調整されたモデルをシミュレートします。

sim(mdlTuned);

すべての後続車両の誤差が元のシミュレーションよりも速く収束しています。

参考文献

[1] Rajamani, Rajesh. Vehicle Dynamics and Control. 2. ed. Mechanical Engineering Series. New York, NY Heidelberg: Springer, 2012.

参考

アプリ

ブロック

関連するトピック