自动驾驶汽车传感器数字孪生建模(二)

  • A+
所属分类:云安全

标注:本文来自本实验室肖轩的研究成果。


三、自动驾驶传感器孪生建模仿真实现

在上一章的工作中,基本完成了 Carla 环境下的汽车建模及添加摄像头传感器,雷 达传感器和第三方观察者的工作。在本章中,将会设计摄像头传感器识别车辆周围环境 和其他车辆的功能,基于一定的安全驾驶逻辑,来实现模型自动驾驶的策略。模型会添 加一个识别场景中其他车辆的功能,之后会针对被识别出的其他车辆的位置和行驶状 态,仿真模型会采取不同的决策来规避潜在的危险和碰撞可能。


3.1用摄像头识别车辆

在这一部分中,会实现一个功能,就是将摄像头传感器采集回来的图像分析利用, 并识别出其他车辆,使用识别框框选出来。最后当搭载了摄像头传感器的模型在运行时, 会实时反馈给客户端传感器所拍摄到的图像,并对其进行标记。以此功能为依据来感知 来向车辆的行驶状态来作为安全行驶逻辑的判断依据。


3.1.1创建客户端

使用定义的 API 库创建好客户端再连接到服务器,之后加载 Carla 的内置地图来获 取世界,当然为了提高识别率方便演示,需要将天空设置为日照充足万里无云的白天。

自动驾驶汽车传感器数字孪生建模(二)

设定客户端

3.1.2生成实验车

有了 world 对象之后,就能够在蓝图库中找到需要使用的 actor 了,在本章中,同样 需要一个装载了摄像头传感器的车,所以我们再次建立一个特斯拉 model2 的实验车并 加载一个 RGB 摄像头的蓝图。

 

自动驾驶汽车传感器数字孪生建模(二)


生成车辆

正如第二部分我们所介绍的,blueprint 为演员提供了目标这样一来就可以对模型参 数进行设置,例如将特斯拉的颜色设置成了黑色。此外,还把摄像头采集到的图像尺寸 设置为 1680 ∗ 960。下一步,就能用 blue 生成实验模型了。

自动驾驶汽车传感器数字孪生建模(二)

部署车辆


在上面的代码中,使用的 numpy 的随机函数,随机选择了一个可能生成汽车的生成 点,并将白色的特斯拉部署在该位置生成。而摄像头是被部署在特斯拉上面的,提供摄 像头的位置为特斯拉这台车的坐标系的位置,摄像头的位置被设定在车子的后上方,且 拥有一定的角度,为了产生亲切感实现了类似赛车游戏中的第三人称视角。


3.1.2利用摄像头数据识别车辆

实验模型配置的摄像头中设定了一个参数回调函数,回调的即是模型传感器所捕捉 到的数据,摄像头捕捉到的图片数据是平面的一维数据,结合上文中 Carla 文档中对摄 像头一维数据定义的单位是比特,即针对每一个像素点,都有 BGRA 四个值。想要对能 够对摄像头捕捉数据进行操作,首先应该将其转化成一个数组,并将其转换为形式化的 图像矩阵,对于我们 1680x960 的尺寸,该矩阵的形状为:1680x960x2,即 1680x960 个 像素点。

 

自动驾驶汽车传感器数字孪生建模(二)


转化矩阵

为了运算效率的提升,建模一维的黑白图像数据作为模型的输入。最后,通过识别 车辆函数识别出来的车辆会依据车辆的坐标进行汇总存储进坐标列表中。


3.1.4显示摄像头视角并标记车辆

所有准备工作完成后,开始设计标记车辆的功能。第三部分中模型引入了一个观察 者,但在本章中若要实现这一部分功能还需要引入一个来实现,一个有效的办法是将摄 像头传感器捕捉的图像数据直观的显示出来。

自动驾驶汽车传感器数字孪生建模(二)

显示摄像头视角并标记车辆


通过上面的代码,通过借助 opencv 提供的 api 实现图像显示的功能,这样的话如果 摄像头传感器的视野中出现了车辆,就可以通过函数将图像上的车辆框选出来。最后,为了防止程序不断运行占用资源,使用一个函数侦听使用者是否按下停止键。


自动驾驶汽车传感器数字孪生建模(二)

识别车辆效果图


3.2自动驾驶

首先需要为 python 装载 pygame 和 numpy 模块。pygame 是 SDL 的 python 封装。使 用 pygame 就可以将写出的多媒体程序无修改地移植在所有支持 SDL 的平台。numpy 是 python 的一个拓展程序库,其支持了大量的多维数组以及矩阵运算,数学函数库。这两个模块对于我们撰写自动驾驶的脚本非常重要,故此特别介绍。之后我们找到 Carla 的 egg 文件,再为释放的模型提供一些 API。天气系统和 actor 的名称列表我们定义在全局 函数中实现。

