交通管理器(Traffic Manager,TM)用于在Carla中批量设置车辆的行为,以便更加真实的模拟现实世界中的交通场景。交通管理器由Carla客户端创建,运行在同步模式下。
存储和更新当前模拟世界中的状态
Agent Lifecycle & State Management (ALSM):从Carla中获取车辆及行人信息,并保持更新。
vehicle registry:管理Carla中车辆和行人的信息,包括由交通管理器控制的自动驾驶车辆和不受交通管理器控制的车辆(行人)组成。
simulation state:存储Carla中所有车辆和行人的位置,速度以及附加信息
计算每辆自动驾驶汽车的运动
由定位,碰撞检测,交通信号灯检测,运动规划,车辆灯光状态变化五个阶段组成
在一个时间步中批量设置车辆的状态
文档中详细介绍了交通管理器和各个功能组件
在Carla中,由交通管理器控制的车辆会产生以下行为:
#默认端口号是8000
traffic_manager = client.get_trafficmanager(port)
#获取端口号
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))
将指定车辆设置为危险驾驶,包括无视所有红绿灯,无视交通标志,无视交通参与者,与前车的安全距离为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)
默认情况下,由交通管理器控制的车辆的灯光从不改变状态,使用update_vehicle_lights()委托车辆管理器控制车辆的灯光。
for vehicle in actor_list:
traffic_manager.update_vehicle_lights(vehicle, True)
当交通管理器控制的车辆全部销毁时,交通管理器将自动停用,无需用户显示操作,由API自动完成。
client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])
import glob
import os
import sys
import random
try:
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:
pass
import carla
def 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 mode
original_settings = world.get_settings()
settings = world.get_settings()
settings.fixed_delta_seconds = 0.05
settings.synchronous_mode = True
world.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.')
Carla官方文档,交通管理器