exponenta event banner

Программно создавать траектории актера и транспортного средства

В этом примере показано, как программно создавать траектории актера и транспортного средства для сценария вождения с использованием функций автоматизированного вождения Toolbox™. Для интерактивного создания траекторий актера и транспортного средства используйте приложение «Конструктор сценариев вождения».

Субъекты и транспортные средства

Действующие лица в сценарии управления определяются как кубовидные объекты с определенной длиной, шириной и высотой. Актеры также имеют радиолокационное сечение (указанное в дБсм), которое можно уточнить, определив угловые координаты (азимут и отметка). Сценарии управления кубоидами определяют положение актера как центра его нижней грани. Сценарии вождения используют эту точку как точку контакта актера с землей. Эта точка также является центром вращения актера.

Транспортное средство - это особый вид актера, который передвигается на колесах. Транспортные средства обладают тремя дополнительными свойствами, регулирующими расположение передней и задней осей.

  • Колёсная база - расстояние между передней и задней осями.

  • Передний свес представляет собой величину расстояния между передней осью и передней частью транспортного средства.

  • Задний свес - расстояние между задней осью и задней частью транспортного средства.

В отличие от актёров, положение транспортного средства находится на земле в центре задней оси. Это положение соответствует естественному центру вращения транспортного средства.

В этой таблице представлен типичный список действующих лиц и их соответствующие размеры:

Этот код отображает положение актера с размерами типичного человека и транспортного средства в сценарии вождения. Актор и транспортное средство расположены в позициях (0, 2) и (0, -2) соответственно.

scenario = drivingScenario;
a = actor(scenario,'ClassID',1,'Length',0.24,'Width',0.45,'Height',1.7);
passingCar = vehicle(scenario,'ClassID',1);
a.Position = [0 2 0]
passingCar.Position = [0 -2 0]
plot(scenario)
ylim([-4 4])
a = 

  Actor with properties:

             EntryTime: 0
              ExitTime: Inf
               ActorID: 1
               ClassID: 1
                  Name: ""
             PlotColor: [0 0.4470 0.7410]
              Position: [0 2 0]
              Velocity: [0 0 0]
                   Yaw: 0
                 Pitch: 0
                  Roll: 0
       AngularVelocity: [0 0 0]
                Length: 0.2400
                 Width: 0.4500
                Height: 1.7000
                  Mesh: [1x1 extendedObjectMesh]
            RCSPattern: [2x2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]


passingCar = 

  Vehicle with properties:

         FrontOverhang: 0.9000
          RearOverhang: 1
             Wheelbase: 2.8000
             EntryTime: 0
              ExitTime: Inf
               ActorID: 2
               ClassID: 1
                  Name: ""
             PlotColor: [0.8500 0.3250 0.0980]
              Position: [0 -2 0]
              Velocity: [0 0 0]
                   Yaw: 0
                 Pitch: 0
                  Roll: 0
       AngularVelocity: [0 0 0]
                Length: 4.7000
                 Width: 1.8000
                Height: 1.4000
                  Mesh: [1x1 extendedObjectMesh]
            RCSPattern: [2x2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]

По умолчанию на графике сценария отображается внешний вид актёров. Чтобы изменить этот вид, можно интерактивно управлять графиком сценария, выбрав Панель инструментов камеры, доступную в меню «Вид» графика. Кроме того, можно программно управлять графиком с помощью таких функций, как xlim, ylim, zlim, и view. Эти функции позволяют сравнивать относительные высоты актеров.

zlim([0 4])
view(-60,30)

Определение траекторий

С помощью smoothTrajectory можно указать актеров и транспортные средства для следования по пути вдоль набора ППМ на наборе заданных скоростей. При указании ППМ smoothTrajectory функция подходит кусочно-клотоидной кривой к каждому сегменту между ППМ, сохраняя кривизну между точками. Клотоидные кривые имеют кривизну, которая изменяется линейно с пройденным расстоянием, что создает очень простую траекторию для навигации водителей при движении с постоянной скоростью.

По умолчанию траектории актера не имеют кривизны в конечных точках. Для завершения цикла укажите идентичные первую и последнюю точки ППМ.

Чтобы следовать по всей траектории с постоянной скоростью, укажите скорость как скалярное значение.

Транспортные средства проходят через кривую между ППМ в их центрах вращения. Поэтому для размещения длины транспортного средства перед и за задней осью во время моделирования можно сместить начальные и конечные ППМ. Смещение этих ППМ полностью подходит для транспортного средства в пределах дороги в его конечных точках.

Если транспортное средство нуждается в быстром повороте, чтобы избежать препятствия, установите две точки близко друг к другу в намеченном направлении движения. В этом примере показан быстрый поворот транспортного средства в двух местах, но в остальном рулевое управление осуществляется нормально.

scenario = drivingScenario;
road(scenario, [0 0; 10 0; 53 -20],'lanes',lanespec(2));
plot(scenario,'Waypoints','on')
idleCar = vehicle(scenario,'ClassID',1,'Position',[25 -5.5 0],'Yaw',-22);

passingCar = vehicle(scenario,'ClassID',1)

