专注于车载信息安全和预期功能安全技术研究
电话:+86 21 62655001
您的位置: 网站首页 > 学术前沿
2021-05-18 10:28:33

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

来源:学术前沿 浏览次数:230 点赞数:0

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


一、传感器种类和特点

目前阶段自动驾驶汽车感知系统所使用的传感器主要有摄像头,激光雷达和毫米波 雷达等。三种传感器特点各不相同,在实验过程中需要协同工作来完成对周围环境的分析。下面来分别介绍一下三种传感器。


1.1      摄像头

摄像头是自动驾驶车辆中与肉眼成像最为接近的传感器。摄像头传感器实时地拍摄周围环境生成图像数据,并对图像数据使用计算机视觉技术进行分析,就能检测车辆周 围的安全性情况,从而对行驶状态做出判断。摄像头传感器的优缺点非常明显:摄像头相对于其他传感器的主要优势在于分辨率非常高,成本极低,在实际生产中被广泛地应 用。然而摄像头的性能在极端恶劣天气中,性能表现会呈现断崖式下降;除此之外,摄像头传感器所能够覆盖的观察距离非常局限,想要单单凭摄像头的信息不能够精确捕捉较远距离目标位置的环境信息;此外由于摄像头拍摄 所得画面是二维的,即便是可以根据二维图像建立三维模型,但是难以保证效果。


1.2     毫米波雷达

自动驾驶技术中另一种常见的传感器就是毫米波雷达。毫米波雷达是将工作频率选定在20­200GHz的领域(波长为1­10mm,即毫米波段)的雷达[21]。随着第五代通信技术的迅猛发展,毫米波这个词被提及的频率越来越高,毫米波的主要特点有四个:第一是毫米波的频带宽,在人类现有频率资源越来越紧张匮乏的今天,毫米波宽频带能够为 数据选择提供多种多样的选择;第二是毫米波的波束窄,这使得毫米波的信号较其他波 长的信号能够更精确的传递到指定区域,所以通过被毫米波信号传递的数据能够观察到 更多细节;第三则是毫米波的抗干扰能力较其他波极强,对于降雨,降雪等特殊的天气条件下毫米波粒子的穿透能力要远远强于激光和红外;第四是发射毫米波元件装置的尺 寸极小,这使得毫米波雷达更容易小型化,便捷化。以上是毫米波的四个特点也可以说是优点,然而毫米波也同样存在着一定的缺陷,比如毫米波的信号衰弱程度大且已被物 体遮挡;毫米波的传输距离过短,毫米波是一种高频的电磁波,传输距离短似乎是与生俱来的缺陷。毫米波雷达持续向外界发送毫米波级别的信号,并且同时接受发送方目标 反馈回来的信号,确定两车之间的距离只需要计算信号传递的时间。因此,毫米波雷达在自动驾驶领域中主要应用在防止发生碰撞的方面。

 

1.3      激光雷达

比起上述两个传感器,激光雷达在自动驾驶领域所处的地位更为突出。激光雷达又 名光学雷达。激光雷达从早期的测量距离和角速度功能逐渐发展到具有了测速(径向、横向)的功能,如今激光雷达成像能够给出极高的空间分辨率[22]。激光雷达作为一种精 度高的传感器,逐渐成为了自动驾驶领域不可或缺的传感器装置。激光雷达与毫米波雷达都是使用ToF技术确定目标的位置以及目标间距的。不同的是,激光雷达是探测目标 的目的是通过发射激光来实现的,这一举措使得它的探测精度较毫米波雷达更高,探测 范围也比毫米波雷达更宽广。但是激光雷达的缺点也非常明显,那就是它更容易受到空气中雨雪的干扰,它的高成本也是极大的制约了它的发展和应用。激光雷达能作为自动 驾驶领域非常重要的的传感器的原因就是它能够建立三维环境模型。它通过发射多线程 激光来收取不同高度上的环境情况信息,然后通过雷达内部的旋转装置实现全方位的数 据采集。激光雷达上的接收装置可以接收反射回来的激光束,并把它们形成点云。对点云数据加以一定的处理,就能够对周围环境完成划分。但是,凡事有利亦有弊,多线程的激光雷达所可以探测的环境范围也会变大,接受的点云数据量也会变多,但对硬件数 据处理能力的要求也会越来越高。另外由于激光雷达的旋转装置需要不停工作,故此对 硬件的耐磨程度和精度都有很高要求。


二、基于Carla的传感器数据建模

2.1    建模思路

本文会运用Carla进行传感器数据建模,首先生成实验车和定义传感器参数,之后将车辆和传感器集成,最后添加实验视角的观察功能。具体思路如下:

图片


2.2    创建车辆

