メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

trajectory

ドライビング シナリオでアクターまたは車両の軌跡を作成

説明

trajectory 関数は、各ウェイポイントにおけるアクターの速度値または到着時間のいずれかに基づいて軌跡を作成します。既定では、関数はステアリング位置が後車軸にある車両の軌跡を作成します。ステアリング位置が前車軸にある車両の軌跡を作成するには、名前と値の引数 ReferenceSteerPosition を使用します。

アクターの速度情報からの軌跡

trajectory(ac,waypoints) は、一連のウェイポイントから、アクターまたは車両 ac の軌跡を作成します。

メモ

関数 trajectory は、ウェイポイント間で加速度に不連続性がある軌跡を生成するため、加加速度が大きくなります。滑らかで加加速度の制限された軌跡を生成するには、代わりに関数 smoothTrajectory を使用します。

trajectory(ac,waypoints,speed) は、アクターまたは車両が軌跡に沿って前進または後退のいずれかの運動で移動する速度も指定します。

trajectory(ac,waypoints,speed,waittime) は、アクターまたは車両の待機時間を指定します。この構文を使用すると、特定のウェイポイントでアクターまたは車両アクターを一時停止させることにより、停止と移動を繰り返すドライビング シナリオが生成されます。

trajectory(___,Name=Value) は、前述の構文の任意の引数の組み合わせに加え、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、Course=course は、各ウェイポイントにおけるアクターまたは車両のステアリング方向を定義するコース角 course を指定します。

アクターの到着時間からの軌跡

R2024b 以降

trajectory(ac,waypoints,TimeOfArrival=timeOfArrival) は、各ウェイポイントにおけるアクターの到着時間 timeOfArrival を使用して、一連のウェイポイント waypoints からアクターまたは車両 ac の軌跡を作成します。

trajectory(ac,waypoints,TimeOfArrival=timeOfArrival,Name=Value) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、MotionDirection=motionDirection は、各ウェイポイントにおけるアクターの動く方向 motionDirection を指定します。

すべて折りたたむ

ドライビング シナリオを作成して、曲線の 2 車線道路を追加します。

scenario = drivingScenario('SampleTime',0.05);
roadcenters = [5 0; 30 10; 35 25];
lspec = lanespec(2);
road(scenario,roadcenters,'Lanes',lspec);

車両をシナリオに追加します。車両が速度を変えながら曲線を走行する軌跡を設定します。

v = vehicle(scenario,'ClassID',1);
waypoints = [6 2; 18 4; 25 7; 28 10; 31 15; 33 22];
speeds = [30 10 5 5 10 30];
trajectory(v,waypoints,speeds)

シナリオをプロットしてシミュレーションを実行します。車両が曲線に沿って走行する際に、どのように減速するか観察します。

plot(scenario,'Waypoints','on','RoadCenters','on')
while advance(scenario)
    pause(0.1)
end

直角に交差する 2 つの 2 車線道路で構成されるドライビング シナリオを作成します。

scenario = drivingScenario('StopTime',2.75);
roadCenters = [50 1 0; 2 0.9 0];
laneSpecification = lanespec(2,'Width',4);
road(scenario,roadCenters,'Lanes',laneSpecification);
roadCenters = [27 24 0; 27 -21 0];
road(scenario,roadCenters,'Lanes',laneSpecification);

自車をシナリオに追加します。ウェイポイントと、各ウェイポイントにおける車両の速度値を指定します。2 番目のウェイポイントにおける車両の待機時間を設定します。自車が指定されたウェイポイントを指定された速度で通過する軌跡を生成します。

egoVehicle = vehicle(scenario,'ClassID',1,'Position',[5 -1 0]);
waypoints = [5 -1 0; 16 -1 0; 40 -1 0];
speed = [30; 0; 30];
waittime = [0; 0.3; 0];
trajectory(egoVehicle,waypoints,speed,waittime);

自動車をシナリオに追加します。ウェイポイントと、各ウェイポイントにおける自動車の速度値を指定します。2 番目のウェイポイントにおける自動車の待機時間を設定します。自動車が指定されたウェイポイントを指定された速度で通過する軌跡を生成します。

