Traffic Manager(TM)是在模拟中以自动驾驶模式控制车辆的模块。它的目标是用真实的城市交通条件填充模拟。用户可以自定义一些行为,例如,设置特定的学习环境。
交通管理器的运行逻辑大致为:
Agent Lifecycle & State Management (ALSM):从Carla中获取车辆及行人信息,并保持更新。
vehicle registry:管理Carla中车辆和行人的信息,包括由交通管理器控制的自动驾驶车辆和不受交通管理器控制的车辆(行人)组成。
simulation state:存储Carla中所有车辆和行人的位置,速度以及附加信息
计算每辆自动驾驶汽车的运动
由定位,碰撞检测,交通信号灯检测,运动规划,车辆灯光状态变化五个阶段组成
在一个时间步中批量设置车辆的状态
在Carla中,由交通管理器控制的车辆会产生以下行为:
可以通过Python API调整TM行为。有关特定方法,请参见Python API文档的TM部分。以下是通过API可以实现的功能的一般总结:
Topic话题 | Description描述 |
---|---|
General: 概述: |
- 创建一个连接到端口的TM实例。 - 检查TM连接的端口。 |
Safety conditions: 安全条件: |
- 设置停止车辆之间的最小距离(对于单个车辆或所有车辆)。这将影响最小移动距离。 - 将所需速度设置为当前速度限制的百分比(适用于单个车辆或所有车辆)。 - 重置交通灯 |
Collision managing: 冲突管理: |
- 启用/禁用车辆与特定参与者之间的碰撞。 - 让一辆车忽略所有其他车辆。 - 让一辆车忽略所有的步行者。 - 让车辆无视所有交通灯。 |
Lane changes: 车道变更: |
-- 强制变道,忽略可能的碰撞。 - 启用/禁用车辆的车道变更。 |
Hybrid physics mode: 混合物理模式: |
- 启用/禁用混合物理模式。 - 更改启用物理的半径。 |
TM实例由carla.Client
创建,传递要使用的端口。默认端口为8000
。
tm = client.get_trafficmanager(port)
要为一组车辆启用自动驾驶,请检索TM实例的端口并将set_autopilot
设置为True
,同时通过TM端口。如果没有提供端口,它将尝试连接到默认端口(8000
)中的TM。如果TM不存在,它将创建一个:
tm_port = tm.get_port()
for v in vehicles_list:
v.set_autopilot(True,tm_port)
generate_traffic.py
中的/PythonAPI/examples
脚本提供了一个示例,说明如何使用作为脚本参数传递的端口创建一个TM实例,并通过将自动驾驶仪批量设置为True
来注册每辆衍生到它的车辆:
traffic_manager = client.get_trafficmanager(args.tm-port)
tm_port = traffic_manager.get_port()
...
batch.append(SpawnActor(blueprint, transform).then(SetAutopilot(FutureActor, True,tm_port)))
...
traffic_manager.global_percentage_speed_difference(30.0)
为特定车辆配置了危险行为,因此它将忽略所有交通信号灯,与其他车辆没有安全距离,并以比当前速度限制快20%的速度行驶:
tm = client.get_trafficmanager(port)
tm_port = tm.get_port()
for v in my_vehicles:
v.set_autopilot(True,tm_port)
danger_car = my_vehicles[0]
tm.ignore_lights_percentage(danger_car,100)
tm.distance_to_leading_vehicle(danger_car,0)
tm.vehicle_percentage_speed_difference(danger_car,-20)
下面的示例将相同的车辆列表设置为自动驾驶,但将其配置为中等驾驶行为。车辆行驶速度比现行限速慢80%,与其他车辆之间至少留有5米距离,从不进行变道:
tm = client.get_trafficmanager(port)
tm_port = tm.get_port()
for v in my_vehicles:
v.set_autopilot(True,tm_port)
danger_car = my_vehicles[0]
tm.global_distance_to_leading_vehicle(5)
tm.global_percentage_speed_difference(80)
for v in my_vehicles:
tm.auto_lane_change(v,False)
默认情况下,车灯(刹车、转向指示灯等)由TM管理的车辆从未更新。可以委托TM更新给定车辆施动者的车灯:
tm = client.get_trafficmanager(port)
for actor in my_vehicles:
tm.update_vehicle_lights(actor, True)
client.apply_batch([carla.command.DestroyActor(x) for x in vehicles_list])
TM被设计为在同步模式下工作。CARLA服务器和TM都应设置为同步,以便正常工作。在异步模式下使用TM可能会导致意外和不希望的结果,但是,如果需要异步模式,则仿真至少应以20-30 fps运行。
# Set the simulation to sync mode
init_settings = world.get_settings()
settings = world.get_settings()
settings.synchronous_mode = True
# After that, set the TM to sync mode
my_tm.set_synchronous_mode(True)
...
# Tick the world in the same client
world.apply_settings(init_settings)
world.tick()
...
# Always disable sync mode before the script ends to prevent the server blocking whilst waiting for a tick
settings.synchronous_mode = False
my_tm.set_synchronous_mode(False)
在确定性模式下,TM将在相同的条件下产生相同的结果和行为。不要把决定论误认为是记录器。虽然记录器允许您存储模拟的日志以进行回放,但确定性确保只要保持相同的条件,TM在脚本的不同执行中始终具有相同的输出。
确定性模式仅在同步模式下可用。在异步模式下,对模拟的控制较少,无法实现确定性。
要启用确定性模式,请使用以下方法:
my_tm.set_random_device_seed(seed_value)
seed_value
是将从中生成随机数的int
数。值本身并不相关,但相同的值将始终导致相同的输出。具有相同条件并使用相同种子值的两个模拟将是确定性的。
要在多个模拟运行中保持确定性,必须为每个模拟设置种子。例如,每次重新加载世界时,必须再次设置种子:
client.reload_world()
my_tm.set_random_device_seed(seed_value)
混合模式允许用户禁用所有自动驾驶车辆的大多数物理计算,或者禁用标记为hero
的车辆的特定半径之外的自动驾驶车辆。这消除了模拟中的车辆物理瓶颈。物理学失效的载具将通过远距传送移动。保持线性加速度的基本计算,以确保位置更新和车辆速度保持现实,并在车辆上切换物理计算。
混合模式使用Actor.set_simulate_physics()方法切换物理计算。默认情况下,该选项处于禁用状态。有两个选项可以启用它:
TrafficManager.set_hybrid_physics_mode(True)-此方法为调用它的TM对象启用混合模式。
要修改混合模式的行为,请使用以下两个参数:
半径(默认值= 50米)-半径相对于标记为hero
的车辆。所有在此半径内的车辆将启用物理;半径外的车辆将禁用物理。使用traffic_manager.set_hybrid_physics_radius(r)修改半径的大小。
Hero vehicle英雄车 — A vehicle tagged with - 一辆车贴着 role_name='hero'
that acts as the center of the radius. 作为半径的中心。