Main Content

横方向制御のチュートリアル

この例では、Lateral Controller Stanleyブロックを使用して、車線を変更する際に、計画されたパスを追従する車両のステアリング角度を制御する方法を示します。

概要

車両制御はナビゲーション システムの最終ステップであり、通常は次の 2 つの独立したコントローラーを使用して実現します。

  • 横方向コントローラー:車両が参照パスを追従するようにステアリング角度を調整します。このコントローラーは、現在の車両位置と参照パスの距離を最小化します。

  • 縦方向コントローラー:参照パスを追従しながら、スロットルとブレーキを制御して望ましい速さを維持します。このコントローラーは、車両の向首角と参照パスの方向の差を最小化します。

この例では、縦方向速度が一定のシナリオにおけるパス追従というコンテキストでの横方向制御に焦点を合わせています。この例では、以下を行います。

  1. Lateral Controller Stanleyブロックの背後にあるアルゴリズムについて学習する。

  2. Driving Scenario Designerアプリを使用してドライビング シナリオを作成し、車両が追従する参照パスを生成する。

  3. 閉ループ Simulink® モデルを使用してシナリオで横方向コントローラーをテストする。

  4. Bird's-Eye Scopeを使用してシナリオおよび関連シミュレーションの結果を可視化する。

横方向コントローラー

Stanley の横方向コントローラー [1] は非線形制御則を使用して、クロストラック エラー、および参照パスを基準とした前輪の向首角を最小化します。Lateral Controller Stanleyブロックは、車両の現在の姿勢が参照姿勢に一致するように調整するステアリング角度コマンドを計算します。

制御則の派生において使用する車両モデルに応じて、Lateral Controller Stanley ブロックには次の 2 つの構成があります [1]。

  • 運動学的二輪モデル:運動学的モデルでは、車両の慣性が無視できることを前提としています。この構成は、慣性の効果が最小限に抑えられる低速環境に主に適しています。ステアリング コマンドは車両の参照姿勢、現在の姿勢、および速度に基づいて計算されます。

  • 動的二輪モデル:動的モデルでは慣性の効果 (タイヤの滑りとステアリング サーボの作動) を考慮に入れます。この複雑だが精度の高いモデルにより、コントローラーは現実的なダイナミクスを扱うことができます。この構成では、ステアリング コマンドを計算するために、コントローラーにはパスの曲率、車両の現在のヨー レート、現在のステアリング角度も必要です。

ブロック ダイアログ ボックスで [車両モデル] パラメーターを使用して構成を設定できます。

シナリオの作成

このシナリオは、Driving Scenario Designerアプリを使用して作成されました。このシナリオには、1 本の 3 車線道路と自車が含まれています。道路、車線、車両の追加の詳細な手順については、Create Driving Scenario Interactively and Generate Synthetic Sensor Dataを参照してください。このシナリオでは、車両は以下のように走行します。

  1. 中央車線で開始する。

  2. 道路の曲線部分に入った後に左車線に変更する。

  3. 中央車線に戻る。

このシミュレーションを通して、車両は一定の速度 (10 メートル/秒) で走行します。このシナリオは、アプリから [エクスポート]、[MATLAB 関数のエクスポート] ボタンを使用して MATLAB® 関数としてエクスポートされました。エクスポートされた関数の名前は helperCreateDrivingScenario です。このシナリオの道路とアクターは、シナリオ ファイル LateralControl.mat に保存されました。

モデルの設定

Simulink チュートリアル モデルを開きます。

open_system('LateralControlTutorial')

モデルには次のメイン コンポーネントが含まれています。

  • "Lateral Controller" Variant Subsystem, Variant Model, Variant Assembly Subsystem (Simulink)には、2 つの Lateral Controller Stanleyブロックが含まれています。1 つのブロックは運動学的二輪モデル、もう 1 つのモデルは動的二輪モデルで構成されています。どちらも車両のステアリング角度を制御できます。コマンド ラインからアクティブなものを指定できます。たとえば、Lateral Controller Stanley Kinematic ブロックを選択するには、次のコマンドを使用します。

