Carla交通管理器

概念

Traffic Manager(TM)是在模拟中以自动驾驶模式控制车辆的模块。它的目标是用真实的城市交通条件填充模拟。用户可以自定义一些行为,例如,设置特定的学习环境。

交通管理器的运行逻辑大致为:

  • 存储和更新当前模拟世界中的状态

Agent Lifecycle & State Management (ALSM):从Carla中获取车辆及行人信息,并保持更新。

vehicle registry:管理Carla中车辆和行人的信息,包括由交通管理器控制的自动驾驶车辆和不受交通管理器控制的车辆(行人)组成。

simulation state:存储Carla中所有车辆和行人的位置,速度以及附加信息

计算每辆自动驾驶汽车的运动

  • 计算每辆自动驾驶汽车的运动

 由定位,碰撞检测,交通信号灯检测,运动规划,车辆灯光状态变化五个阶段组成

  • 在一个时间步中批量设置车辆的状态

 使用

在Carla中,由交通管理器控制的车辆会产生以下行为:

  1. 自动驾驶模式的车辆没有特定的目的地,运动路线是动态随机生成的。车辆在到达目的地之后会随机选择下一个目的地。
  2. 车辆默认的速度为当前限速的70% 。
  3. 在路口处,车辆不遵循交通规则。例如,出环岛的车辆会给准备进入环岛的车辆让路。

可以通过Python API调整TM行为。有关特定方法,请参见Python API文档的TM部分。以下是通过API可以实现的功能的一般总结:

Topic话题Description描述
General:
概述:
- 创建一个连接到端口的TM实例。
- 检查TM连接的端口。
Safety conditions:
安全条件:
- 设置停止车辆之间的最小距离(对于单个车辆或所有车辆)。这将影响最小移动距离。
- 将所需速度设置为当前速度限制的百分比(适用于单个车辆或所有车辆)。
- 重置交通灯
Collision managing:
冲突管理:
- 启用/禁用车辆与特定参与者之间的碰撞。
- 让一辆车忽略所有其他车辆。
- 让一辆车忽略所有的步行者。
- 让车辆无视所有交通灯。
Lane changes:
车道变更:
-- 强制变道,忽略可能的碰撞。
- 启用/禁用车辆的车道变更。
Hybrid physics mode:
混合物理模式:

- 启用/禁用混合物理模式。
- 更改启用物理的半径。

创建Traffic Manager

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)

委托Traffic Manager自动更新车灯

默认情况下,车灯(刹车、转向指示灯等)由TM管理的车辆从未更新。可以委托TM更新给定车辆施动者的车灯:

tm = client.get_trafficmanager(port)
for actor in my_vehicles:
  tm.update_vehicle_lights(actor, True)

停止Traffic Manager

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)

Deterministic mode

在确定性模式下,TM将在相同的条件下产生相同的结果和行为。不要把决定论误认为是记录器。虽然记录器允许您存储模拟的日志以进行回放,但确定性确保只要保持相同的条件,TM在脚本的不同执行中始终具有相同的输出。

确定性模式仅在同步模式下可用。在异步模式下,对模拟的控制较少,无法实现确定性。

要启用确定性模式,请使用以下方法:

my_tm.set_random_device_seed(seed_value)

seed_value是将从中生成随机数的int数。值本身并不相关,但相同的值将始终导致相同的输出。具有相同条件并使用相同种子值的两个模拟将是确定性的。

要在多个模拟运行中保持确定性,必须为每个模拟设置种子。例如,每次重新加载世界时,必须再次设置种子:

client.reload_world()
my_tm.set_random_device_seed(seed_value)

Hybrid physics mode

混合模式允许用户禁用所有自动驾驶车辆的大多数物理计算,或者禁用标记为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. 作为半径的中心。

  • If there is no hero vehicle, all vehicles' physics will be disabled.
    如果没有英雄载具,所有载具的物理特性将被禁用。
  • If there is more than one hero vehicle, the radius will be considered for them all, creating different areas of influence with physics enabled.
    如果有多个英雄载具,则会考虑所有载具的半径,并在启用物理的情况下创建不同的影响范围
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值