当前位置: 首页 > 工具软件 > CARLA > 使用案例 >

CARLA核心概念

查宜民
2023-12-01

World and client

World 和client是CARLA的两个基本要素,是操作仿真及其参与者的必要抽象概念。
The client
client是CARLA体系结构中的主要元素之一。它们连接到server、检索信息以及发送命令,这些都是通过脚本完成的。客户端与world连接,然后与操作simulation。除此之外,client还可以访问高级CARLA模块、特性,还可以使用批处理命令。
client creation
需要两个参数,第一个是IP地址,第二个是用于连接server的TCP端口,第三个是可选参数用于设置工作线程的数量,默认设置为all(0)。

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

默认情况下,CARLA使用本地主机IP和端口2000进行连接,但这些可以随意更改。
创建client后,设置time-out。如果连接失败,将返回一个错误.

client.set_timeout(10.0) # seconds

可以连接多个客户端,因为通常有多个脚本同时运行。在具有高级CARLA特性的多客户端方案中工作,如traffic manager,必然会使通信变得更加复杂。
World connection
Client通过下面命令可以很容易的连接的到world

world = client.get_world()

从客户端可以得到很多maps以改变当前所选,那么当前的world将会被摧毁并新建一个world

print(client.get_available_maps())
...
world = client.load_world('Town01')
#client.reload_world() creates a new instance of the world with the same map.

[’/Game/Carla/Maps/Town01’, ‘/Game/Carla/Maps/Town01_Opt’, ‘/Game/Carla/Maps/Town02’, ‘/Game/Carla/Maps/Town02_Opt’, ‘/Game/Carla/Maps/Town03’, ‘/Game/Carla/Maps/Town03_Opt’, ‘/Game/Carla/Maps/Town04’, ‘/Game/Carla/Maps/Town04_Opt’, ‘/Game/Carla/Maps/Town05’, ‘/Game/Carla/Maps/Town05_Opt’, ‘/Game/Carla/Maps/Town10HD’, ‘/Game/Carla/Maps/Town10HD_Opt’]

每个world中的对象都有一个id。每次客户端调用load_world()或reload_world()时,前一world个就会被销毁。一个新的world从头开始,虚幻引擎UE在这个过程中没有重新启动。
Using commands
命令行有一些最常见的CARLA方法的适配,也可以批量应用。例如,命令SetAutopilot等同于vehicle. set_autopilot(),启用车辆的自动驾驶。也可以使用批量的Client方法。如apply_batch或Client.apply_batch_sync(),就可以在一个仿真步长内处理多个命令。

client.apply_batch([carla.command.DestroyActor(x) for x in vehicles_list])

Other client utilities
client对象的主要目的是获取或更改世界,并应用命令。不过,它还提供了对一些附加特性。
Traffic manager:这个模块负责每一辆自动驾驶的车辆,以重现城市交通。
Recorder:允许重现以前的模拟,使用快照汇总每帧的模拟状态。
The world
simulation的主要控制者。它的实例由client检索。它不包含world本身的模型,这些模型是Map类的一部分。相反,大多数信息和一般设置都可以从这个类中访问,例如:
• Actors in the simulation and the spectator.
• Blueprint library.
• Map.
• Simulation settings.
• Snapshots.
• Weather and light manager.
Actors
在world中有与参与者相关的不同方法,这些方法允许不同的功能。
• Spawn actors (but not destroy them).
• Get every actor on scene, or find one in particular.
• Access the blueprint library.
• Access the spectator actor, the simulation’s point of view.
• Retrieve a random location that is fitting to spawn an actor.
Weather
weather本身不是一个类,而是一组可从世界获取的参数。参数包括太阳方向、云、风、雾等等。

weather = carla.WeatherParameters(
    cloudiness=80.0,
    precipitation=30.0,
    sun_altitude_angle=70.0)

world.set_weather(weather)

print(world.get_weather())

有些天气参数可以预设在world中

world.set_weather(carla.WeatherParameters.WetCloudySunset)

