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,这就涉及到两个脚本:
# 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 中访问。
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)
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()
当步行者到达目标位置时,他们会自动步行到另一个随机点。 如果无法到达目标点,步行者将前往离他们当前位置最近的点。