car = vehicle(scenario,'ClassID',1,'Position',[48 4 0],'PlotColor',[0.494 0.184 0.556], 'Name','Car');
waypoints = [47 3 0; 38 3 0; 10 3 0];
speed = [30; 0; 30];
waittime = [0; 0.3; 0];
trajectory(car,waypoints,speed,waittime);

救急車をシナリオに追加します。救急車が指定されたウェイポイントを一定の速度で通過する軌跡を生成します。

ambulance = vehicle(scenario,'ClassID',6,'Position',[25 22 0],'PlotColor',[0.466 0.674 0.188],'Name','Ambulance');
waypoints = [25 22 0; 25 13 0; 25 6 0; 26 2 0; 33 -1 0; 45 -1 0];
speed = 25;
trajectory(ambulance,waypoints,speed);

シナリオをプロットするカスタム Figure ウィンドウを作成します。

fig = figure;
set(fig,'Position',[0,0,800,600]);
movegui(fig,'center');
hViewPnl = uipanel(fig,'Position',[0 0 1 1],'Title','Stop-and-Go Scenario');
hPlt = axes(hViewPnl);

シナリオをプロットしてシミュレーションを実行します。自車と自動車は、指定された待機時間について一時停止して、救急車との衝突を回避します。

plot(scenario,'Waypoints','on','RoadCenters','on','Parent',hPlt)
while advance(scenario)
    pause(0.1)
end

Figure contains an axes object and an object of type uipanel. The axes object with xlabel X (m), ylabel Y (m) contains 13 objects of type patch, line. One or more of the lines displays its values using only markers

自動車が後退走行し、バックで駐車スペースに入るドライビング シナリオをシミュレートします。

駐車場を含むドライビング シナリオを作成します。

scenario = drivingScenario;
vertices = [0 9; 18 9; 18 -9; 0 -9];
parkingLot(scenario,vertices,ParkingSpace=parkingSpace);

自動車を作成してその軌跡を定義します。自動車は前進走行し、停止してから、後退走行し、バックで駐車スペースに入ります。駐車スペースに入るとき、自動車は開始地点から 90 度反時計回りのヨー方向の角度をもちます。

car = vehicle(scenario,ClassID=1);
waypoints = [9 -5; 9 5; 6 -1.3; 2 -1.3];
speed = [3; 0; -2; 0];
yaw = [90 90 180 180];
smoothTrajectory(car,waypoints,speed,Yaw=yaw)

ドライビング シナリオをプロットし、軌跡のウェイポイントを表示します。

plot(scenario,Waypoints="on")
while advance(scenario)
    pause(scenario.SampleTime)
end

Figure contains an axes object. The axes object with xlabel X (m), ylabel Y (m) contains 6 objects of type patch, line. One or more of the lines displays its values using only markers

交差点で直角に右折する歩行者の軌跡を定義します。

ドライビング シナリオを作成します。交差点を定義する道路セグメントを追加します。

scenario = drivingScenario;
roadCenters = [0 10; 0 -10];
road(scenario,roadCenters);
road(scenario,flip(roadCenters,2));

歩行者アクターをシナリオに追加します。

pedestrian = actor(scenario, ...
    'ClassID',4, ...
    'Length',0.24, ...
    'Width',0.45, ...
    'Height',1.7, ...
    'Position',[-9 0 0], ...
    'RCSPattern',[-8 -8; -8 -8], ...
    'Mesh', driving.scenario.pedestrianMesh, ...
    'Name','Pedestrian');

歩行者の軌跡を定義します。歩行者は交差点に近付き、短時間一時停止してから、交差点で直角に右折します。直角右折を定義するには、交差点で互いに近接する 2 つのウェイポイントを指定します。これらのウェイポイントについて、2 番目のウェイポイントのヨー方向の角度を、最初のウェイポイントから 90 度の角度に指定します。