在Carla中也可以自己定制weather,这就涉及到两个脚本:

  1. environment.py(在PythonAPI/util中)-提供对天气和光线参数的访问,以便可以实时更改这些参数。
  2. dynamic_weather.py(在PythonAPI/examples中)-启用由开发人员为每个CARLA地图准备的特定天气循环。
    Lights
    当仿真进入夜间模式时,路灯会自动打开。 灯光由地图的开发人员放置,并可作为 carla.Light 对象访问。 颜色和强度等属性可以随意更改。 carla.LightState 类型的变量 light_state 允许在一次调用中设置所有这些。
    路灯使用 carla.LightGroup 类型的属性 light_group 进行分类。 这允许将灯分类为路灯、建筑灯……可以检索 carla.LightManager 的一个实例以在一次调用中处理一组灯。
# Get the light manager and lights
lmanager = world.get_lightmanager()
mylights = lmanager.get_all_lights()

# Custom a specific light
light01 = mylights[0]
light01.turn_on()
light01.set_intensity(100.0)
state01 = carla.LightState(200.0,red,carla.LightGroup.Building,True)
light01.set_light_state(state01)

# Custom a group of lights
my_lights = lmanager.get_light_group(carla.LightGroup.Building)
lmanager.turn_on(my_lights)
lmanager.set_color(my_lights,carla.Color(255,0,0))
lmanager.set_intensities(my_lights,list_of_intensities)

Vehicle lights必须由用户打开/关闭。 每辆车都有一组在 carla.VehicleLightState 中列出的灯。 到目前为止,并非所有车辆都集成了灯光。 以下是撰写本文时可用的列表。
Bikes:它们都有一个前后位置灯。
Motorcycles: Yamaha and Harley Davidson models
Cars: 奥迪TT、雪佛兰、道奇(警车)、Etron、林肯、野马、特斯拉3S、大众T2。
可以使用方法 carla.Vehicle.get_light_state 和 carla.Vehicle.set_light_state 随时获取和更新车辆的灯光, 这些使用二进制操作来自定义灯光设置。

# Turn on position lights
current_lights = carla.VehicleLightState.NONE
current_lights |= carla.VehicleLightState.Position
vehicle.set_light_state(current_lights)

World 对象有一个 carla.DebugHelper 对象作为公共属性。 它允许在仿真过程中绘制不同的形状,用于跟踪正在发生的事件。 以下示例将在演员Actor的位置和旋转处绘制一个红色框。

debug = world.debug
debug.draw_box(carla.BoundingBox(actor_snapshot.get_transform().location,carla.Vector3D(0.5,0.5,2)),actor_snapshot.get_transform().rotation,0.05,carla.Color(255,0,0,0),0)

World snapshots
包含仿真中每个角色在单个帧中的状态即为一张静止图像。 信息来自相同的模拟步骤,即使在异步模式下也是如此。

# Retrieve a snapshot of the world at current frame.
world_snapshot = world.get_snapshot()

carla.WorldSnapshot 包含一个 carla.Timestamp 和一个 carla.ActorSnapshot 列表。 可以使用Actor的ID 搜索Actor的快照。 快照列出了出现在其中的Actor的 ID。

timestamp = world_snapshot.timestamp # Get the time reference 

for actor_snapshot in world_snapshot: # Get the actor and the snapshot information
    actual_actor = world.get_actor(actor_snapshot.id)
    actor_snapshot.get_transform()
    actor_snapshot.get_velocity()
    actor_snapshot.get_angular_velocity()
    actor_snapshot.get_acceleration()  

actor_snapshot = world_snapshot.find(actual_actor.id) # Get an actor's snapshot

World settings
World可以访问一些用于模拟的高级配置。 这些决定了渲染条件、模拟时间步长以及客户端和服务器之间的同步。 它们可以从助手类 carla.WorldSettings 中访问。

Actors and blueprints

Actor不仅包括车辆和步行者,还包括传感器、交通标志、交通信号灯和视角。 对如何操作它们有充分的了解是至关重要的。
Blueprints
这些布局允许用户将新的Actor顺利加入仿真。 它们是带有动画和一系列属性的已制作模型。 其中一些是可修改的,而另一些则不能。 这些属性包括车辆颜色、激光雷达传感器中的通道数量、步行者的速度等等。
Managing the blueprint library
carla.BlueprintLibrary 类包含一个 carla.ActorBlueprint 元素列表。 world对象可以提供对它的访问。

