python就是学库_Python酷

在这篇文章中,我们将介绍Carla环境中另外一个重要的功能模块,它的名字叫做Traffic Manager(交通管理器)。

我们在 Carla自动驾驶仿真环境 3 – 利用摄像头识别车辆 中成功创建了多台车辆,并在一台车上安装了摄像头,它可以识别到道路上的其他车辆。我们为了让车辆移动,将车辆的autopilot模式设置成了True,在这个模式下,车辆会按照Carla引擎生成的路线,并在遵守交通规则的前提下安全有序的同行。但是在现实中,路上车辆的行为是不可预测的,你并不知道旁边的车辆是不是会做出危险行为,因此在自动驾驶仿真中,我们需要能够对这类的行为做出仿真,而Carla中的Traffic Manager就是为了这个目的设计的。

Traffic Manager,以下简称TM,是一个用于控制仿真器内车辆的木块,它的目的是尽量模拟真实的道路场景,用户可以通过TM自定义一些危险驾驶行为,比如可以让车辆超速行驶,或者强行变道等等。

将车辆纳入TM的管理很简单,用户只需要打开该车辆的autopilot模式就行,如果用户没有打开这个模式那么车辆就没有被注册到TM中。

架构

我们先简单的通过Carla引擎对TM模块的构架来了解下TM所包含的几个重要功能点,TM的执行过程是分阶段执行的,下图展示了TM子模块之间的连接关系,其中蓝色框内是参与TM决策的模块,而绿的框代表的是一些辅助模块。

下边分别说明一下每个模块实现的功能:

功能模块

Localization Stage:TM给每一个台车存储了一个途经点列表,这个列表会在1-5阶段的每次迭代中根据每一个阶段的决定被更新(例如变道,轨迹等)。每台车的途经点个数受到车速的影响。在这个阶段中,TM同时监控一个所有车辆在地图中的位置的数据结构,用来粗略的预测可能的碰撞。

Collision Stage:检查每一辆车的可能的碰撞。这一阶段决定了哪台车具有更高的优先级,同时将结果同Planner Stage沟通。

Traffic Light Stage: TM在这个阶段管理了一些通用的交通规则,例如在交叉路口的车辆优先级等。当车辆检测到红灯或者黄灯的时候 __traffic hazard__就会被设置成True,如果没有信号灯的路口,则使用同行优先级来控制。

Planner Stage: 将之前的阶段的所有信息聚合在一起,然后通过这些信息作出如何控制车辆的决定,它使用了PID控制器来实现控制目标,当所有的车辆控制命令都被计算出来以后,这些命令会被发送到Apply Control Stage。例如当一个交通事故被检测到以后,这个剪短会计算出刹车的参数,然后告诉Apply Control Stage来控制刹车

Apply Control Stage:最终执行指令控制车辆

支持性模块

InMemory Map:缓存的地图,为了提高Localization Stage的计算效率,地图以waypoints的形式被缓存下来。

PID Controller:TM使用PID算法来计算出车辆控制参数,比如油门开度,刹车力度和转向角度等等

使用Traffic Manager

我们在使用TM之前需要知道和了解TM的一些常规的行为,包括:

车辆的行为没有任何目标:它们的路线没有终点,它们在靠近交叉路口的时候只是随机选择路线

车辆的目标速度是当前限速的70%:或者我们可以指定一个其他值

在交叉路口内的车辆的优先级并不遵循TM的交通优先级定义:比如说在环岛内的车辆可能会停下来让行想要进入环岛的车

用户能够通过TM对车辆的控制简单总结如下,更详细的内容也可以在API文档中找到。

通用

1. 使用carla.Client来创建TM,并连接到端口上

2. 通过已经连接的TM可以获取到端口

安全条件

1. 可以设置停下来车辆之间的最短距离(可以单独设置一台车或者是所有的车),这个会影响到最小可移动距离

2. 根据当前限速,设置车辆的目标车速(单独一台车或者所有的车)

3. 重置交通信号灯

碰撞管理

1. 关闭和使能车辆和某个Actor之间的碰撞

2. 将一台车设置成无视其他车辆

3. 将一台车设置成无视其他行人

4. 将一台车设置成无视交通信号灯

车道变换

1. 无视碰撞强行变道

2. 使能和关闭某台车的变道行为

混合物理模式

