交通管理器 (TM) 是在模拟中以自动驾驶模式控制车辆的模块。其目标是使用真实的城市交通状况填充模拟,按照规则控制车辆的行为。
模块 | 作用 |
---|---|
ALSM 代理生命周期和状态管理 | ALSM为TM的第一步,扫描Carla世界存在的车辆以及行人,并清理不存在的条目,并且是唯一调用Carla服务器的模块。 |
Vehicle Registry 车辆登记 | 从ALSM获取到所有车辆及行人更新到存储中,并在存储中不断迭代状态。 |
Simulation state 仿真状态 | 存储所有交通参与者的信息,如交通参与者的位置、速度及交通灯影响及状态等。 |
Contorl Loop 控制回路 | 控制回路管理所有车辆的下一个命令的计算,以便它们同一帧更新。控制回路由五个不同的阶段组成;定位,碰撞,交通灯,运动规划和车辆灯。 |
In-Memory Map 存储地图 | 将地图转换成离散路径点网格,并提供更多信息来连接路点和识别道路、路口等。通过识别这些建筑物的ID来快速定位附近区域的车辆,是PBVT的辅助模块,用于定位。 |
PBVT 路径缓冲和车辆跟踪 | PBVT 是一种包含每辆车预期路径的数据结构,允许在控制回路中轻松访问数据。 |
PID Controller 闭环控制器 | 在运动规划阶段执行计算,计算油门、刹车、方向盘等需求。 |
Command Array 命令数组 | 命令数组是 TM 逻辑周期的最后一步。它接收所有已注册车辆的命令并应用它们,会等待所有参与者计算完成之后才会将命令发出,确保同步。 |
a)车辆遵循动态生成的轨迹,在接近路口时随机选择路径。
b)车辆的默认目标速度为当前道路速度限制的70%。
c)TM优先使用自己的控制系统而不是交通规则。
主题 | 描述 |
---|---|
常规 | - 创建连接到端口的 TM 实例。 -检索连接 TM 的端口。 |
安全条件 | - 设置停止车辆之间的最小距离(单辆车或所有车辆)。这将影响最小移动距离。 - 将所需速度设置为当前速度限制的百分比(对于单个车辆或所有车辆)。 - 重置交通信号灯。 |
碰撞管理 | - 启用/禁用车辆与特定参与者之间的碰撞。 - 使车辆忽略所有其他车辆。 - 使车辆忽略所有步行者。 - 使车辆忽略所有交通信号灯。 |
变道 | - 强制变道,忽略可能的碰撞。 - 启用/禁用车辆的车道变换。 |
混合物理模式 | - 启用/禁用混合物理模式。 - 更改启用物理的半径。 |
2.1 混合物理模式介绍:
Hybrid physics mode使用了两种不同的物理引擎:经典物理引擎和连续物理引擎。
a)在Hybrid physics mode中,车辆被建模成经典力学中的质点,使用经典物理引擎来计算车辆的动力学行为。这种建模方法可以提高计算效率,提高运行帧率。
b)在Hybrid physics mode中,使用了连续物理引擎来模拟车辆的轮胎和悬架系统。这样做可以确保车辆在高速行驶和弯道驾驶时的物理行为和真实情况相符合。
c)Hybrid physics mode的优点是可以在保持较高物理精度的同时提高计算效率,使得用户可以更快速地迭代和测试自动驾驶算法。
物理被禁用的战车将通过传送移动。保持线性加速度的基本计算,以确保位置更新和车速保持真实。
2.2 混合物理模式半径触发:
红色标签的是主车,绿色标签是启动混合物理模式的车辆(主车触发范围内),蓝色标签是禁用物理模式的车辆(主车触发范围外),通过设置混合物理模式的半径可以设定主车的触发范围。
a)Carla官方Traffic Manager API链接:
https://carla.readthedocs.io/en/latest/python_api/#carlatrafficmanager
b)Carla常用的Traffic Manager API介绍:
– 常用的方法:
- distance_to_leading_vehicle(self, actor, distance)
设置车辆与其他车辆必须保持的最小距离(以米为单位)。距离以米为单位,会影响最小移动距离。它是从车辆对象的前到后计算的。
- force_lane_change(self, actor, direction)
强制车辆改入其左侧或右侧的车道(如果存在)。无论如何,此方法都会应用变道,而不考虑可能的碰撞。
- ignore_lights_percentage(self, actor, perc)
在每帧运行一次的红绿灯阶段,此方法设置车辆忽略交通信号灯的几率。
- ignore_vehicles_percentage(self, actor, perc)
在每帧运行一次的碰撞检测阶段,此方法设置了与车辆忽略另一辆车碰撞的百分比几率。
- shut_down(self)
关闭Traffic Manager
- update_vehicle_lights(self, actor, do_update)
设置交通管理器是否负责更新车辆指示灯。默认为False。交通管理器不会更改车辆的车灯状态,除非其自动更新状态为True。
- vehicle_lane_offset(self, offset)
设置离中心线的车道偏移量。正值表示向右偏移,负值表示向左偏移。默认为0。
- vehicle_percentage_speed_difference(self, actor, percentage)
设置车辆的预期速度与其当前道路速度限制的差值。通过将percentage设置为负值,可以超出速度限制。 默认值为 30。
– 常用的查询:
- get_all_actions(self, actor)
返回Traffic Manager将在后续步骤中执行的所有已知操作(即道路选项和航点)
- get_next_actions(self, actor)
返回Traffic Manager将在后续步骤中执行的下一个已知道路选项和航点
– 常用的设置:
- set_desired_speed(self, actor, speed)
将车辆的速度设置为指定值。
- set_global_distance_to_leading_vehicle(self, distance)
设置车辆必须与其余车辆保持的最小距离(以米为单位)。距离以米为单位,会影响最小移动距离。它是从车辆对象的中心到中心计算的。
- set_hybrid_physics_mode(self, enabled=False)
启用或禁用混合物理模式。在这种模式下,距离自我车辆超过一定半径的车辆将被禁用其物理特性。不计算车辆动力学将降低计算成本。车辆将被传送。
- set_hybrid_physics_radius(self, r=50.0)
启用混合物理的情况下,更改启用物理的影响区域的半径。
- set_path(self, actor, path)
设置车辆在Traffic Manager控制时要遵循的位置列表。
- set_route(self, actor, path)
设置车辆在Traffic Manager控制时要遵循的路线指令列表。可能的路线说明是“左”,“右”,“直”。
- set_synchronous_mode(self, mode_switch=True)
设置Traffic Manager为同步模式。
a)创建Traffic Manager实例
注意:TM 设计为在同步模式下工作。在异步模式下使用 TM 可能会导致意外和不良结果。
tm = client.get_trafficmanager(port)
b)设置一组车辆的自动驾驶
tm_port = tm.get_port()
for v in vehicles_list:
v.set_autopilot(True,tm_port)
tm = client.get_trafficmanager(port)
tm_port = tm.get_port()
for v in my_vehicles:
v.set_autopilot(True,tm_port)
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 = 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 设置为同步模式:
...
# 设置仿真方式为同步模式
init_settings = world.get_settings()
settings = world.get_settings()
settings.synchronous_mode = True
# 设置Traffic Manager为同步模式
my_tm.set_synchronous_mode(True)
...
# 并在同一个客户端中模拟一帧物理时间
world.apply_settings(init_settings)
world.tick()
...
# 在脚本结束之前总是禁用同步模式,以防止服务器在等待tick时阻塞
settings.synchronous_mode = False
my_tm.set_synchronous_mode(False)
- 不存在主车:
- 存在主车:
settings = world.get_settings()
# 距离主车距离超过2km的车辆将睡眠。
settings.actor_active_distance = 2000
world.apply_settings(settings)
车辆重生:在TM中,休眠Actor可以配置为在英雄战车周围持续重生。战车将在英雄战车的用户可定义距离内重生上下限范围。注意,最小下限距离为 20m。
要在英雄战车 25 米和 700 米范围内重生休眠战车:
my_tm.set_respawn_dormant_vehicles(True)
my_tm.set_boundaries_respawn_dormant_vehicles(25,700)
注意:以下例程为官方内容
# 在地图上用数字标出刷出点的位置
for i, spawn_point in enumerate(spawn_points):
world.debug.draw_string(spawn_point.location, str(i), life_time=10)
# 在同步模式,我们需要设置俯视图的观察者视角
while True:
world.tick()
spawn_points = world.get_map().get_spawn_points()
# 路径一的起点
spawn_point_1 = spawn_points[32]
# 选择路径一的轨迹点
route_1_indices = [129, 28, 124, 33, 97, 119, 58, 154, 147]
route_1 = []
for ind in route_1_indices:
route_1.append(spawn_points[ind].location)
# 路径二的起点
spawn_point_2 = spawn_points[149]
# 选择路径二的轨迹点
route_2_indices = [21, 76, 38, 34, 90, 3]
route_2 = []
for ind in route_2_indices:
route_2.append(spawn_points[ind].location)
# 将轨迹点打印到地图上面
world.debug.draw_string(spawn_point_1.location, 'Spawn point 1', life_time=30, color=carla.Color(255,0,0))
world.debug.draw_string(spawn_point_2.location, 'Spawn point 2', life_time=30, color=carla.Color(0,0,255))
for ind in route_1_indices:
spawn_points[ind].location
world.debug.draw_string(spawn_points[ind].location, str(ind), life_time=60, color=carla.Color(255,0,0))
for ind in route_2_indices:
spawn_points[ind].location
world.debug.draw_string(spawn_points[ind].location, str(ind), life_time=60, color=carla.Color(0,0,255))
while True:
world.tick()
# 创建生成车辆的间隔时间
spawn_delay = 20
counter = spawn_delay
# 设置生成车辆的上限数量
max_vehicles = 200
# 路径一与路径二点交替生成标志位,alt为True生成路径一
alt = False
spawn_points = world.get_map().get_spawn_points()
while True:
world.tick()
n_vehicles = len(world.get_actors().filter('*vehicle*'))
vehicle_bp = random.choice(blueprints)
# 设置每隔20帧重新生成车辆并赋予自动驾驶行为、行驶轨迹与行为。
if counter == spawn_delay and n_vehicles < max_vehicles:
# 在轨迹1和轨迹二起点交替生成车辆
if alt:
vehicle = world.try_spawn_actor(vehicle_bp, spawn_point_1)
else:
vehicle = world.try_spawn_actor(vehicle_bp, spawn_point_2)
if vehicle: # 如果车辆成功生成
vehicle.set_autopilot(True) # TM控制车辆自动驾驶
#设置自动更新车辆车灯
traffic_manager.update_vehicle_lights(vehicle, True)
#设置随机左右变道概率为0
traffic_manager.random_left_lanechange_percentage(vehicle, 0)
traffic_manager.random_right_lanechange_percentage(vehicle, 0)
#关闭自动变道功能
traffic_manager.auto_lane_change(vehicle, False)
# 交替生成轨迹路径
if alt:
traffic_manager.set_path(vehicle, route_1)
alt = False
else:
traffic_manager.set_path(vehicle, route_2)
alt = True
vehicle = None
counter -= 1
elif counter > 0:
counter -= 1
elif counter == 0:
counter = spawn_delay