Carla交通管理器

1. 介绍

交通管理器(Traffic Manager,TM)用于在Carla中批量设置车辆的行为,以便更加真实的模拟现实世界中的交通场景。交通管理器由Carla客户端创建,运行在同步模式下

2. 架构

交通管理器的结构示意图
交通管理器的运行逻辑大致为:

  1. 存储和更新当前模拟世界中的状态
    Agent Lifecycle & State Management (ALSM):从Carla中获取车辆及行人信息,并保持更新。
    vehicle registry:管理Carla中车辆和行人的信息,包括由交通管理器控制的自动驾驶车辆和不受交通管理器控制的车辆(行人)组成。
    simulation state:存储Carla中所有车辆和行人的位置,速度以及附加信息

  2. 计算每辆自动驾驶汽车的运动
    由定位,碰撞检测,交通信号灯检测,运动规划,车辆灯光状态变化五个阶段组成

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

文档中详细介绍了交通管理器和各个功能组件

3. 使用

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

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

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 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.')

6. 参考资料

Carla官方文档,交通管理器

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值