1. 使能和关闭混合物理模式

2. 更改混合物理模式的半径

知道了TM可以可以做什么以后,我们接下来就可以看看在Python中来使用TM了。

创建TM

注:下边代码需要使用0.9.9版本以上的Carla环境,因为官方文档没有较为清楚的标注,大家使用的时候要特别注意一下,如果在早于0.9.9的版本中可能会遇到参数不一致的问题。

在使用TM之前,需要在Python代码中创建TM对象,我们需要调用carla.Client的get_trafficmanager方法来创建TM对象。

12

port=1234

tm = client.get_trafficmanager(port)

调用这个方法的时候可以指定一个端口号,用于后边将车辆注册到TM中,如果不给这个参数,默认端口号为8000,

在 Carla自动驾驶仿真环境 1 – 基本概念 中我们就提到了,Carla仿真器环境和Carla Python库之间是服务器和客户端的一种关系,而TM其实是运行在仿真器环境中的,因此它也是服务器的的一部分,而我们使用Python实现的代码是用户通过Python库来控制仿真器环境的一个客户端。

有了TM对象以后,我们若要使用TM来控制某几台车辆就需要把这些车辆都提前注册到TM中,注册的过程也很简单,如我们前边提到的,我们可以通过设置车辆的autopilot模式来将其注册到TM中,在调用set_autopilot方法的时候需要指定TM的端口号,该端口号可以通过TM对象的get_port方法获得。

123

tm_port = tm.get_port()

for v in vehicles_list:

v.set_autopilot(True, tm_port)

使用TM

12345678910111213141516171819202122232425

NUMBER_OF_VEHICLES = 10

vehicle_bps = world.get_blueprint_library().filter('vehicle.*.*')

vehicle_bps = [x for x in vehicle_bps if int(x.get_attribute('number_of_wheels')) == 4]

vehicle_list = []

for i in range(NUMBER_OF_VEHICLES):

point = spawn_points[i]

vehicle_bp = np.random.choice(vehicle_bps)

try:

vehicle = world.spawn_actor(vehicle_bp, point)

picked_spawn_points.append(point)

vehicle_list.append(vehicle)

except:

print('failed')

pass

tm = client.get_trafficmanager()

tm.global_percentage_speed_difference(30.0)

tm_port = tm.get_port()

for v in vehicle_list:

v.set_autopilot(True, tm_port)

tm.ignore_lights_percentage(v,100)

tm.distance_to_leading_vehicle(v,0)

tm.vehicle_percentage_speed_difference(v,-20) # overspeeding for 20%

在上段断码中,我们在世界中另外创建了10台车,并将它们添加到vehicle_list,然后将vehicle_list中的车辆全部注册到TM中,通过,针对每台车,都设置了一些自定义的驾驶规则

通过ignore_lights_percentage 让他们100%的情况下忽略交通信号灯

通过distance_to_leading_vehicle来告诉车辆不需要跟前车保持安全车距

通过vehicle_percentage_speed_difference告诉车辆目标速度为超速20%

使用这样的代码创建的世界中,只有我们的model3是按照正常的交通规则合理的行驶,其他车都是在危险驾驶。

停止TM

需要指出的是TM并不是一种Actor,因此不需要手动停止,Client会自动处理,但是需要注意的是当TM停止以后,注册到它上边的车辆都会被销毁。

也就是说我们不需要特别的针对TM做停止的操作,只需要使用它就可以了。

结语

在本篇文章中,我们简要的介绍了Carla中的交通管理器模块,并演示了如何使用它提供的接口,TM模块主要是为我们提供了一个模拟真实行车环境中的不确定性的可能,因为在自动驾驶汽车算法在测试的时候,通常很容易在安全行车环境下测试,而危险驾驶的场景不是很容易创造,TM给可以帮助我们很容易的来模拟危险驾驶场景,大家可以发挥想象力,利用这些API创造尽最大可能符合真实的驾驶环境。

本篇文章的代码为在GitHub仓库 https://github.com/pythonlibrary/carla-tutorials{.aioseop-link} 中的 tutorial-4.py文件

最后,我们来看一下,在这个危险的道路上,其它车辆是怎么驾驶的,在下边视频中你可以看到一台车闯红灯直行,另外一台车闯红灯左转,而我们的车很规矩。

您的浏览器不支持本视频

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值