waypoints = [-9 0; -0.25 0; 0 -0.25; 0 -9];
speed = [1.5; 0; 0.5; 1.5];
yaw =  [0; 0; -90; -90];
waittime = [0; 0.2; 0; 0];
trajectory(pedestrian,waypoints,speed,waittime,'Yaw', yaw);

ドライビング シナリオをプロットし、歩行者のウェイポイントを表示します。

plot(scenario,'Waypoints','on')
while advance(scenario)
    pause(0.001)
end

R2024b 以降

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

scenario = drivingScenario;

ドライビング シナリオに道路と車線のセグメントを追加します。

roadCenters = [18.3 17.94 0;
              34.8 0.45 0;
              19.1 -21.74 0];
laneSpecification = lanespec(2,Width=5);
road(scenario,roadCenters,Lanes=laneSpecification,Name="Road")

車両をウェイポイントおよび対応するアクターの到着時間と共にシナリオに追加します。アクターの到着時間を使用して軌跡を作成します。

egoVehicle = vehicle(scenario, ...
    ClassID=2, ...
    Length=8.2, ...
    Width=2.5, ...
    Height=3.5, ...
    Position=[21.4185032445924 18.4409098505372 0.01], ...
    RearOverhang=1, ...
    FrontOverhang=0.9, ...
    Mesh=driving.scenario.truckMesh, ...
    Name="Truck");
waypoints = [21.4185032445924 18.4409098505372 0.01;
            29.9 12.34 0.01;
            35.3 5.85 0.01;
            36.99 0.75 0.01;
            36.4 -6.25 0.01;
            33.2 -12.24 0.01;
            28.6 -17.14 0.01];
actorArrivalTime = [0 0.2 0.5 0.8 1 1.3 1.5]';
trajectory(egoVehicle,waypoints,TimeOfArrival=actorArrivalTime)

シナリオをプロットし、シミュレーションを実行します。

plot(scenario,Waypoints="on",RoadCenters="on")
while advance(scenario)
    pause(0.1)
end

R2024b 以降

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

scenario = drivingScenario;

ドライビング シナリオに道路と車線のセグメントを追加します。

roadCenters = [0.5 15.84 0;
              35.5 5.85 0;
              28.6 1.35 0;
              22.8 -18.64 0];
marking = [laneMarking("Solid",Color=[0.98 0.86 0.36]) ...
    laneMarking("Dashed") ...
    laneMarking("Dashed")];
laneSpecification = lanespec(2,Width=5,Marking=marking);
road(scenario,roadCenters,Lanes=laneSpecification,Name="Road")
ans = 
  Road with properties:

           Name: "Road"
         RoadID: 1
    RoadCenters: [4×3 double]
      RoadWidth: 10.1500
      BankAngle: [4×1 double]
        Heading: [4×1 double]

車両のパラメーターをそのウェイポイントおよび相対速度値と共に指定します。

egoVehicle = vehicle(scenario, ...
    ClassID=2, ...
    Length=12, ...
    Width=2.5, ...
    Height=3.5, ...
    Position=[12.01 21.84 0.01], ...
    RearOverhang=1, ...
    FrontOverhang=0.9, ...
    Mesh=driving.scenario.truckMesh, ...
    Name="Truck");
waypoints = [11.91 23.84 0.01;
            19.7 25.94 0.01;
            31.8 24.34 0.01;
            40.29 15.55 0.01;
            38.59 5.15 0.01;
            31 0.05 0.01;
            26.4 -4.75 0.01;
            25.3 -12.04 0.01];
speed = [30 30 30 30 30 30 30 30]';

前車軸をステアリングの基準にして車両の軌跡を作成します。

trajectory(egoVehicle,waypoints,speed,ReferenceSteerPosition="front-axle")

後車軸の軌跡を表示してシナリオをプロットし、シミュレーションを実行します。前車軸のステアリングを基準にして作成される後車軸の破線の軌跡を観察します。

plot(scenario,Waypoints="on",RoadCenters="on",ShowRearAxle="on")
title("Trajectory with Front-Axle Steering")
while advance(scenario)
    pause(0.1)
