基本完成了前一章的工作Carla 环境中的汽车建模和添加摄像头传感器、雷 达传感器和第三方观察员的工作。本章将设计摄像头传感器来识别车辆周围环境 和其他车辆的功能,并根据一定的安全驾驶逻辑实现模型自动驾驶策略。该模型将添加 识别场景中其他车辆的功能,然后模拟模型将采取不同的决在的危险和碰撞可能性。
在这一部分,将实现一个功能,即分析和使用摄像头传感器收集的图像,并识别其他车辆,并使用识别框进行选择。最后,当配备摄像头传感器的模型运行时,将实时反馈给客户端传感器拍摄的图像并标记。以此功能为基础,感知 来自车辆的驾驶状态,作为判断安全驾驶逻辑的依据。
使用定义API 库创建客户端,然后连接到服务器,然后加载 Carla 的内置地图来获 取世界,当然为了提高识别率方便演示,需要将天空设置为日照充足万里无云的白天。
设定客户端
有了 world 对象完成后,可以在蓝图库中找到需要使用的 actor 在本章中,还需要一辆装有摄像头传感器的汽车,所以我们又建立了一个特斯拉 model2 实验车并加载 RGB 摄像头蓝图。
生成车辆
正如我们在第二部分所介绍的,blueprint 为演员提供了一个目标,以便设置模型参数 ,例如将特斯拉的颜色设置为黑色。此外,相机收集的图像尺寸 设置为 1680 960。下一步是 blue 生成实验模型。
部署车辆
在上述代码中使用numpy 的随机函数,随机选择一个可能产生汽车的生成 点,并在这个位置部署白色特斯拉。摄像头部署在特斯拉上,提供 摄像头的位置是特斯拉的坐标系,摄像头的位置设置在汽车的后部和上部, 有一定的角度,实现类似赛车游戏的第三人称视角。
在实验模型配置的摄像头中设置了一个参数回调函数,即模型传感器捕获的 数据。相机捕获的图像数据是平面的一维数据,结合上述 Carla 文档中对摄像头一维数据定义的单位是比特,即每个像素点都有 BGRA 四个值。为了操作 可以捕获摄像头的数据,我们应该首先将其转换为一个数组,并将其转换为形式化的 图像矩阵,为我们 1680x960 尺寸,矩阵形状为:1680x960x2,即 1680x 像素点960个。
转化矩阵
为了提高计算效率,建模一维黑白图像数据作为模型输入。最后,通过识别 车辆函数识别的车辆将根据车辆坐标进行总结和存储。
所有准备工作完成后,开始设计和标记车辆的功能。在第三部分,模型引入了一个观察 ,但如果这部分功能需要在本章中实现,一个有效的方法是直观地显示 相机传感器捕获的图像数据。
显示摄像头视角,标记车辆
通过以上代码,通过 的帮助opencv 提供的 api 实现图像显示功能,如果 摄像头传感器视觉中出现车辆,可以通过函数选择图像上的车框。最后,为了防止程序占用资源,使用函数来检测用户是否按下停止按钮。
识别车辆效果图
首先要为 python 装载 pygame 和 numpy 模块。pygame 是 SDL 的 python 封装。使用 pygame 可以无修改地移植所有支持 的多媒体程序SDL 的平台。numpy 是 python 的扩展程序库支持大量的多维数组、矩阵操作和数学函数库。这两个模块对我们编写自动驾驶脚本非常重要,所以我们特别介绍它们。然后我们找到了 Carla 的 egg 文件,然后为发布的模型提供一些 API。天气系统和 actor 名称列表我们定义为在全局 函数中实现。
天气及演员名称
对于世界类的定义与上一部分中类似,本部分为了保证模拟的真实性和准确性,特 别添加了一个 HUD(平行驾驶系统)类别。其功能是在前挡风玻璃上投射汽车仪表板上的一些关键数据 ,以防止驾驶员在驾驶时低头检查某些仪表参数的风险。onworldtick 是在 world 通过每个 tick 的时间间隔计算 tick 数,tick 定义了仪表板上 相关数据的显示频率。然后介绍本文重点介绍的两个传感器的管理函数。雷达传感器主要用于辅助摄像头传感器的数据生成。
HUD 代码
摄像头传感器的定义包括本体、母系 actor,hud,以及 gamma 矫正。相关参数继承 母系 actor 的参数,视野范围 y 轴比母系 actor 的视野范围比 0多.4。对于 RGB坐标(-4.4,0,2.4)旋转角度为 8.0. 深度相机坐标为(4.4,1.4,1.4)两个 都增加了摇臂功能(虚幻 4 引擎下的函数)。定义后,将传感器的参数上传到 world 中,建立一定的初始值。因为添加了多个摄像头传感器,所以也会定义 toggglecamera 函数切换摄像头传感器的显示,并记录切换过程。
摄像头管理
切换传感器
对于雷达的数据处理,请参见第二章的介绍。本文采用了最简单的点云数据计算方法 。捕获的图片与第三部分的观察者标本相同,并存储在磁盘中。
图像处理输出
使用传感器获得的数据和识别的其他车辆位置,使我们的模型在面对汽车时能够做出有效的决定。首先,判断自己和汽车的相对位置,如果位于道路两侧,没有碰撞的危险,车辆驾驶状态不会改变;如果与汽车位于同一侧,根据传感器数据判断汽车的方向,如果汽车与模型本身相反,则不会改变驾驶状态;如果汽车与模型相反,根据传感器数据判断汽车的驾驶速度,计算两辆车的碰撞时间,如果时间足够长,模型可以选择减速停车等待汽车绕行,如果时间不足,模型将主动识别另一车道的交通流量,分析和判断车道的第三方车辆状态,如果安全,可以改变车道操作,绕行。
自动驾驶逻辑判断
我们为现有的 model2 模型添加了一些额外功能,用摄像头识别车辆来实现模型对周围场景的感知及处理;完善了模型在特定场景中自动驾驶的脚本,形式化地处理了传感器数据,使模型看起来更加完善,更能融入实际应用,定义了模型应对来 车的处理逻辑和策略,完成了简单的自动驾驶逻辑,以实现简单的自动驾驶功能,在下 一章中将对自动驾驶的策略逻辑进行验证。
我们将结合实验车来进行仿真模型的验证,验证算法的准确性和安全性。模 型试验逻辑如下图所示,将检验传感器仿真模型在不同天气环境下的数据处理准确度, 以此来进行仿真模型验证的实验。
因为逻辑中需要判断车辆模型与车速的相对位置和车速状态以进行相对应的决策, 所以需要对车辆的速度进行判断。车辆模型本身的速度参数已经被模型自主给出并通过 HUD 显示出来。接下来需要判断其他车辆的速度,采取的逻辑策略是连续对同一车辆 以 0.04 秒的拍摄间隔进行连续拍照。并根据图像与场景的像素矩阵缩小比例,判断出车辆在 0.04 秒时间内行进的距离,再通过公式:路程/时间 = 速度得出我们欲分析车辆 的速度。而相对距离显而易见,在计算速度过程中已经判断出来,只需要记录即可。值得注意的是,在分析和判断的过程中,两方车辆的行驶状态均未发生改变,因此在判断 是否会发生碰撞的逻辑中,应该将分析计算时间全部纳入。即碰撞预计发生总时间计时 应该从摄像头开始捕捉车辆影像开始。
基于上面的算法,我们已经可以判断出仿真模型与周围车辆的相对行驶状态和行驶速度。那么接下来就可以根据简单的防止碰撞逻辑进行试验。首先是对仿真模型和行驶 车辆的相对位置进行判断,其次再判断车辆的车速,并根据不同情况下的不同车辆行驶 状态做出不同决策来实现自动驾驶的逻辑,具体逻辑如下:
自动驾驶逻辑判断