blueprint_library = world.get_blueprint_library()

blueprint有一个 ID 来识别它们以及由此产生的Actor。 可以读取该库以查找特定 ID、随机选择blueprint或使用通配符模式过滤结果。

# Find a specific blueprint.
collision_sensor_bp = blueprint_library.find('sensor.other.collision')
# Choose a vehicle blueprint at random.
vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))

除此之外,每个 carla.ActorBlueprint 都有一系列 carla.ActorAttribute 可以get和set。

is_bike = [vehicle.get_attribute('number_of_wheels') == 2]
if(is_bike)
vehicle.set_attribute('color', '255,0,0')

属性有一个 carla.ActorAttributeType 变量。 它从枚举列表中声明其类型。 此外,可修改属性带有推荐值列表。

for attr in blueprint:
    if attr.is_modifiable:
        blueprint.set_attribute(attr.id, random.choice(attr.recommended_values))

Actor life cycle
Spawning

world对象负责生成actors并跟踪它们。 生成只需要一个blueprint和一个 carla.Transform,说明 actor 的位置和旋转角。
world有两种不同的方法来产生Actors
如果生成失败,spawn_actor() 会引发异常。
如果生成失败,try_spawn_actor() 将返回 None。

transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180))
actor = world.spawn_actor(blueprint, transform)

如果在指定位置发生碰撞,actor 将不会生成。 无论这发生在静态对象还是其他Actor身上。 可以尝试避免这些不希望的产碰撞产生。

map.get_spawn_points() 对于车辆。 返回推荐的生成点列表。
spawn_points = world.get_map().get_spawn_points()
world.get_random_location()对于步行者。 返回人行道上的随机点。 同样的方法用于为步行者设置目标位置。
spawn_point = carla.Transform()
spawn_point.location = world.get_random_location_from_navigation()

一个actor在生成时可以附加到另一个actor上。 Actor跟随他们所依附的Actor。 这对传感器特别有用。 附件可以是刚性的(适合检索精确数据),也可以根据其父项轻松移动。 它由助手类 carla.AttachmentType 定义。
将摄像头固定在车辆上,因此它们的相对位置保持固定。

camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle, carla.AttachmentType.Rigid)

生成后,world对象会将Actor添加到列表中。 这可以很容易地搜索或迭代。

actor_list = world.get_actors()
# Find an actor by id.
actor = actor_list.find(id)
# Print the location of all the speed limit signs in the world.
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
print(speed_sign.get_location())

Handling
carla.Actor 主要由 get() 和 set() 方法组成,用于管理地图周围的Actor。

print(actor.get_acceleration())
print(actor.get_velocity())

location = actor.get_location()
location.z += 10.0
actor.set_location(location)

可以禁用演员的物理特性以将其冻结在适当的位置。

actor.set_simulate_physics(False)

除此之外,Actor也有他们的blueprint蓝图提供的标签。 这些对语义分割传感器最有用。
Destruction
当 Python 脚本完成时,Actor 不会被销毁。 他们必须明确地摧毁自己。

destroyed_sucessfully = actor.destroy() # Returns True if successful

Types of actors
Sensors
此示例生成一个摄像头传感器,将其附加到车辆上,并告诉摄像头将生成的图像保存到磁盘。

camera_bp = blueprint_library.find('sensor.camera.rgb')
camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle)
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))

传感器也有blueprint, 设置属性至关重要。
大多数传感器将连接到车辆上以收集有关其周围环境的信息。
传感器监听数据。 当接收到数据时,它们调用一个用 Lambda 表达式描述的函数。
Spectator
由虚幻引擎放置以提供游戏内视角。 它可以用来移动模拟器窗口的视图。 以下示例将移动视角,以将视线指向所需的车辆。

spectator = world.get_spectator()
transform = vehicle.get_transform()
spectator.set_transform(carla.Transform(transform.location + carla.Location(z=50),
carla.Rotation(pitch=-90)))