waypoints = [1 -1.5; 16.36 -2.5; 17.35 -2.765; 23.83 -2.01; 24.9 -2.4; 50.5 -16.7];
speed = 15;
smoothTrajectory(passingCar,waypoints,speed)
passingCar = 

  Vehicle with properties:

         FrontOverhang: 0.9000
          RearOverhang: 1
             Wheelbase: 2.8000
             EntryTime: 0
              ExitTime: Inf
               ActorID: 2
               ClassID: 1
                  Name: ""
             PlotColor: [0.8500 0.3250 0.0980]
              Position: [0 0 0]
              Velocity: [0 0 0]
                   Yaw: 0
                 Pitch: 0
                  Roll: 0
       AngularVelocity: [0 0 0]
                Length: 4.7000
                 Width: 1.8000
                Height: 1.4000
                  Mesh: [1x1 extendedObjectMesh]
            RCSPattern: [2x2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]

В качестве альтернативы можно использовать меньшее количество ППМ при таких поворотах путем явной установки угла ориентации рыскания транспортного средства в каждой ППМ. Рыскание положительно в направлении против часовой стрелки, а его единицы измерения в градусах. В этом варианте предыдущего примера траектория ограничена таким образом, что транспортное средство находится под углом -15 градусов после перемещения в левую полосу. Путем установки для ППМ значения NaN, smoothTrajectory по умолчанию используется для подгонки кривой клотоида к сегменту, ведущему к этому ППМ. В этом случае этот сегмент является последним на траектории.

waypoints = [1 -1.5; 16.6 -2.1; 23.7 -0.9; 52.2 -17.6];
yaw =  [0; 0; -15; NaN];
smoothTrajectory(passingCar,waypoints,speed,'Yaw',yaw)

Поворот и торможение на перекрестках

Для резких поворотов либо определите ППМ, близкие друг к другу в начале и конце поворота, либо явно установите рыскание транспортного средства в каждой ППМ. Эта установка верно делает внезапное изменение в управлении.

В этом примере транспортное средство совершает резкий левый поворот на перекрестке, используя явно заданные значения рыскания. На первом ППМ и ППМ перед поворотом транспортное средство имеет рыскание 0 градусов. В ППМ после поворота и конечной ППМ транспортное средство имеет рыскание 90 градусов, что является ориентацией транспортного средства после завершения поворота. Ограничивая траекторию таким образом, чтобы транспортное средство достигало этих ориентаций рыскания, поворот транспортного средства намного резче, чем если бы вы использовали ориентации рыскания по умолчанию.

smoothTrajectory функция генерирует плавную траекторию, ограниченную рывком, без разрывов в ускорении между ППМ. При изменении скорости транспортного средства, например при замедлении на повороте, расстояния между ППМ должны быть достаточно большими, чтобы транспортное средство достигало желаемой скорости при сохранении плавного ускорения на всем протяжении. Альтернативно, на более коротких расстояниях изменения скоростей должны быть относительно небольшими. В этом примере транспортное средство замедляется со скорости 6 м/с до 5 м/с при входе в поворот. После завершения поворота транспортное средство ускоряется до первоначальной скорости.

scenario = drivingScenario;
road(scenario,[0 -25; 0 25],'lanes',lanespec([1 1]));
road(scenario,[-25 0; 25 0],'lanes',lanespec([1 1]));

turningCar = vehicle(scenario,'ClassID',1);

waypoints = [-20 -2; -5 -2; 2 5; 2 20];
speed = [6 5 5 6];
yaw = [0 0 90 90];
smoothTrajectory(turningCar,waypoints,speed,'Yaw',yaw)

plot(scenario,'Waypoints','on')

Перемещение транспортных средств

После определения всех дорог, актёров и траекторий актёров можно увеличить положение каждого актёра с помощью advance функция на сценарии управления в цикле.

while advance(scenario)
    pause(0.01)
end

Перемещение транспортных средств задним ходом

Чтобы задать движения движения в обратном направлении, укажите траекторию с отрицательными скоростями. При переключении между движениями вперед и назад необходимо указать ППМ между этими движениями, который имеет скорость 0. В этом ППМ транспортное средство замедляется до полной остановки, а затем меняет направления движения.

Этот пример разворачивается на предыдущем примере. На этот раз после завершения левого поворота транспортное средство откидывается вверх и поворачивает на перекрестке. Затем транспортное средство снова переключает направление движения и движется вперед до тех пор, пока не остановится на противоположной полосе от места начала движения. Поскольку транспортное средство движется с низкими скоростями, для ускорения моделирования укажите более короткую паузу между обновлениями моделирования.

scenario = drivingScenario;
road(scenario,[0 -25; 0 25],'lanes',lanespec([1 1]));
road(scenario,[-25 0; 25 0],'lanes',lanespec([1 1]));

turningCar = vehicle(scenario,'ClassID',1);

waypoints = [-20 -2; -5 -2; 2 5; 2 20; 2 5; 5 2; -20 2];
speed = [6 5 5 0 -2 0 5];
yaw =  [0 0 90 90 -90 0 -180];
smoothTrajectory(turningCar,waypoints,speed,'Yaw',yaw)

plot(scenario,'Waypoints','on')

while advance(scenario)
    pause(0.001)
end

Следующие шаги

В этом примере показано, как создавать траектории актера и транспортного средства для сценария вождения с использованием drivingScenario объект. Чтобы смоделировать, визуализировать или изменить этот сценарий в интерактивной среде, попробуйте импортировать drivingScenario объект в приложении «Конструктор сценариев управления» с помощью следующей команды:

drivingScenarioDesigner(scenario)

См. также

Приложения

Объекты

Функции

Связанные темы