В моем предыдущем посте мы установили Carla, Carla Python API и запустили нашу первую демонстрацию: WASD ваша собственная машина вокруг. Надеюсь, вы ездили до ̶y̶o̶u̶r̶ ̶c̶a̶r̶ ̶r̶a̶n̶ ̶o̶u̶t̶ ̶o̶f̶ ̶f̶u̶e̶l ̶ у вас закончилась энергия!

Прежде чем мы начнем с этого руководства, я хочу сообщить вам, что я отредактировал предыдущее сообщение, чтобы убедиться, что мы работаем с Carla v0.9.14, так как это последняя стабильная сборка и функции, чем в предыдущей v0.9.13. Прошу прощения за путаницу. С этого момента мы будем работать с последней версией: v0.9.14.

Во время вождения, если вы внимательно заглянете в терминал или в окно pygame, вы увидите, что есть много вариантов для игры, таких как Погода, Вручную/Автопилот режим, Датчики и, конечно же, изменение самого эго-транспортного средства. Чтобы использовать все возможности Карлы, мы должны знать эти свойства как мира Карлы, так и самого вашего эго-проводника.

В этом посте я расскажу о некоторых свойствах мира, неигровых персонажей (неигровых персонажей) и эго-транспорта (референс/ваш транспорт). К концу вы должны быть в состоянии запрограммировать предыдущую демонстрацию с вашим собственным выбором свойств. Итак, качаем!

Вид зрителя

Когда мы запускаем ./CarlaUE4.sh на терминале, мы запускаем и запускаем сервер/симулятор Carla. Вы можете перемещаться, используя сами клавиши WASDQE. Этот просмотр позволяет вам увидеть различные свойства симуляции, такие как погода, карта, а также различные транспортные средства на картах.

Когда мы запускаем нашу программу, мы позаботимся о том, чтобы зритель сосредоточился на нашем проводнике эго, чтобы было легче понять, с чего мы начинаем. Если вы хотите изменить положение зрителя, все, что вам нужно сделать, это указать координаты зрителя (положение и ориентацию). Если вы не можете найти правильные координаты, вы всегда можете ПРИСОЕДИНИТЬ зрителя к транспортному средству или любому объекту в мире и переместить зрителя по отношению к нему. (Я сделаю это в разделе «Создание транспортных средств»)

Настройка клиента

Чтобы работать с Carla с помощью API Python, нам нужно подключить клиент Python к серверу Carla. Мы подключаемся к «localhost» с портом по умолчанию 2000, что означает, что мы запускаем и сервер Carla, и клиент Python в одной системе. Вы можете изменить локальный хост на другую систему через IP-адрес. Это поможет вам запустить сервер в мощной системе и использовать свой персональный компьютер для управления средой через Python API.

import carla
import random
import pygame # We will be using this for manual control

# server running on our system with default port 2000

client = carla.Client('localhost',2000) 

Карты Карлы

Carla предоставляет вам 8 карт, которые можно использовать для проверки различных сценариев вождения. Эти карты предлагают множество сценариев вождения, от навигации по круговым развязкам и левым поворотам Мичигана до управления несколькими полосами движения в одном направлении. Вы можете ознакомиться с ними здесь.

# I am choosing the map with a michigan left. 
# Do check out the other maps as well

world = client.load_world('Town06') 

Погодные свойства

Чтобы сделать симуляции максимально приближенными к реальности, одним важным свойством является сохранение реалистичности окружающей среды. Для этого мы используем свойство погоды, которое позволяет нам управлять ориентацией солнца, облачностью, ветром, туманом и т. д. Эти свойства позволяют тестировать такие алгоритмы, как обнаружение объектов и отслеживание, обнаружение дорожек и оценка глубины. в различных условиях. Когда я работал над вышеуказанными приложениями, симуляция была довольно близка к реальному миру даже в условиях низкой освещенности и дождя, что очень круто!

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

# I have changed the weather to a clear noon.

weather = carla.WeatherParameters(
    cloudiness=0.0,
    precipitation=0.0,
    sun_altitude_angle=10.0,
    sun_azimuth_angle = 90.0,
    precipitation_deposits = 0.0,
    wind_intensity = 0.0,
    fog_density = 0.0,
    wetness = 0.0, 
)
world.set_weather(weather)

Спаун автомобиля