Traffic signs and traffic lights
到目前为止,在 CARLA 中,只有停靠点、让路和红绿灯被认为是Actor。 其余的 OpenDRIVE 标志可从 API 作为 carla.Landmark 访问。 使用这些实例可以访问它们的信息,但它们在模拟中不作为参与者存在。
使用 OpenDRIVE 文件中的信息自动生成模拟开始、停止、产量和交通信号灯。 这些都无法在blueprint库中找到,因此无法生成。
道路地图本身并未定义交通标志,相反,他们有一个 carla.BoundingBox 来影响其中的车辆。

#Get the traffic light affecting a vehicle
if vehicle_actor.is_at_traffic_light():
traffic_light = vehicle_actor.get_traffic_light()

交通信号灯出现在路口。 与任何参与者一样,他们有自己的唯一 ID,但也有交汇点的组 ID。 为了识别同一组中的交通灯,使用了杆 ID。

同一组中的红绿灯遵循一个循环。 第一个设置为绿色,而其余的则保持为红色。 活跃的在绿色、黄色和红色上花费几秒钟,所以有一段时间所有的灯都是红色的。 然后,下一个红绿灯开始循环,前一个红绿灯与其他红绿灯一起冻结。

可以使用 API 设置交通灯的状态。 在每个状态上花费的秒数也是如此。 carla.TrafficLightState 将可能的状态描述为一系列枚举值。

#Change a red traffic light to green
if traffic_light.get_state() == carla.TrafficLightState.Red:
    traffic_light.set_state(carla.TrafficLightState.Green)
traffic_light.set_set_green_time(4.0)

Vehicles
carla.Vehicle 是一种特殊类型的Actor, 它包含模拟轮式车辆物理特性的特殊内部组件。 这是通过应用四种不同的控件来实现的:
carla.VehicleControl 为油门、转向、刹车等驾驶命令提供输入。
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
carla.VehiclePhysicsControl 定义了车辆的物理属性并包含另外两个控制器:
carla.GearPhysicsControl 控制挡位。
carla.WheelPhysicsControl 提供对每个车轮的特定控制。

vehicle.apply_physics_control(carla.VehiclePhysicsControl(max_rpm = 5000.0, center_of_mass = carla.Vector3D(0.0, 0.0, 0.0), torque_curve=[[0,400],[5000,400]]))

车辆有一个 carla.BoundingBox 封装它们。 此边界框允许将物理应用到车辆并检测碰撞。

  box = vehicle.bounding_box
    print(box.location)         # Location relative to the vehicle.
print(box.extent)           # XYZ half-box extents in meters.

通过启用扫描轮碰撞参数可以改善车轮的物理特性。 默认的车轮物理场对每个车轮使用从轴到地板的单射线投射,但是当启用扫描车轮碰撞时,会检查车轮的整个体积以防止碰撞。 它可以这样启用:

physics_control = vehicle.get_physics_control()
physics_control.use_sweep_wheel_collision = True
vehicle.apply_physics_control(physics_control)

车辆包括其他独有的功能:
自动驾驶模式将为车辆订阅交通管理器以模拟真实的城市状况。 这个模块是硬编码的,不是基于机器学习的。

vehicle.set_autopilot(True)

Walkers

carla.Walker 的工作方式与车辆类似。 对它们的控制由控制器提供。
carla.WalkerControl 以一定的方向和速度移动行人。 它还允许他们跳跃。
carla.WalkerBoneControl 提供对 3D 骨架的控制。
Walkers可以由人工智能控制。 他们没有自动驾驶模式。 carla.WalkerAIController Actor 围绕它所连接的 Actor 移动。

walker_controller_bp = world.get_blueprint_library().find('controller.ai.walker')
world.SpawnActor(walker_controller_bp, carla.Transform(), parent_walker)

每个 AI 控制器都需要初始化、目标和速度(可选)。 停止控制器的工作方式相同。

ai_controller.start()
ai_controller.go_to_location(world.get_random_location_from_navigation())
ai_controller.set_max_speed(1 + random.random())  # Between 1 and 2 m/s (default is 1.4 m/s).
...
ai_controller.stop()

当步行者到达目标位置时,他们会自动步行到另一个随机点。 如果无法到达目标点,步行者将前往离他们当前位置最近的点。

 类似资料: