В этом примере показано, как программно создать агента и траектории транспортного средства для ведущего сценария с помощью функций 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]
По умолчанию график сценария показывает вид сверху агентов. Чтобы изменить это представление, можно управлять графиком сценария в интерактивном режиме путем выбора Camera Toolbar, доступного в меню View графика. В качестве альтернативы можно программно управлять графиком при помощи функций, таких как xlim
ylim
zlim
, и view
. Эти функции позволяют вам сравнить относительные высоты агентов.
zlim([0 4]) view(-60,30)
При помощи smoothTrajectory
функция, можно задать агентов и транспортные средства, чтобы следовать за путем вдоль набора waypoints в наборе данных скоростей. Когда вы задаете waypoints, smoothTrajectory
функционируйте соответствует кусочной кривой клотоиды к каждому сегменту между waypoints, сохраняя искривление между точками. Кривые клотоиды имеют искривление, которое варьируется линейно с путешествовавшим расстоянием, который создает очень простую траекторию для драйверов, чтобы перейти при перемещении при постоянной скорости.
По умолчанию траектории агента не имеют никакого искривления в конечных точках. Чтобы завершить цикл, задайте идентичный первый и последний waypoints.
Чтобы следовать за целой траекторией на постоянной скорости, задайте скорость как скалярное значение.
Транспортные средства проходят через кривую между waypoints в их вращательных центрах. Поэтому, чтобы вместить длину транспортного средства перед и позади задней оси в процессе моделирования, можно возместить начало и окончание waypoints. Возмещение этих waypoints соответствует транспортному средству полностью в дороге в ее конечных точках.
Если транспортное средство должно повернуться быстро, чтобы избежать препятствия, поместить две точки близко друг к другу в намеченное направление перемещения. Этот пример показывает транспортное средство, поворачивающееся быстро в двух местах, но в противном случае держащееся обычно.
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]
В качестве альтернативы можно использовать меньше waypoints в таких поворотах путем явной установки угла ориентации рыскания транспортного средства в каждом waypoint. Рыскание положительно в направлении против часовой стрелки, и его модули в градусах. В этом изменении предыдущего примера траектория ограничивается таким образом, что транспортное средство под –15 углами степени после перемещения в левый маршрут. Путем установки waypoint на NaN
, smoothTrajectory
функциональные значения по умолчанию к подбору кривой клотоиде изгибаются к сегменту, ведущему это waypoint. В этом случае тот сегмент является итоговым в траектории.
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)
Для крутых поворотов, или задать waypoints близко друг к другу в начале и конце поворота или явным образом устанавливают рыскание транспортного средства в каждом waypoint. Эта установка искренне представляет внезапное изменение в регулировании.
В этом примере транспортное средство делает резкий левый поворот на пересечении, использующем явным образом установленные значения рыскания. В первом waypoint и waypoint перед поворотом, транспортное средство имеет рыскание 0 градусов. В waypoint после поворота и финала waypoint, транспортное средство имеет рыскание 90 градусов, которое является ориентацией транспортного средства после завершения поворота. Путем ограничения траектории, таким образом, что транспортное средство достигает этих ориентаций рыскания, поворот транспортного средства намного более резок, чем если бы вы использовали ориентации рыскания по умолчанию.
smoothTrajectory
функция генерирует сглаженную, ограниченную толчками траекторию без разрывов на ускорении между waypoints. Когда различные скорости транспортного средства, такой как путем замедления в повороте, расстояния между waypoints должны быть достаточно большими для транспортного средства достигнуть желаемой скорости при поддержании сглаженного ускорения повсюду. В качестве альтернативы на более коротких расстояниях, изменения в скоростях должны относительно быть малыми. В этом примере транспортное средство замедляется от скорости 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
Чтобы задать противоположные ведущие движения, задайте траекторию с отрицательными скоростями. При переключении между прямыми и противоположными движениями необходимо задать waypoint между этими движениями, который имеет скорость 0
. В этом waypoint замедляется транспортное средство, пока это не прибывает в полную остановку, и затем изменяет направления движения.
Этот пример подробно останавливается на предыдущем примере. На этот раз, после завершения левого поворота, транспортное средство отходит назад и инвертирует на пересечении. Затем транспортное средство переключает направление снова и диски вперед, пока это не останавливается в противоположном маршруте от того, где это запустилось. Поскольку перемещения транспортного средства в низких скоростях, чтобы ускорить симуляцию, задают более короткую паузу между обновлениями симуляции.
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
| vehicle
| road
| trajectory