注:本文来自本实验室肖轩的研究成果。
目前,自动驾驶汽车感知系统中使用的传感器主要包括摄像头、激光雷达和毫米波 雷达。这三种传感器具有不同的特性,需要在实验过程中共同完成对周围环境的分析。这里有三个传感器。
摄像头是自动驾驶车辆中最接近肉眼成像的传感器。摄像头传感器可以通过使用计算机视觉技术实时拍摄周围环境,生成图像数据,分析图像数据,检测车辆周围 的安全性,从而判断驾驶状态。摄像头传感器的优缺点非常明显:与其他传感器相比,摄像头的主要优点是分辨率非常高,成本非常低,在实际生产中得到了广泛的应用 。然而,在极端恶劣天气下,摄像头的性能会显示悬崖下降;此外,摄像头传感器可以覆盖的观察距离非常有限,只有摄像头信息不能准确捕获远程目标位置的环境信息;此外,由于摄像头是二维的,即使可以根据二维图像建立三维模型,也很难保证效果。
毫米波雷达是自动驾驶技术中另一种常见的传感器。毫米波雷达选择20-200的工作频率GHz(波长为1-10mm,即毫米波段的雷达[21]。随着第五代通信技术的快速发展,毫米波这个词被提及的频率越来越高。毫米波有四个主要特点:第一个是毫米波的频带宽。在当今人类现有频率资源日益短缺的情况下,毫米波宽带可以为 数据选择提供多种选择;二是毫米波波束窄,使毫米波信号比其他波 长信号更准确地传输到指定区域,因此通过毫米波信号传输的数据可以观察到 更多的细节;第三,毫米波的抗干扰能力强于其他波,在雨雪等特殊天气条件下,毫米波颗粒的穿透能力远强于激光和红外线;第四,发射毫米波元件装置的 尺寸非常小,使毫米波雷达更容易小型化和方便。以上是毫米波的四个特点也可以说是优点,但毫米波也有一定的缺陷,如毫米波的信号弱化程度太短,被物体阻挡;毫米波的传输距离太短;毫米波是一种高频的电磁波,传输距离短似乎是与生俱来的缺陷。毫米波雷达持续向外界发送毫米波级别的信号,并且同时接受发送方目标 反馈回来的信号,确定两车之间的距离只需要计算信号传递的时间。因此,毫米波雷达在自动驾驶领域中主要应用在防止发生碰撞的方面。
与上述两种传感器相比,激光雷达在自动驾驶领域的地位更为突出。激光雷达也被称为光学雷达。激光雷达逐渐从早期的测量距离和角速功能发展到速度测量(径向、水平)功能,现在激光雷达成像可以给出极高的空间分辨率[22]。激光雷达作为一种高精度的 传感器,已逐渐成为自动驾驶领域不可或缺的传感器装置。激光雷达和毫米波雷达都被使用ToF技术确定目标的位置以及目标间距的。不同的是,激光雷达是探测目标 的目的是通过发射激光来实现的,这一举措使得它的探测精度较毫米波雷达更高,探测 范围也比毫米波雷达更宽广。但是激光雷达的缺点也非常明显,那就是它更容易受到空气中雨雪的干扰,它的高成本也是极大的制约了它的发展和应用。激光雷达能作为自动 驾驶领域非常重要的的传感器的原因就是它能够建立三维环境模型。它通过发射多线程 激光来收取不同高度上的环境情况信息,然后通过雷达内部的旋转装置实现全方位的数 据采集。激光雷达上的接收装置可以接收反射回来的激光束,并将它们形成点云。对点云数据进行一定的处理,可以划分周围环境。然而,一切都有优缺点。多线程激光雷达可以探测到的环境范围也会增加,接受的点云数据量也会增加,但对硬件数据 数据处理能力的要求也会越来越高。此外,由于激光雷达的旋转装置需要不断工作,对 硬件的耐磨性和精度要求很高。
本文会运用Carla建模传感器数据,首先生成实验车,定义传感器参数,然后集成车辆和传感器,最后添加实验视角的观察功能。具体思路如下:
宏定义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
有了汽车模型后,考虑在模型上添加一个摄像头传感器,然后找出如何访问这些数据。相关数据结构已在第二部分给出。首先,将传感器图像的宽度 和高度设置为640像素和480像素,并将传感器的水平视角设置为110度。然后将传感器添加到汽车中,并将传感器设置在引擎盖上。然后将传感器添加到 actor在列表中,它成为世界的一部分,最后是callback传感器加载蓝图并设置一些属性 。摄像头传感器的设置基本完成。此外,从传感器获取数据需要一个函数来传输数据,具体代码如下:
设置摄像头参数
数据传输函数
为了观察摄像头传感器的视角,再次操作脚本,除车辆外,还将获得摄像头传感器的视角,效果如下:
添加摄像头效果图
添加摄像头传感器后,我们开始添加雷达传感器。同样,雷达传感器也需要在世界上创建,相关数据结构已在第二部分给出。雷达激光的速度为7.每秒4米,然后在车辆模型上设置雷达的位置(高1.0,位置2.8). 通过上述相同的添加actor列表并连接蓝图,最后设置雷达激光的属性:
激光属性
激光雷达传感器代码
在数据传递过程中,每个传感器都发送相似大小的缓冲区。特别是在相机的情况下,图像的大小在执行期间是恒定的。为了优化内存使用率,在这些情况下,可以通过在帧之间重用已分配的内存来节省很多。每个流都包含一个缓冲池,可用于避免不必要的内存分配。如果池为空,则返回空缓冲区,即未分配内存的缓冲区。在这种情况下,当调整缓冲区大小时,将分配新的内存。在前几帧期间,这种情况会发生几次。但是,如果从池中检索了缓冲区,则一旦缓冲区超出作用域,其内存将返回到池中。下次从池中获得另一个缓冲区时,它将包含前一个缓冲区分配的内存。如所见,缓冲区对象实际上是指向连续原始内存块的智能指针。只要请求的内存不超过当前分配的内存,缓冲区就会重用内存。如果要求更多,则必须删除当前内存并分配更大的块。以下代码段说明了缓冲区的工作方式:
缓冲区
在前面对Carla的介绍中,我们提到跟Carla环境交互的唯一方式就是客户端,但是前文用脚本生成了仿真模型汽车却没有输出视频的能力。这就需要添加一个所谓的观 察者spectator,可以被理解为Carla的环境视角。
观察者代码
利用这段代码,将观察者的位置设置在仿真模型汽车的正上方向下看,在一定的时 间间隔中跟着模型汽车的位置重设观察者的位置,通过这样的方式来实现在仿真模型汽 车的正上方追踪并观察这台车。
观察者效果
这一部分功能最后会得到两个输出:(1)在仿真环境中基于观察者的功能实时看到 仿真汽车模型行驶。(2)在输出文件夹中存储摄像头传感器实时拍摄的车辆图片。