end

入力引数

すべて折りたたむ

drivingScenario オブジェクトに属するアクター。Actor オブジェクトまたは Vehicle オブジェクトとして指定します。これらのオブジェクトを作成するには、関数 actor および vehicle をそれぞれ使用します。

軌跡のウェイポイント。実数値の N 行 2 列または N 行 3 列の行列として指定します。ここで N はウェイポイントの数です。

  • waypointsN 行 2 列の行列である場合、行列の各行はウェイポイントの (x, y) 座標を表します。各ウェイポイントの z 座標はゼロです。

  • waypointsN 行 3 列の行列である場合、行列の各行はウェイポイントの (x, y, z) 座標を表します。

ウェイポイントはワールド座標系で示します。単位はメートルです。

例: [1 0 0; 2 7 7; 3 8 8]

データ型: single | double

waypoints の各ウェイポイントにおけるアクターの速度。実数値スカラーまたは N 要素の実数値ベクトルとして指定します。N はウェイポイントの数です。

  • speed がスカラーの場合、速度はアクターの運動全体を通して一定です。

  • speed がベクトルの場合、ベクトル値は各ウェイポイントにおける速度を指定します。前進運動の場合は、正の速度値を指定します。後退運動の場合は、負の速度値を指定します。運動の方向を変更するには、速度が 0 のウェイポイントによって正の速度と負の速度を分離します。

速度はウェイポイント間で内挿されます。speed は、任意のウェイポイントにおいてゼロにすることができますが、2 つの連続するウェイポイントにおいてゼロにすることはできません。単位はメートル/秒です。

例: [10 8 9] は、10 m/s、8 m/s、および 9 m/s の速度を指定します。

例: [10 0 -10] は、10 m/s の速度で前進運動した後に一時停止し、その後 10 m/s の速度で後退することを指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

アクターの一時停止時間。非負の値の N 要素ベクトルとして指定します。N はウェイポイントの数です。特定のウェイポイントにおけるアクターの一時停止時間を指定する場合は、対応する速度値を 0 に設定する必要があります。任意のウェイポイントにおいて waitime0 に設定することができますが、2 つの連続するウェイポイントにおいて waittime をゼロ以外の値に設定することはできません。単位は秒です。

データ型: single | double

R2024b 以降

アクターの到着時間。N 要素の実数値の列ベクトルとして指定します。N はウェイポイントの数です。単位は秒です。

例: [1 1.2 1.5] は、アクターの到着時間を 1 秒、1.2 秒、1.5 秒と指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: trajectory(vehicle,waypoints,Course=course,ReferenceSteerPosition="front-axle") は、各ウェイポイントにおけるコース角 course を使用し、前車軸をステアリングの基準にして、一連のウェイポイント waypoints から車両 vehicle の軌跡を作成します。

R2024b 以降

アクターのステアリング方向を指定するコース角。N 要素の実数値の列ベクトルとして指定します。ここで N はウェイポイントの数です。単位は度で、角度は反時計回りの方向が正です。

Course を指定しない場合、各ウェイポイントにおけるコース角は NaN となり、これはコースに制約がないことを意味します。

例: [0 90] は、最初のウェイポイントにおいて 0 度、2 番目のウェイポイントにおいて 90 度となるアクターを指定します。

例: [0 NaN] は、最初のウェイポイントにおいて 0 度となるアクターを指定します。このアクターには、2 番目のウェイポイントにおけるコースの制約はありません。

データ型: single | double

各ウェイポイントにおけるアクターのヨー方向の角度。N 要素の実数値ベクトルとして指定します。ここで N はウェイポイントの数です。単位は度で、角度は反時計回りの方向が正です。

yaw を指定しない場合、各ウェイポイントにおけるヨーは NaN となり、これはヨーに制約がないことを意味します。

例: [0 90] は、最初のウェイポイントにおいて 0 度、2 番目のウェイポイントにおいて 90 度となるアクターを指定します。

例: [0 NaN] は、最初のウェイポイントにおいて 0 度となるアクターを指定します。このアクターには、2 番目のウェイポイントにおけるヨーの制約はありません。