Карла предлагает Библиотеку чертежей, в которой есть все активы (актеры), которые могут быть созданы в мире. Здания, которые вы видите вокруг, уличные фонари, пешеходы и автомобили — все это часть библиотеки чертежей. Мы будем порождать наше эго-транспортное средство отсюда. Если вы хотите построить свой собственный мир, вы определенно можете создавать здания и других актеров.

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

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

# First let's get the blueprint library and the spawn points for our world.
# Depending on your Carla version and the map chosen, you get different actors
# and spawn points respectively

bp_lib = world.get_blueprint_library() 
spawn_points = world.get_map().get_spawn_points()


# I am spawning an Audi etron here. You can check out the blueprint library
# to spawn your vehicle of choice. Also we spawn in a random safe point 79

vehicle_bp = bp_lib.find('vehicle.audi.etron')
ego_vehicle = world.try_spawn_actor(vehicle_bp, spawn_points[79]) 

# Let's position the spectator just behind the vehicle
# Carla.Transform has two parameters - Location and Rotation. We use this to
# to position the spectator by going 4 metres behind and 2.5 metres above the 
# ego_vehicle

spectator = world.get_spectator()
transform = carla.Transform(ego_vehicle.get_transform().transform(carla.Location(x=-4,z=2.5)),ego_vehicle.get_transform().rotation)
spectator.set_transform(transform)

# If you want to position the your_actor with just the coordinates, 
# you can use the below codes.
# location = carla.Location(x=0, y=0, z=30)
# rotation = carla.Rotation(roll=0, pitch=-30, yaw=180)
# transform = carla.Transform(location, rotation)
# your_actor.set_transform(transform)

Спаун NPC

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

Чтобы вы могли создать эти автомобили, просто проверьте приведенный ниже код.

# Let's add some traffic. I am spawning 200 vehicle actors at random spawn_points
# (includes all kinds of automobiles). The method try_spawn_actor makes sure
# you can spawn it without messing with any existing actors.

for i in range(200):  
    vehicle_bp = random.choice(bp_lib.filter('vehicle')) 
    npc = world.try_spawn_actor(vehicle_bp, random.choice(spawn_points))


#Set traffic in motion
for v in world.get_actors().filter('*vehicle*'): 
    v.set_autopilot(True) # This makes all the vehicles function in autopilot
ego_vehicle.set_autopilot(False) # Allows you to drive the ego_vehicle manually

Хотя мы настроили автопилот на истину, мы еще не видим, как машины движутся. Нам нужна петля, чтобы увидеть, как они двигаются. Мы создадим нашу функцию ручного управления и передадим ее внутрь цикла.

Свойства автомобиля

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

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

## Vehicle PHYSICS property

# Create Wheels Physics Control
front_left_wheel  = carla.WheelPhysicsControl(tire_friction=2.0, damping_rate=1.5, max_steer_angle=70.0, long_stiff_value=1000)
front_right_wheel = carla.WheelPhysicsControl(tire_friction=2.0, damping_rate=1.5, max_steer_angle=70.0, long_stiff_value=1000)
rear_left_wheel   = carla.WheelPhysicsControl(tire_friction=3.0, damping_rate=1.5, max_steer_angle=0.0,  long_stiff_value=1000)
rear_right_wheel  = carla.WheelPhysicsControl(tire_friction=3.0, damping_rate=1.5, max_steer_angle=0.0,  long_stiff_value=1000) # Reducing friction increases idle throttle 

wheels = [front_left_wheel, front_right_wheel, rear_left_wheel, rear_right_wheel]

# Change Vehicle Physics Control parameters of the vehicle
physics_control = vehicle.get_physics_control()
physics_control.torque_curve = [carla.Vector2D(x=0, y=400), carla.Vector2D(x=1300, y=600)]
physics_control.max_rpm = 10000
physics_control.moi = 1.0
physics_control.damping_rate_full_throttle = 0.0
physics_control.use_gear_autobox = True
physics_control.gear_switch_time = 0.5
physics_control.clutch_strength = 10
physics_control.mass = 10000
physics_control.drag_coefficient = 0.25
physics_control.steering_curve = [carla.Vector2D(x=0, y=1), carla.Vector2D(x=100, y=1), carla.Vector2D(x=300, y=1)]
physics_control.use_sweep_wheel_collision = True
physics_control.wheels = wheels

# Apply Vehicle Physics Control for the vehicle
vehicle.apply_physics_control(physics_control)

