Traffic Manager基本架构
Traffic Manager的最大作用就是可以帮助用户集体管理一个车群,定义群体的共性行为。
TIPS:在同步模式下,设置AutoPilot的车辆必须依附于设置为同步模式的traffic manager才能跑起来,即tm也需设置为同步模式。(具体实现方法见后文)
TM主要分为六个阶段(此处的解释尽量简单,省略掉了一些模块的阐述):
①Vehicle Registry——扫描仿真环境中的所有行人汽车信息,并选择出(用户控制)由TM管理的车辆。
②Localization Stage——读取所管辖车辆的位置与路线规划等信息。
③Collision Stage——根据所管辖车辆的周边环境与路线规划判断是否有发生车祸的可能。
④Traffic Light Stage——判断所管辖车辆周边是否有红绿灯。
⑤Motion Planner——将③④的信息整合,制定车辆下一步的举动。
⑥Send Command Array——将上述每一辆车的控制命令一次性分发到每辆车上,实现控制。
TM的基本使用方法
创建Traffic Manager:
world = client.get_world()
# 可以使用命令行'python traffic manager.py --tm_port 8001'来设置TM的端口号,若不设置则默认为8000
traffic_manager = client.get_trafficmanager(args.tm_port)
TIPS:才弄明白argparse库到底是干啥的,当运行python脚本时,如果想要改变一些参数,除了进入硬代码中更改之外的另一种方法是在执行时使用命令行设置(就行上述代码中注释所展现的),argparse库的作用就是让我们可以通过命令行对参数进行配置。
具体怎么使用呢,请见以下代码:
#导入argparse库 import argparse # 创建 ArgumentParser 对象,在这个对象上定义我们希望通过命令行接受的参数 # description仅为解读、注释效果,对代码整体功能无影响 parser = argparse.ArgumentParser(description='Carla Traffic Manager Example') # 添加 tm_port 参数 parser.add_argument('--tm_port', type=int, default=8000, help='Traffic Manager port') # 解析用户输入的命令行参数(若要实现命令行读取配置参数功能,则此行必需) args = parser.parse_args() #之后即可连接上一段代码,用args.tm_port获取TM连接的端口号了
设置tm里的车辆整体行为模式
# tm里的每一辆车都要和前车保持至少3m的距离来保持安全
traffic_manager.set_global_distance_to_leading_vehicle(3.0)
# tm里面的每一辆车都是混合物理模式(只有在ego_vehicle附近的车辆会开启物理特性)
traffic_manager.set_hybrid_physics_mode(True)
# tm里面每一辆车都是默认速度的80%(即默认速度*80%,默认速度为30km/h,若为-80,则为30km/h*180%)
traffic_manager.global_percentage_speed_difference(80)
设置tm为同步模式:
# 如果命令行中要求设置同步模式
if args.sync:
settings = world.get_settings()
# 设置tm的同步模式
traffic_manager.set_synchronous_mode(True)
# 具体为什么要加这个if不是很理解,大概是节省计算消耗(?)
if not settings.synchronous_mode:
# 此变量在后面执行tm指令时会用到
synchronous_master = True
# 正常设置settings的同步模式
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)
生成TM中的车辆:
# 用command指令将carla.SpawnActor赋值给SpawnActor变量(SetAutopilot同理),这里能让所有TM种的小车一同被设置
SpawnActor = carla.command.SpawnActor
SetAutopilot = carla.command.SetAutopilot
# FutureActor指正在生成实体的异步任务,当生成完成后,实体对象将会分配给FutureActor
FutureActor = carla.command.FutureActor
batch = []
for n, transform in enumerate(spawn_points):
if n >= args.number_of_vehicles:
break
blueprint = random.choice(blueprints_vehicle)
# 'recommended_values'指获取属性的推荐值
if blueprint.has_attribut