自动驾驶汽车传感器数字孪生建模(二)

天气及演员名字


对于世界类的定义与上一部分中类似,本部分为了保证模拟的真实性和准确性,特 别添加了一个 HUD(平行驾驶系统)的类。其作用是将汽车仪表盘上的一些关键数据 投射在前挡风玻璃上,防止驾驶员在驾驶时会低头查看某些仪表参数而带来的风险。onworldtick 是在 world 中通过每个 tick 的时间间隔计算 tick 数,tick 则定义了仪表盘上 的相关数据的显示频率。之后将介绍本文着重介绍的两个传感器的管理函数。而雷达传感器主要用于辅助摄像头传感器的数据生成。


自动驾驶汽车传感器数字孪生建模(二)

HUD 代码

3.2.1摄像头管理函数

摄像头传感器的定义包括本体,母系 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 函 数来切换摄像头传感器的显示,并对切换过程进行记录。

自动驾驶汽车传感器数字孪生建模(二)

摄像头管理类



自动驾驶汽车传感器数字孪生建模(二)

切换传感器


3.2.2雷达管理函数

对于雷达的数据处理详见第二章中的介绍,本文采用了最简单的点云数据计算方 式,对于捕捉下的图片,会同第三部分中的观察者标本的效果相同,储存在磁盘中输出。

自动驾驶汽车传感器数字孪生建模(二)

图像处理输出

3.2自动驾驶逻辑

运用传感器获取的数据以及识别的其他车辆位置,这使得我们的模型在面对来车时 可以做出有效的决策来应对。首先判断自身与来车的相对位置,如果分别位于道路两侧, 则没有发生碰撞的危险,车辆行驶状态不做任何改变;若自身与来车位于同侧,则根据传感器数据判断来车的方向,如果是来车与模型自身是背道而驰,则不做任何行驶状态的改变;如果来车与模型是相向而行,则根据传感器的数据判断来车的行驶速度,并计算不做任何改变的情况下两车相撞时间,如果时间足够长,则模型可以选择减速停车等

 

待来车绕行通过,如果时间不足,则模型会主动识别另一车道的车流量情况,对车道的第三方车辆状态进行分析判断,如果安全,则可以进行变道操作,绕行来车。

自动驾驶汽车传感器数字孪生建模(二)

 自动驾驶逻辑判断

我们为现有的 model2 模型添加了一些额外功能,用摄像头识别车辆来实现模型对周围场景的感知及处理;完善了模型在特定场景中自动驾驶的脚本,形式化地处理了传感器数据,使模型看起来更加完善,更能融入实际应用,定义了模型应对来 车的处理逻辑和策略,完成了简单的自动驾驶逻辑,以实现简单的自动驾驶功能,在下 一章中将对自动驾驶的策略逻辑进行验证。


四、自动驾驶传感器仿真模型的分析验证

我们将结合实验车来进行仿真模型的验证,验证算法的准确性和安全性。模 型试验逻辑如下图所示,将检验传感器仿真模型在不同天气环境下的数据处理准确度, 以此来进行仿真模型验证的实验。


4.1摄像头判断车速和相对距离

因为逻辑中需要判断车辆模型与车速的相对位置和车速状态以进行相对应的决策, 所以需要对车辆的速度进行判断。车辆模型本身的速度参数已经被模型自主给出并通过 HUD 显示出来。接下来需要判断其他车辆的速度,采取的逻辑策略是连续对同一车辆 以 0.04 秒的拍摄间隔进行连续拍照。并根据图像与场景的像素矩阵缩小比例,判断出车辆在 0.04 秒时间内行进的距离,再通过公式:路程/时间 = 速度得出我们欲分析车辆 的速度。而相对距离显而易见,在计算速度过程中已经判断出来,只需要记录即可。值得注意的是,在分析和判断的过程中,两方车辆的行驶状态均未发生改变,因此在判断 是否会发生碰撞的逻辑中,应该将分析计算时间全部纳入。即碰撞预计发生总时间计时 应该从摄像头开始捕捉车辆影像开始。


4.2安全自动驾驶判断逻辑

基于上面的算法,我们已经可以判断出仿真模型与周围车辆的相对行驶状态和行驶速度。那么接下来就可以根据简单的防止碰撞逻辑进行试验。首先是对仿真模型和行驶 车辆的相对位置进行判断,其次再判断车辆的车速,并根据不同情况下的不同车辆行驶 状态做出不同决策来实现自动驾驶的逻辑,具体逻辑如下:

 自动驾驶汽车传感器数字孪生建模(二)

自动驾驶逻辑判断



 


本文始发于微信公众号(轩辕实验室):自动驾驶汽车传感器数字孪生建模(二)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: