Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

drivingScenario

ドライビング シナリオの作成

説明

drivingScenario オブジェクトは、ドライビング シナリオの道路、駐車場、車両、歩行者、障壁、その他の側面が含まれた 3-D アリーナを表します。このオブジェクトを使用して、現実的な交通シナリオをモデル化し、コントローラーまたはセンサー フュージョン アルゴリズムをテストするための合成検出を生成します。

  • 道路を追加するには、関数 road を使用します。道路に車線を指定するには、lanespec オブジェクトを作成します。関数 roadNetwork を使用して、サードパーティの道路ネットワークから道路をインポートすることもできます。

  • 駐車場を追加するには、関数 parkingLot を使用します。

  • アクター (車、歩行者、自転車など) を追加するには、関数 actor を使用します。車両専用に設計されたプロパティを備えたアクターを追加するには、関数 vehicle を使用します。障壁を追加するには、関数 barrier を使用します。車両や障壁も含め、すべてのアクターは立方体 (箱の形状) でモデル化されます。

  • シナリオをシミュレートするために、ループ内で関数 advance を呼び出します。これにより、一度に 1 つのタイム ステップずつシミュレーションを進めます。

ドライビング シナリオ デザイナー アプリを使用してドライビング シナリオを対話的に作成することもできます。また、アプリから drivingScenario オブジェクトをエクスポートして、アプリまたは Simulink® で使用するための複数のバリエーションのシナリオを生成できます。詳細については、Create Driving Scenario Variations Programmaticallyを参照してください。

作成

説明

scenario = drivingScenario は空のドライビング シナリオを作成します。

scenario = drivingScenario(Name,Value) は、名前と値のペアを使用して SampleTimeStopTime、および GeoReference の各プロパティを設定します。たとえば、drivingScenario('GeoReference',[42.3 -71.0 0]) は、シーンの地理的原点を緯度と経度の座標 (42.3, –71.0)、および高度 0 に設定します。

プロパティ

すべて展開する

シナリオ シミュレーション ステップ間の時間間隔。正の実数スカラーとして指定します。単位は秒です。

例: 1.5

シミュレーションの終了時間。正の実数スカラーとして指定します。単位は秒です。既定の StopTime である Inf では、最初のアクターが軌跡の最後に到達すると、シミュレーションは終了します。

例: 60.0

このプロパティは読み取り専用です。

シミュレーションの現在時間。非負の実数スカラーとして指定します。時間をゼロにリセットするには、関数 restart を呼び出します。単位は秒です。

このプロパティは読み取り専用です。

シミュレーション状態。true または false として指定します。シミュレーションが実行中の場合、IsRunningtrue です。

このプロパティは読み取り専用です。

シナリオに含まれているアクターおよび車両。Actor および Vehicle オブジェクトの異種混合配列として指定します。アクターおよび車両をドライビング シナリオに追加するには、関数 actor および vehicle を使用します。

このプロパティは読み取り専用です。

シナリオに含まれている障壁。Barrier オブジェクトの異種混合配列として指定します。障壁をドライビング シナリオに追加するには、関数 barrier を使用します。

このプロパティは読み取り専用です。

シナリオに含まれている駐車場。ParkingLot オブジェクトの異種混合配列として指定します。駐車場をドライビング シナリオに追加するには、関数 parkingLot を使用します。

このプロパティは読み取り専用です。

道路ネットワーク原点の地理座標。[lat, lon, alt] という形式の 3 要素数値行ベクトルとして指定します。ここで、

  • lat は座標の緯度 (単位は度) です。

  • lon は座標の経度 (単位は度) です。

  • alt は座標の高度 (単位はメートル) です。

これらは、GPS データで使用される標準楕円体である WGS84 準拠楕円体を基準とした値です。

ドライビング シナリオの作成時に GeoReference を設定できます。関数 roadNetwork も、道路を空のドライビング シナリオにインポートした場合にこのプロパティを設定します。

  • 座標を指定して道路をインポートした場合、関数 roadNetworkGeoReference を最初の (または唯一の) 指定された座標に設定します。

  • 領域またはマップ ファイルを指定して道路をインポートした場合、roadNetworkGeoReference をその領域またはマップの中心点に設定します。

