В этом примере показано, как программно создать траектории актёра и транспортного средства для сценария вождения с помощью функций Automated Driving Toolbox™. Чтобы создать траектории актёра и транспортного средства в интерактивном режиме, используйте приложение Driving Scenario Designer.
Актёры в сценарии вождения определяются как кубоидные объекты с определенной длиной, шириной и высотой. Актёры также имеют радиолокационное сечение (заданное в dBsm), которое можно уточнить путем определения угловых координат (азимут и повышение). Кубоидные сценарии вождения определяют положение актёра как центр его нижней грани. Сценарии вождения используют эту точку как точку соприкосновения актёра с землей. Эта точка также является вращательным центром актёра.
А транспортное средство - это особый вид актёра, который передвигается на колесах. Транспортные средства обладают тремя дополнительными свойствами, которые регулируют размещение передней и задней осей.
Колесная база - это расстояние между передней и задней осями.
Передний свес - это величина расстояния между передней осью и передней частью транспортного средства.
Задний свес - это расстояние между задней осью и задней частью транспортного средства.
В отличие от актёров, положение транспортного средства находится на земле в центре задней оси. Это положение соответствует естественному центру вращения транспортного средства.
В этой таблице показан типичный список действующих лиц и их соответствующих размерностей:
Этот код строит графики положения актёра с размерностями типичного человека и транспортного средства в сценарии вождения. Актёр и транспортное средство расположены в положениях (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 степеней, что является ориентацией транспортного средства после завершения поворота. Ограничивая траекторию таким образом, чтобы транспортное средство достигло этих ориентаций рыскания, поворот транспортного средства намного резче, чем если бы вы использовали ориентации рыскания по умолчанию.
The 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
объект в приложение Driving Scenario Designer с помощью этой команды:
drivingScenarioDesigner(scenario)
actor
| road
| trajectory
| vehicle