データ型: single | double

R2024b 以降

最初のウェイポイントにおけるアクターの向首角。スカラーとして指定します。単位は度です。

InitialHeading を指定しない場合、関数はこの値を最初のウェイポイントの方向と一致するように設定します。

メモ

名前と値の引数 InitialHeading を使用するには、名前と値の引数 ReferenceSteerPosition"front-axle" として指定する必要があります。

データ型: single | double

R2024b 以降

アクターが動く方向。N 要素の数値列ベクトルまたは N 要素の string 配列として指定します。N はウェイポイントの数です。

  • 数値ベクトルを指定する場合、1-10 をそれぞれ使用して前進、後退、停止を表します。

  • string 配列を指定する場合、"Forward""Reverse""Stopped" をそれぞれ使用して前進、後退、停止を表します。

  • 既定では、各ウェイポイントの MotionDirection の値は "Forward" です。

  • アクターが後退する動きを実行するには、方向を逆にする前にアクターを停止しなければなりません。たとえば、前進、停止、後退の形式で後退の動きを実行するには、[1 0 -1] と指定する必要があります。

メモ

名前と値の引数 MotionDirection を使用するには、入力引数 timeOfArrival を指定する必要があります。

例: [1 0 -1] は、1 番目、2 番目、3 番目のウェイポイントにおけるアクターの方向をそれぞれ前進、停止、後退と指定します。

例: ["Forward","Stopped","Reverse"] は、1 番目、2 番目、3 番目のウェイポイントにおけるアクターの方向をそれぞれ前進、停止、後退と指定します。

データ型: single | double | int8 | int16 | int32 | int64 | string

R2024b 以降

車両の基準ステアリング位置。"rear-axle" または "front-axle" として指定します。関数は、この引数で指定されたステアリング位置を使用してアクター ac の軌跡を作成します。

"front-axle" を指定する場合、入力アクター acVehicle オブジェクトでなければなりません。Vehicle オブジェクトを作成するには、vehicle 関数を使用します。詳細については、前車軸のステアリングを使用した長い車両の軌跡の作成の例を参照してください。

例: "front-axle" は、前車軸をステアリングの基準にして、一連のウェイポイントから車両の軌跡を作成します。

データ型: string

ヒント

  • 特定の車体位置を基準とする車両の位置を取得するには、getReferencePosition 関数を使用します。

  • 少なくとも 1 つの車両の前車軸の軌跡がドライビング シナリオに含まれている場合、record 関数によって返される ActorPoses 構造体の FrontAxlePosition フィールドから前車軸の位置を取得できます。

  • 前車軸の軌跡がドライビング シナリオに含まれている場合に後車軸と前車軸の両方の軌跡をプロットするには、plot 関数の名前と値の引数 ShowRearAxle"on" として指定します。

アルゴリズム

関数 trajectory は、シナリオ内でアクターが従う軌跡を作成します。軌跡は、オブジェクトが従うパスと、パスに沿ったオブジェクトの速度で構成されます。パスは、N 個の 2 次元または 3 次元のウェイポイントを使用して指定します。ウェイポイント間の N – 1 個のセグメントはそれぞれ曲線を定義し、その曲率はセグメントに沿って、距離に対して直線的に変化します。関数は、ウェイポイントの両側の曲率を一致させることにより、区分的な "クロソイド" 曲線をウェイポイントの (x, y) 座標に近似します。閉じていない曲線の場合、最初と最後のウェイポイントの曲率はゼロです。最初と最後のウェイポイントが一致する場合は、端点の前後の曲率が一致します。軌跡の z 座標は、形状維持区分的 3 次曲線を使用して内挿されます。

生成される軌跡は、ウェイポイント間の各セグメントの区分的な等加速度プロファイルとなります。これらのセグメントの間には、加速度の不連続性があります。加速度の不連続性を回避するには、代わりに関数 smoothTrajectory を使用して軌跡を生成します。

バージョン履歴

R2018a で導入

すべて展開する