関数 roadNetwork は、以前に設定された GeoReference の値をオーバーライドします。

ドライビング シナリオ デザイナー アプリで、マップ データをインポートし、drivingScenario オブジェクトをエクスポートすると、そのオブジェクトの GeoReference プロパティがアプリ シナリオの地理参照に設定されます。

関数 latlon2local でこれらの座標を原点として指定することで、運転ルートの地理座標をドライビング シナリオのローカル座標に変換できます。その後、シナリオの車両軌跡としてこの変換されたルートを指定できます。

ドライビング シナリオで地理座標を使用していない場合は、GeoReference は空の配列 [] になります。

オブジェクト関数

すべて展開する

advanceAdvance driving scenario simulation by one time step
plotPlot driving scenario
recordRun driving scenario and record actor states
restart最初からドライビング シナリオ シミュレーションを再実行
updatePlotsUpdate driving scenario plots
exportExport driving scenario to ASAM OpenDRIVE or ASAM OpenSCENARIO file
actorAdd actor to driving scenario
actorPosesPositions, velocities, and orientations of actors in driving scenario
actorProfilesPhysical and radar characteristics of actors in driving scenario
vehicleAdd vehicle to driving scenario
barrierAdd a barrier to a driving scenario
chasePlotEgo-centric projective perspective plot
trajectoryCreate actor or vehicle trajectory in driving scenario
smoothTrajectoryCreate smooth, jerk-limited actor trajectory in driving scenario
targetPosesTarget positions and orientations relative to ego vehicle
targetOutlinesOutlines of targets viewed by actor
driving.scenario.targetsToEgoConvert target poses from scenario to ego coordinates
driving.scenario.targetsToScenarioConvert target poses from ego to scenario coordinates
roadAdd road to driving scenario or road group
roadNetworkAdd road network to driving scenario
roadBoundariesGet road boundaries
driving.scenario.roadBoundariesToEgoConvert road boundaries to ego vehicle coordinates
lanespecCreate road lane specifications
laneMarkingCreate road lane marking object
laneMarkingVerticesLane marking vertices and faces in driving scenario
currentLaneGet current lane of actor
laneBoundariesGet lane boundaries of actor lane
clothoidLaneBoundaryClothoid-shaped lane boundary model
computeBoundaryModelCompute lane boundary points from clothoid lane boundary model
laneTypeCreate road lane type object
parkingLotAdd parking lot to driving scenario
parkingSpaceDefine parking space for parking lot
insertParkingSpacesInsert parking spaces into parking lot
parkingLaneMarkingVerticesParking lane marking vertices and faces in driving scenario

すべて折りたたむ

1 つの曲線道路、2 つの直線道路、2 つのアクター (車と自転車) が含まれたドライビング シナリオを作成します。どちらのアクターも 60 秒間道路に沿って移動します。

ドライビング シナリオ オブジェクトを作成します。

