Создайте траектории агента и автомобиля

Этот пример показывает, как создать агента и траектории автомобиля для ведущего сценария с помощью функций Automated Driving Toolbox™. Чтобы создать агента и траектории автомобиля в интерактивном режиме вместо этого, используйте приложение Driving Scenario Designer.

Агенты и автомобили

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

Автомобиль является специальным видом агента, который перемещается в колеса. Автомобили обладают тремя дополнительными свойствами, которые управляют размещением передней и задней оси. Колесная база является расстоянием между передними и задними осями. Передний нависающий край является количеством расстояния между передней стороной автомобиля и передней осью; с другой стороны задний нависающий край является расстоянием между задней осью и задней частью автомобиля.

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

Типичный список агентов и их соответствующих размерностей появляется ниже:

Следующий пример строит положение агента с размерностями типичного человека и автомобиля в сценарии в положениях (0,2) и (0,-2), соответственно:

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

  Actor with properties:

               ActorID: 1
               ClassID: 0
              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
            RCSPattern: [2x2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]


passingCar = 

  Vehicle with properties:

               ActorID: 2
               ClassID: 0
              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
            RCSPattern: [2x2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]
         FrontOverhang: 0.9000
          RearOverhang: 1
             Wheelbase: 2.8000

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

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

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

Можно дать агентам команду (включая автомобили) следовать за путем вдоль набора waypoints в наборе данных скоростей. Когда вы задаете waypoints, кусочная кривая клотоиды подходящая промежуточный каждый сегмент, где искривление сохраняется промежуточные точки. Кривые клотоиды используются, потому что у них есть искривление, которое отличается линейно с путешествовавшим расстоянием, который делает очень простой контур для драйверов, чтобы перейти при перемещении в постоянной скорости.

По умолчанию траектории агента не будут иметь никакого искривления в конечных точках. Чтобы завершить цикл, повторите первую и последнюю точку.

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

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

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

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

passingCar = vehicle(s);
waypoints = [1 -1.5; 16.36 -2.5; 17.35 -2.765; 23.83 -2.01; 24.9 -2.4; 50.5 -16.7];
velocity = 15;
trajectory(passingCar, waypoints, velocity);

Превращение и торможение на пересечениях

Для крутых поворотов задайте waypoints близко друг к другу в запуске и конце поворота. Тем путем внезапное изменение в регулировании может быть представлено искренне.

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

Чтобы дать автомобилям команду следовать за кривыми кусочного постоянного ускорения, задайте скорости в каждом waypoint. В этом примере ниже, автомобиль замедляется от скорости 20 м/с и прибывает в краткую полную остановку в местоположении (-7,-1.5). Автомобиль затем постепенно ускоряется назад к его исходной скорости:

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

passingCar = vehicle(s);

% take transpose so waypoints align with velocities
waypoints = [-24.0 -7.0 -3.5  -3.0  1.5  1.5  1.5
              -1.5 -1.5 -1.5  -1.5  3.0  3.5 21.0]';
velocities = [20.0  0.0  5.0   5.0 10.0 12.0 20.0];
trajectory(passingCar, waypoints,velocities);

plot(s,'Waypoints','on');

Перемещение автомобилей

Однажды все дороги, агенты и траектории агента заданы, можно инкрементно постепенно увеличить положение каждого агента путем вызова метода advance ведущего сценария в цикле:

while advance(s)
    pause(0.01);
end

Дополнительная информация

Для примера на ведущем сценарии см. Ведущий Пример по Сценарию.

Смотрите также

Приложения

Объекты

Функции

Похожие темы