Ручное управление

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

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

В приведенном ниже коде команды клавиатуры разбираются на соответствующие факторы для управления транспортным средством:

pygame.init() #initialising

# Set up the Pygame display
size = (640, 480)
pygame.display.set_caption("CARLA Manual Control")
screen = pygame.display.set_mode(size)

# Set up the control object and loop until the user exits the script
control = carla.VehicleControl()
clock = pygame.time.Clock()
done = False

while not done:
    # Get keyboard input and handle it
    keys = pygame.key.get_pressed() 
    
    # The values are directly from the manual control code which we ran in the
    # last post. Just implemented just the throttle, brake and steer
    # You can add reverse and gear shifting features directly from that code

    if keys[pygame.K_UP] or keys[pygame.K_w]:
        control.throttle = min(control.throttle + 0.05, 1.0)
    else:
        control.throttle = 0.0

    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        control.brake = min(control.brake + 0.2, 1.0)
    else:
        control.brake = 0.0

    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        control.steer = max(control.steer - 0.05, -1.0)
    elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        control.steer = min(control.steer + 0.05, 1.0)
    else:
        control.steer = 0.0

    control.hand_brake = keys[pygame.K_SPACE]

    # Apply the control to the ego vehicle and tick the simulation
    ego_vehicle.apply_control(control)
    world.tick()

    # Update the display and check for the quit event
    pygame.display.flip()
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # Sleep to ensure consistent loop timing
    clock.tick(60)

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

Заворачивать

Объединив все вышеперечисленные коды, мы можем получить полностью функциональную среду с ручным управлением вашей машиной и другими NPC, работающими на автопилоте:

import carla
import random
import pygame



client = carla.Client('localhost',2000)
world = client.load_world('Town06')
weather = carla.WeatherParameters(
    cloudiness=0.0,
    precipitation=0.0,
    sun_altitude_angle=10.0,
    sun_azimuth_angle = 70.0,
    precipitation_deposits = 0.0,
    wind_intensity = 0.0,
    fog_density = 0.0,
    wetness = 0.0, 
)
world.set_weather(weather)

bp_lib = world.get_blueprint_library() 
spawn_points = world.get_map().get_spawn_points()

vehicle_bp = bp_lib.find('vehicle.audi.etron')
ego_vehicle = world.try_spawn_actor(vehicle_bp, spawn_points[79])

spectator = world.get_spectator()
transform = carla.Transform(ego_vehicle.get_transform().transform(carla.Location(x=-4,z=2.5)),ego_vehicle.get_transform().rotation)
spectator.set_transform(transform)

for i in range(200):  
    vehicle_bp = random.choice(bp_lib.filter('vehicle')) 
    npc = world.try_spawn_actor(vehicle_bp, random.choice(spawn_points))


for v in world.get_actors().filter('*vehicle*'): 
    v.set_autopilot(True) 
ego_vehicle.set_autopilot(False) 


pygame.init() 

size = (640, 480)
pygame.display.set_caption("CARLA Manual Control")
screen = pygame.display.set_mode(size)


control = carla.VehicleControl()
clock = pygame.time.Clock()
done = False

while not done:

    keys = pygame.key.get_pressed() 

    if keys[pygame.K_UP] or keys[pygame.K_w]:
        control.throttle = min(control.throttle + 0.05, 1.0)
    else:
        control.throttle = 0.0

    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        control.brake = min(control.brake + 0.2, 1.0)
    else:
        control.brake = 0.0

    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        control.steer = max(control.steer - 0.05, -1.0)
    elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        control.steer = min(control.steer + 0.05, 1.0)
    else:
        control.steer = 0.0

    control.hand_brake = keys[pygame.K_SPACE]

    # Apply the control to the ego vehicle and tick the simulation
    ego_vehicle.apply_control(control)
    world.tick()

    # Update the display and check for the quit event
    pygame.display.flip()
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    # Sleep to ensure consistent loop timing
    clock.tick(60)

Не забудьте нажать на окно Pygame, чтобы иметь возможность управлять автомобилем с помощью клавиатуры. Для управления можно использовать WASD или клавиши со стрелками.

На этом посте базовая настройка Carla Environment и Actors завершена. В следующем посте я напишу о различных датчиках в Carla и о том, как получить к ним доступ и сохранить выходные данные. Будет супер весело! До скорой встречи :)