variant = 'LateralControlTutorial/Lateral Controller';
set_param(variant, 'LabelModeActivechoice', 'Kinematic');
  • HelperPathAnalyzer ブロック。横方向コントローラーに基準信号を提供します。車両の現在の姿勢に基づいて、参照パス上の車両に最も近い点を検索することで、参照姿勢を判別します。

  • "Vehicle and Environment" サブシステム。Vehicle Body 3DOF (Vehicle Dynamics Blockset)ブロックを使用して車両の運動をモデル化します。このサブシステムは、Scenario Readerブロックを使用して LateralControl.mat シナリオ ファイルから道路とアクターを読み取って、環境のモデル化も行います。

モデルを開くと、helperLateralControlTutorialSetup スクリプトも実行されます。このスクリプトにより、モデルで使用されるデータが初期化されます。このスクリプトは、車両パラメーター、コントローラー パラメーター、道路シナリオ、参照姿勢など、Simulink モデルで必要な特定の定数を読み込みます。特に、このスクリプトは前にエクスポートした関数 helperCreateDrivingScenario を呼び出してシナリオを構築します。また、このスクリプトは、helperCreateLaneSensorBuses を呼び出して、モデルに必要なバスも設定します。

以下を使用して、道路と計画されたパスをプロットできます。

helperPlotRoadAndPath(scenario, refPoses)

シナリオのシミュレーション

モデルをシミュレートする際に、Bird's-Eye Scopeを開いてシミュレーションを解析できます。スコープを開いた後に、[信号の検出] をクリックして信号を設定します。次に、シミュレーションを実行して車両、道路の境界、車線区分線を表示します。下のイメージでは、25 秒時点におけるこの例の鳥瞰図スコープを示しています。この時点では、車両は左車線に変更しています。

以下のコマンドを使用して完全なシミュレーションを実行して結果を確認できます。

sim('LateralControlTutorial');

また、"Vehicle and Environment" サブシステムで Simulink® Scope (Simulink)を使用して、車両が計画されたパスを追従する間、コントローラーのパフォーマンスを検証できます。このスコープでは、パスからの最大偏差が 0.3 メートル未満であり、最大ステアリング角度が 3 度未満であることが示されています。

scope = 'LateralControlTutorial/Vehicle and Environment/Scope';
open_system(scope)

ステアリング コマンドの横方向の偏差と発振を低減するために、次のように Lateral Controller Stanley Dynamic ブロックを使用し、モデルを再びシミュレートします。

set_param(variant, 'LabelModeActivechoice', 'Dynamic');
sim('LateralControlTutorial');

まとめ

この例では、Simulink を使用して車線変更シナリオで車両の横方向制御をシミュレートする方法を示しました。Lateral Controller Stanley Kinematic ブロックと比較して、Lateral Controller Stanley Dynamic ブロックでは、パス追従のパフォーマンスが向上し、参照パスからの横方向の偏差が小さくなります。

参考文献

[1] Hoffmann, Gabriel M., Claire J. Tomlin, Michael Montemerlo, and Sebastian Thrun."Autonomous Automobile Trajectory Tracking for Off-Road Driving:Controller Design, Experimental Validation and Racing."American Control Conference.2007, pp. 2296-2301.

サポート関数

"helperPlotRoadAndPath" 道路と参照パスをプロット

function helperPlotRoadAndPath(scenario,refPoses)
%helperPlotRoadAndPath Plot the road and the reference path
h = figure('Color','white');
ax1 = axes(h, 'Box','on');
plot(scenario,'Parent',ax1)
hold on
plot(ax1,refPoses(:,1),refPoses(:,2),'b')
xlim([150, 300])
ylim([0 150])
ax1.Title = text(0.5,0.5,'Road and Reference Path');
end

参考

アプリ

ブロック

関連するトピック