1. 介绍
交通管理器(Traffic Manager,TM)用于在Carla中批量设置车辆的行为,以便更加真实的模拟现实世界中的交通场景。交通管理器由Carla客户端创建,运行在同步模式下。
2. 架构
交通管理器的运行逻辑大致为:
-
存储和更新当前模拟世界中的状态
Agent Lifecycle & State Management (ALSM):从Carla中获取车辆及行人信息,并保持更新。
vehicle registry:管理Carla中车辆和行人的信息,包括由交通管理器控制的自动驾驶车辆和不受交通管理器控制的车辆(行人)组成。
simulation state:存储Carla中所有车辆和行人的位置,速度以及附加信息 -
计算每辆自动驾驶汽车的运动
由定位,碰撞检测,交通信号灯检测,运动规划,车辆灯光状态变化五个阶段组成 -
在一个时间步中批量设置车辆的状态
文档中详细介绍了交通管理器和各个功能组件
3. 使用
在Carla中,由交通管理器控制的车辆会产生以下行为:
- 自动驾驶模式的车辆没有特定的目的地,运动路线是动态随机生成的。车辆在到达目的地之后会随机选择下一个目的地。
- 车辆默认的速度为当前限速的70% 。
- 在路口处,车辆不遵循交通规则。例如,出环岛的车辆会给准备进入环岛的车辆让路。
1. 创建交通管理器
#默认端口号是8000
traffic_manager = client.get_trafficmanager(port)
2. 将车辆注册到交通管理器
#获取端口号
tm_port = traffic_manager.get_port()
#设置自动驾驶,只有自动驾驶模式的车辆才可以注册到交通管理器
for vehicle in actor_list:vehicle.set_autopilot(True, tm_port) # 注册车辆,设置为自动驾驶模式
如果没有提供端口号,set_autopilot()将尝试连接到使用默认端口号的交通管理器,如果交通管理器不存在,set_autopilot()函数将创建一个交通管理器。同时,set_autopilot()将车辆注册到使用指定端口的交通管理器中。
SpawnActor(blueprint, transform).then(SetAutopilot(FutureActor, True,tm_port))
3. 设置车辆行为
将指定车辆设置为危险驾驶,包括无视所有红绿灯,无视交通标志,无视交通参与者,与前车的安全距离为0,超速20%(当前限速)
danger_car = actor_list[0]
# 第二个参数为概率,取值为0-100
traffic_manager.ignore_lights_percentage(danger_car,100)
traffic_manager.ignore_signs_percentage(danger_car,100)
traffic_manager.ignore_vehicles_percentage(danger_car,100)
traffic_manager.distance_to_leading_vehicle(danger_car,0)
# 超速20%
traffic_manager.vehicle_percentage_speed_difference(danger_car,-20)
设置车辆的速度为限速的20%,与前车的安全距离为5m,从不变道
traffic_manager.global_distance_to_leading_vehicle(5)
# 车辆的速度为限速的20%
traffic_manager.global_percentage_speed_difference(80)
for vehicle in actor_list: traffic_manager.auto_lane_change(vehicle,False)
4. 设置车辆灯光由交通管理器控制
默认情况下,由交通管理器控制的车辆的灯光从不改变状态,使用update_vehicle_lights()委托车辆管理器控制车辆的灯光。
for vehicle in actor_list:traffic_manager.update_vehicle_lights(vehicle, True)
4. 停用交通管理器
当交通管理器控制的车辆全部销毁时,交通管理器将自动停用,无需用户显示操作,由API自动完成。
client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])
5. 完整代码
import glob
import os
import sys
import randomtry:sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (sys.version_info.major,sys.version_info.minor,'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:passimport carladef main():actor_list = []try:client = carla.Client('localhost', 2000)client.set_timeout(10.0)world = client.get_world()blueprint_library = world.get_blueprint_library()vehicle_bp = blueprint_library.filter('*vehicle*')spawn_points = world.get_map().get_spawn_points()# set synchorinized modeoriginal_settings = world.get_settings()settings = world.get_settings()settings.fixed_delta_seconds = 0.05settings.synchronous_mode = Trueworld.apply_settings(settings)traffic_manager = client.get_trafficmanager()traffic_manager.set_synchronous_mode(True)for i in range(10):bp = random.choice(vehicle_bp)transform = random.choice(spawn_points)vehicle = world.try_spawn_actor(bp,transform)actor_list.append(vehicle)tm_port = traffic_manager.get_port()for vehicle in actor_list:vehicle.set_autopilot(True, tm_port)traffic_manager.auto_lane_change(vehicle, False)danger_car = actor_list[0]traffic_manager.ignore_lights_percentage(danger_car,100)traffic_manager.ignore_signs_percentage(danger_car,100)traffic_manager.ignore_vehicles_percentage(danger_car,100)traffic_manager.distance_to_leading_vehicle(danger_car,0)traffic_manager.vehicle_percentage_speed_difference(danger_car,-20)traffic_manager.auto_lane_change(danger_car, True)while(True):world.tick()spectator = world.get_spectator()transform = danger_car.get_transform()spectator.set_transform(carla.Transform(transform.location + carla.Location(z=50),carla.Rotation(pitch=-90)))finally:world.apply_settings(original_settings)print('destroying actors')actor_list = world.get_actors()vehicle_list = list(actor_list.filter('vehicle.*'))client.apply_batch([carla.command.DestroyActor(x) for x in vehicle_list])if __name__ == '__main__':try:main()except KeyboardInterrupt:print(' - Exited by user.')
6. 参考资料
Carla官方文档,交通管理器