宏定义egg文件是Carla 的核心文件,很多Carla中的模组和接口都定义封装在egg文件中,可以说调用egg文件是使用Carla工具进行仿真建模的关键,对 于定义调用传感器接口以及汽车模型等工作都可以通过编译egg文件实现。下面代码的作用是找到Carla的egg文件,用来制作Carla包的文件,并为摄像头添加宏定义。

图片

添加摄像头宏定义


在模拟场景中的行人,车辆和传感器都会作为actor存在于这个列表中,以栈的数据结构为例,actor即是栈中的数据元素。所以在这一部分中需要对演员列表进行一定的处理,特别注意的是列表中的actor需要在完成时将清理他们出去,如果不清理服务器上的客户机,则会造成服务器过载,造成服务器的宕机。

图片

创建清理actor Create a cleanup actor


actor列表只有链接客户端上的world才能够发挥作用,主要的功能代码块都被封装在try或者finally里。try中存放了所有的逻辑和角色创建,在程序的最末尾需要清理 它。下一步,就需要连接到Carla的服务器,获取世界,然后访问蓝图,以能够生成所 需要的汽车模型。

图片

连接世界访问蓝图


获得了蓝图之后,可以使用过滤函数办法过滤不必要的东西,来获得需要的特斯拉model2的默认蓝图,这样一来地图中就会生成实验车。Carla的地图中拥有数百个衍生点,随机选取其中一个衍生点生成车辆模型;选好衍生点之后设定车辆的运动方式,最后把车辆添加到需要跟踪和清理的角色列表之中。相关代码和运行结果如图所示。为了 防止资源占用,设置60 秒后清理车辆。

图片

添加特斯拉model2代码 AddTeslamodel2 code


图片

添加特斯拉model2 AddTeslamodel2


2.2    添加摄像头传感器

拥有了汽车模型后考虑在模型上添加一个摄像头传感器,然后弄清楚如何访问这些数据。摄像头相关的数据结构具体已经在第二部分中给出。首先设定传感器图像的宽度 和高度分别为640像素和480像素,同时为传感器的水平视角设定为110度。之后把传感器添加到汽车上,本文设定将传感器设置在引擎盖上。这之后需要把传感器添加到 actor列表中,使之成为世界的一部分,最后再为callback传感器加载蓝图并设置一些属 性。摄像头传感器的设置方面基本完毕。此外,还要从传感器获得数据,需要一个函数传递这些数据,具体代码如下:

图片

设定摄像头参数


图片

数据传递函数


为了观察到摄像头传感器的视角,再次运行脚本,除了车辆之外,还会获得一个摄像头传感器的视角,效果如下:

图片

添加摄像头效果图


2.4    添加雷达传感器

摄像头传感器添加完毕,我们开始添加一个雷达传感器。同样地,需要在世界中创建一个雷达传感器,相关数据结构已经在第二部分当中给出。设定雷达激光的速度为7.4米每秒,之后设定雷达在车辆模型上的位置(高1.0,位置2.8). 经过上述同样的添加actor列表并连接蓝图的操作,最后设定雷达激光的属性:

图片

激光属性


图片

激光雷达传感器代码


在数据传递过程中,每个传感器都发送相似大小的缓冲区。特别是在相机的情况下,图像的大小在执行期间是恒定的。为了优化内存使用率,在这些情况下,可以通过在帧之间重用已分配的内存来节省很多。每个流都包含一个缓冲池,可用于避免不必要的内存分配。如果池为空,则返回空缓冲区,即未分配内存的缓冲区。在这种情况下,当调整缓冲区大小时,将分配新的内存。在前几帧期间,这种情况会发生几次。但是,如果从池中检索了缓冲区,则一旦缓冲区超出作用域,其内存将返回到池中。下次从池中获得另一个缓冲区时,它将包含前一个缓冲区分配的内存。如所见,缓冲区对象实际上是指向连续原始内存块的智能指针。只要请求的内存不超过当前分配的内存,缓冲区就会重用内存。如果要求更多,则必须删除当前内存并分配更大的块。以下代码段说明了缓冲区的工作方式:

图片

缓冲区


2.4    创建观察者

在前面对Carla的介绍中,我们提到跟Carla环境交互的唯一方式就是客户端,但是前文用脚本生成了仿真模型汽车却没有输出视频的能力。这就需要添加一个所谓的观 察者spectator,可以被理解为Carla的环境视角。

图片

观察者代码


利用这段代码,将观察者的位置设置在仿真模型汽车的正上方向下看,在一定的时 间间隔中跟着模型汽车的位置重设观察者的位置,通过这样的方式来实现在仿真模型汽 车的正上方追踪并观察这台车。

图片

观察者效果


这一部分功能最后会得到两个输出:(1)在仿真环境中基于观察者的功能实时看到 仿真汽车模型行驶。(2)在输出文件夹中存储摄像头传感器实时拍摄的车辆图片。

图片