scenario = drivingScenario('SampleTime',0.1','StopTime',60);

半径 800 メートルの円弧に従う道路中心点を使用して、曲線道路を作成します。円弧は 0 度から開始して 90 度で終了し、5 度のインクリメントでサンプリングされます。

angs = [0:5:90]';
R = 800;
roadcenters = R*[cosd(angs) sind(angs) zeros(size(angs))];
roadwidth = 10;
road(scenario,roadcenters,roadwidth);

両端の道路中央点を使用して、既定の幅をもつ 2 本の直線道路を追加します。

roadcenters = [700 0 0; 100 0 0];
road(scenario,roadcenters)
ans = 
  Road with properties:

           Name: ""
         RoadID: 2
    RoadCenters: [2x3 double]
      RoadWidth: 6
      BankAngle: [2x1 double]
        Heading: [2x1 double]

roadcenters = [400 400 0; 0 0 0];
road(scenario,roadcenters)
ans = 
  Road with properties:

           Name: ""
         RoadID: 3
    RoadCenters: [2x3 double]
      RoadWidth: 6
      BankAngle: [2x1 double]
        Heading: [2x1 double]

道路の境界を取得します。

rbdry = roadBoundaries(scenario);

車と自転車をシナリオに追加します。1 つ目の直線道路の最初の位置に車を配置します。

car = vehicle(scenario,'ClassID',1,'Position',[700 0 0], ...
    'Length',3,'Width',2,'Height',1.6);

道路を進んだ先に自転車を配置します。

bicycle = actor(scenario,'ClassID',3,'Position',[706 376 0]', ...
    'Length',2,'Width',0.45,'Height',1.5);

シナリオをプロットします。

plot(scenario,'Centerline','on','RoadCenters','on');
title('Scenario');

Figure contains an axes object. The axes object with title Scenario contains 1219 objects of type patch, line.

アクターの姿勢とプロファイルを表示します。

poses = actorPoses(scenario)
poses=2×1 struct array with fields:
    ActorID
    Position
    Velocity
    Roll
    Pitch
    Yaw
    AngularVelocity

profiles = actorProfiles(scenario)
profiles=2×1 struct array with fields:
    ActorID
    ClassID
    Length
    Width
    Height
    OriginOffset
    MeshVertices
    MeshFaces
    RCSPattern
    RCSAzimuthAngles
    RCSElevationAngles

ドライビング シナリオを作成し、シミュレーションの進行に伴うターゲット アウトラインの変化を示します。

2 つの交差する直線道路で構成されたドライビング シナリオを作成します。1 つ目の道路セグメントの長さは 45 メートルです。2 つ目の直線道路は、長さが 32 メートルで、両端にジャージ障壁があり、1 つ目の道路と交差します。1 つ目の道路に沿って秒速 12.0 メートルで移動している車が、秒速 2.0 メートルで交差点を現在渡っている歩行者に近づいていきます。

scenario = drivingScenario('SampleTime',0.1,'StopTime',1);
road1 = road(scenario,[-10 0 0; 45 -20 0]);
road2 = road(scenario,[-10 -10 0; 35 10 0]);
barrier(scenario,road1)
barrier(scenario,road1,'RoadEdge','left')
ped = actor(scenario,'ClassID',4,'Length',0.4,'Width',0.6,'Height',1.7);
car = vehicle(scenario,'ClassID',1);
pedspeed = 2.0;
carspeed = 12.0;
smoothTrajectory(ped,[15 -3 0; 15 3 0],pedspeed);
smoothTrajectory(car,[-10 -10 0; 35 10 0],carspeed);

車両の自己を中心とした追跡プロットを作成します。

chasePlot(car,'Centerline','on')

空の鳥瞰図プロットを作成し、アウトライン プロッターおよび車線境界線プロッターを追加します。次に、シミュレーションを実行します。各シミュレーション ステップは以下のとおりです。

  • 追跡プロットを更新して、道路の境界およびターゲット アウトラインを表示する。

  • 鳥瞰図プロットを更新して、更新した道路の境界およびターゲット アウトラインを表示する。プロットのパースペクティブは常に、自車が基準となっています。

bepPlot = birdsEyePlot('XLim',[-50 50],'YLim',[-40 40]);
outlineplotter = outlinePlotter(bepPlot);
laneplotter = laneBoundaryPlotter(bepPlot);
legend('off')

while advance(scenario)
    rb = roadBoundaries(car);
    [position,yaw,length,width,originOffset,color] = targetOutlines(car);
    [bposition,byaw,blength,bwidth,boriginOffset,bcolor,barrierSegments] = targetOutlines(car,'Barriers');
    plotLaneBoundary(laneplotter,rb)
    plotOutline(outlineplotter,position,yaw,length,width, ...
        'OriginOffset',originOffset,'Color',color)
    plotBarrierOutline(outlineplotter,barrierSegments,bposition,byaw,blength,bwidth, ...
        'OriginOffset',boriginOffset,'Color',bcolor)
    pause(0.01)
end

Figure contains an axes object. The axes object is empty.

3 車線の道路に沿って走行している自車とターゲット車両が含まれたドライビング シナリオを作成します。Vision Detection Generator を使用して車線境界線を検出します。

scenario = drivingScenario;

車線指定を使用して 3 車線の道路を作成します。

roadCenters = [0 0 0; 60 0 0; 120 30 0];
lspc = lanespec(3);
road(scenario,roadCenters,'Lanes',lspc);

自車が 30 m/s で中央車線を追従するように指定します。

egovehicle = vehicle(scenario,'ClassID',1);
egopath = [1.5 0 0; 60 0 0; 111 25 0];
egospeed = 30;
smoothTrajectory(egovehicle,egopath,egospeed);

ターゲット車両が 40 m/s で自車の前を走行し、自車の近くで車線を変更するように指定します。

targetcar = vehicle(scenario,'ClassID',1);
targetpath = [8 2; 60 -3.2; 120 33];
targetspeed = 40;
smoothTrajectory(targetcar,targetpath,targetspeed);

自車の後ろからのシナリオの 3-D ビューの追跡プロットを表示します。

chasePlot(egovehicle)

車線とオブジェクトを検出する Vision Detection Generator を作成します。センサーのピッチは 1 度下を指します。

visionSensor = visionDetectionGenerator('Pitch',1.0);
visionSensor.DetectorOutput = 'Lanes and objects';
visionSensor.ActorProfiles = actorProfiles(scenario);

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

  1. 鳥瞰図プロットおよび関連プロッターを作成します。

  2. センサー カバレッジ領域を表示します。

  3. 車線区分線を表示します。

  4. 道路上のターゲットのグラウンド トゥルース姿勢を取得します。

  5. 60 m 前までの最適な車線境界線の点を取得します。

  6. 最適なターゲット姿勢および車線境界線から検出を生成します。

  7. ターゲットのアウトラインを表示します。

  8. オブジェクト検出が有効な場合はオブジェクト検出を表示します。

  9. 車線検出が有効な場合は車線境界線を表示します。

bep = birdsEyePlot('XLim',[0 60],'YLim',[-35 35]);
caPlotter = coverageAreaPlotter(bep,'DisplayName','Coverage area', ...
    'FaceColor','blue');
detPlotter = detectionPlotter(bep,'DisplayName','Object detections');
lmPlotter = laneMarkingPlotter(bep,'DisplayName','Lane markings');
lbPlotter = laneBoundaryPlotter(bep,'DisplayName', ...
    'Lane boundary detections','Color','red');
olPlotter = outlinePlotter(bep);
plotCoverageArea(caPlotter,visionSensor.SensorLocation,...
    visionSensor.MaxRange,visionSensor.Yaw, ...
    visionSensor.FieldOfView(1));
while advance(scenario)
    [lmv,lmf] = laneMarkingVertices(egovehicle);
    plotLaneMarking(lmPlotter,lmv,lmf)
    tgtpose = targetPoses(egovehicle);
    lookaheadDistance = 0:0.5:60;
    lb = laneBoundaries(egovehicle,'XDistance',lookaheadDistance,'LocationType','inner');
    [obdets,nobdets,obValid,lb_dets,nlb_dets,lbValid] = ...
        visionSensor(tgtpose,lb,scenario.SimulationTime);
    [objposition,objyaw,objlength,objwidth,objoriginOffset,color] = targetOutlines(egovehicle);
    plotOutline(olPlotter,objposition,objyaw,objlength,objwidth, ...
        'OriginOffset',objoriginOffset,'Color',color)
    if obValid
        detPos = cellfun(@(d)d.Measurement(1:2),obdets,'UniformOutput',false);
        detPos = vertcat(zeros(0,2),cell2mat(detPos')');
        plotDetection(detPlotter,detPos)
    end
    if lbValid
        plotLaneBoundary(lbPlotter,vertcat(lb_dets.LaneBoundaries))
    end
end

アルゴリズム

すべて展開する

バージョン履歴

R2017a で導入