基于改进光线追踪算法的自动驾驶模拟路试系统

2022-11-25 07:26张博为
计算机工程与设计 2022年11期
关键词:激光雷达引擎光线

张博为,崔 鹏

(贵州财经大学 信息学院,贵州 贵阳 550025)

0 引 言

随着自动驾驶汽车落地的加快,传统的实地路试已经逐渐不能满足自动驾驶汽车对各种极端情景重现的需求,于是针对模拟自动驾驶汽车路试情景的自动驾驶仿真技术便愈发受到重视[1]。在业界的实践中,算法在仿真系统中运行的时间已经超过了在路试上花费的时间。

近年来越来越多的自动驾驶模拟路试平台出现[2,3],这些平台主要分为两类,一类是基于现有的三维仿真软件进行开发。例如基于Carsim开发的自动驾驶相关软件,对车辆动力学的模拟较好,但是由于内置渲染器和平台的限制,只能针对于自动驾驶相关的车辆动力学方面进行仿真,而不能将仿真拓展到自动驾驶的全流程。Zofka等[4]基于GAZEBO平台实现了一套带有较为完善车辆操纵与动力学模型的自动驾驶仿真平台,在此基础上实现了基于深度图的仿真场景像素级标注的数据支持,虽然该平台实现了对车载摄像头的仿真,但是由于GAZEBO平台渲染效果的缺陷,输出的仿真摄像头的数据与真实数据的特征空间差异过大,不能很好测试自动驾驶模型的性能。另外一类是基于游戏引擎进行开发[5-9],这类仿真平台能够模拟如暴雨、暴雪、行人横穿马路等复杂多变条件下的场景,更多地覆盖现实生活中较少出现以及过于危险的情景。目前,大多数主流自动驾驶模拟路试系统都基于游戏引擎进行开发。例如,Alexey等[8]提出了一套基于UnrealEngine4(UE4)的自动驾驶仿真系统CARLA,提供了对模拟环境进行控制的Python接口,使用UE4对仿真进行时对场景中的人物和车辆进行控制,但是上述框架将自动驾驶相关算法限制在本机运行,限制了算法仿真的效率,并且不支持将测试算法部署到边缘计算平台。闻龙[9]提出了一种云端推理的模拟路试系统架构,采用了本地数据采集+云端推理的模式,结合高效的图像压缩的方式将本地采集到的仿真器数据传输到云端以节省带宽,但是不能很好地模拟当前自动驾驶的实际应用情况。

相较于仅搭载摄像头的方案,搭载激光雷达的方案抗干扰能力强,在对高精度地图的构建上具有显著优势。在对激光雷达的仿真上,现有多数仿真系统采用游戏物理引擎,通过物理引擎提供的场景查询方法,来达到获取仿真点云的目的,近年来也有一些研究通过对已有的点云进行处理,并结合已有三维模型来产生点云。CARLA等框架[4,8]采用游戏引擎所提供的射线检测算法,这套算法通过实时平台的物理引擎,从指定点出发,对指定方向的场景物体进行求交。但是要求场景中的模型采用最高精度的碰撞模型,加重了物理引擎的计算量,并且光线的求交与查询是运行在实时平台的主线程上的,增加了光线的数量会造成实时平台的帧率下降,影响模拟传感器的效果。柴国贝等[10]提出了一种基于三维模型顶点的激光雷达仿真方法,利用了GPU的顶点着色管线获得了较大的性能提升。但是三维模型的顶点在世界坐标系中并不一定按照激光雷达的扫描方式进行排列,需要对顶点点云进行过滤操作,所以不能很好地模拟车载激光雷达输出点云的特性。Fang等[11]提出了基于扫描场景的激光雷达仿真方法,在预处理阶段,对真实世界点云使用PointNet++[12]等点云分类模型剔除前景物体(如行人、汽车等),再将可能的动态物体的三维模型处理成点云表示添加进场景。Manivasagam等[13]改进了前景车辆的生成方法,采用真实的车辆扫描点云。以上方法可以通过已有数据集进行端到端的点云模拟,但不易对非前景物体进行更改,并且无法使用同一套数据对激光雷达之外的传感器进行仿真。另外,随着自动驾驶相关算法复杂性的日渐提高,使得自动驾驶汽车本身硬件的重要性逐渐凸显,自动驾驶汽车由于续航、空间等本身的限制,只能搭载低功耗的车载计算平台,而车载计算平台算力低的特点也就决定了自动驾驶的仿真系统不能像传统人工智能应用一样盲目地堆高算力。

针对以上的问题,本文提出了一套分布式的部署框架,将仿真环境、激光雷达仿真器、算法容器平台按照处理数据的不同抽象成节点。其中环境仿真基于UE4引擎,能够提供逼真的环境仿真效果,算法容器平台可以选择部署到高性能服务器上进行监督学习,或是部署到边缘计算平台上进行在实车条件下的算法测试。本文的贡献主要有两点:提出了一套易于部署的,对边缘节点友好的自动驾驶模拟路试系统;实现了基于光线追踪算法的激光雷达模拟,利用GPU的高度并行性,提升了车载激光雷达仿真的效率。本文提出的自动驾驶模拟路试系统验证了自动驾驶仿真架构异构部署和光线追踪算法模拟车载激光雷达的可行性,为后续相关工作提供了经验。

1 系统架构

如图1所示,本文所提出的模拟路试系统系统主要分为4个部分:①世界构建与自动驾驶相关传感器信息采集;②激光雷达仿真;③数据分发;④算法容器。

图1 模拟路试系统架构

本系统的部署方式为多机分布式部署,算法容器与左侧3个模块之间通过局域网连接,以上4个模块共同组成一个训练节点。整个仿真系统的流程如图2所示。

图2 模拟路试系统流程

1.1 世界构建与传感器信息采集

为了架构的灵活性和仿真传感器的真实性,本模拟路试系统采用了当前应用较为广泛的开源游戏引擎UE4作为仿真引擎。UE4能提供时较为真实渲染质量,并且其自带的动画、行为树等模块也能使构建仿真环境的过程更为简单和快速。

本系统通过封装自动驾驶汽车的控制操作和仿真传感器(摄像头、惯性测量单元等)的数据流,通过网络与分离部署的算法容器建立双向数据交换。当环境仿真引擎和算法容器分离部署时,将采集到的传感器数据封装成数据流发送到算法容器中,再由算法容器返回指令给仿真引擎操纵仿真环境中的车辆。整个仿真引擎是依赖于UE4的PIE(play in editor)模式运行的,这样使得每次对仿真场景的修改都可以在下一次仿真中直接看到效果。

模拟路试平台生成数据帧具有一定的时间间隔,假设T1为环境仿真引擎渲染一帧的时间,T2为单向网络延迟时间,T3为算法容器处理一帧传感器数据需要的时间,ti为一类仿真传感器采集数据的时间,i为传感器编号,则对仿真传感器采集数据时间T4如式(1),系统总延迟T如式(2)

T4=max(t1,t2,t3,…,tn)

(1)

T=T1+2T2+T3+T4

(2)

1.2 激光雷达仿真

多数的自动驾驶仿真系统对激光雷达的模拟都是通过使用仿真引擎自带的物理引擎进行射线检测从而得到单束激光目标点的位置,由于场景的查询多是串行执行的,当每帧点云数目过多时,会使得产生一帧点云数据的时间过长,使得式(1)中T4过大,最终增大整个系统的响应延迟。对此本文方法选择将激光雷达仿真从仿真引擎中独立出来,并使用光线追踪算法在GPU上进行并行计算,使得激光雷达仿真部分不阻塞仿真引擎的渲染流程,提高了效率,并且改进了以往光线追踪算法中耗时最高的光线生成算法以及着色算法,以满足对激光雷达仿真实时性的要求。激光雷达仿真模块接收仿真引擎传递的传感器位置,输出一帧点云。

1.3 算法容器

算法容器中提供了针对所有传感器数据的数据访问的Python接口,用于自定义模型的数据获取,也提供了针对常用目标检测算法以及车道线识别算法的封装(如Yolo v3、Faster RCNN),方便快速搭建系统。算法容器针对仿真环境中的车辆控制提供了方向盘角度、油门百分比、档位等车辆驾驶行为的封装。同时,分布式的部署方式使得算法容器可以灵活地部署在高性能服务器或是边缘计算平台上。

1.4 数据分发

分布式部署依赖于高性能仿真平台进行数据分发。而在单机部署的情况下,使用共享内存在各个模块之间进行数据传输,以达到最佳的性能。在分布式部署的情况下,需要传输的数据主要有点云数据、多路摄像头数据、车辆信息数据,以及算法容器传回的指令。数据交换采用谷歌GRPC框架,其中多路视频流的传输采用编码、传输、解码的方式以节省带宽。数据分发模块采用工作队列将发送接收线程与工作线程解耦,工作线程以固定的时间间隔工作。数据的流向如图3所示。

图3 仿真器数据流向

2 改进光线追踪算法

光线追踪算法[14]是一种易于在并行处理器上实现的算法。在实际的应用中,每一个像素都可以并行运行这一算法。本文提出的改进光线追踪算法运用了现代GPU的光线追踪渲染管线来进行场景的求交查询以及通过命中材质的物理属性进行回波强度的计算,得到最终的激光雷达仿真器输出。

目前广泛采用的光线追踪算法使用基于GPU的渲染流水线[15],主流的路径追踪流水线可以用5个着色器来表示:①光线生成着色器,用于定义一束光线的初始状态,并且开始进行场景遍历;②交叉着色器,用于定义与非三角形基元(如球面、体素,以及曲面细分)相交的规则,决定了物体的形状,与具体的图元的碰撞检测是采用遍历BVH(bounding box hierarchy)树[15]来进行的;③未命中着色器,用于定义一束射线在没有与任何几何体相交的情况下如何着色;④最近交点着色器,用于定义射线的交点如何着色,也可以在这个着色器中产生新的射线(用于反射等),形成一个递归调用;⑤任何交点着色器,用于定义射线是否要忽略这个交点,继续遍历场景求交。后3种着色器用于控制每条射线的行为。

2.1 光线生成算法改进

在通常情况下,光线生成着色器都是对窗口大小内的所有像素进行生成操作,但是对于仿真激光雷达来说,视口内的大多数发射光线都是激光雷达所不需要的,所以本文使用了一种改进的光线生成算法,相较于原来的光线生成算法,本文的方法规定了光线的生成规则,使得实际发射的光线的数量、位置与实际的激光雷达相同,同时优化了Close-Hit Shader的执行过程,去掉了着色器中对命中点不必要的采样,将Close-Hit Shader中的指令数量降低为原来的30%。本文采用的光线生成算法如图4所示,其中θ为发射的两条光线间的夹角,P1、P2为像素坐标系上两点,P′1、P′2为射线OP1、OP2在世界坐标系中与三维模型的交点。

图4 改进光线生成算法

像素坐标系到世界坐标系的转换如式(3)和式(4),其中R为相机旋转矩阵,T为相机在世界坐标系中的位置

[XC,YC,ZC]=ZK-1[x,y,1]T

(3)

(4)

在模拟仿真雷达时,还需要考虑仿真激光雷达的参数,例如在对多线束机械式激光雷达进行模拟时,就需要考虑角分辨、垂直FOV等参数。改进光线生成算法默认启动矩阵的最上方一行像素和最下方一行像素作为仿真激光雷达的最上方线束和最下方线束,再对满足条件的线束执行初始化和射线检测,并判断与场景是否有交点,算法的伪码如下:

算法1:改进光线生成算法

输入:像素坐标,相机参数,仿真激光雷达参数

输出:生成的光线

(1)根据式(3)、 式(4)计算u,v对应的世界坐标P

(2)IF(P满足线束间夹角andP满足角分辨率条件)

(3)dr=P-PCamera

(4)Ray←InitializeRay(dr,PCamera)

(5) WHILE !Ray.HitTriangle() and !Ray.IsMaxLength()

(6)Ray.Update(s)//s为射线每次的步长

(7) END WHILE

(8) IFRay.ValidHit()//射线与场景中的三角形有有效交点

(9)CloseHitShader(Ray)

(10) END IF

(11) END IF

2.2 Closest-Hit 着色器改进

为了改善传统激光雷达仿真软件采用的采用基于距离衰减的回波强度的计算公式,本文引入了文献[10]提出的回波强度计算方法,其能较好模拟激光雷达回波强度的特性,本文将之应用于 Closest-Hit着色器。与原本的Closest-Hit着色器相比,本文的改进主要体现在以下4点:①去除了间接光照的计算以降低计算量;②对场景中的透明材质进行过滤,忽略透明物体的反射;③在完成命中点BRDF计算之后采用式(5)计算当前的辐亮度;④在一帧结束后使用CUDA编写的并行归约算法计算当前帧辐亮度范围,用于之后的分析。其中BRDF选用了常用的Cook-Torrance BRDF函数[16]

(5)

(6)

其中,a为仿真场景大气散射系数,R为激光雷达到命中点的距离,Pt为发射功率,fr(x,ωi,ωo) 为BRDF函数,ηt,ηr分别为发射和接受光学系统的透过率,Lrange为系统的辐亮度范围。Cook-Torrance BRDF定义如式(7)

(7)

其中,D(h) 为法线分布函数,用于描述微观法线方向的分布情况,粗糙表面法线分布相对均匀,光滑表面法线分布相对集中;F(v,h) 为菲涅尔函数,用以描述在不同入射光角度下反射光线所占的比率;G(l,v)是微平面几何函数,用以描述微平面间的自遮挡关系,粗糙平面表面上的微平面有可能挡住其它的微平面从而减少表面所反射的光线;n为宏观平面法线方向;h为微平面法线方向;l为入射光方向;v为观察方向。对于Close-Hit着色器,首先对光线命中点材质进行采样,得到粗糙度等渲染相关的信息,再计算BRDF值,最后使用式(5)与式(6)计算回波强度并返回到主机端,算法使用CUDA进行并行计算,算法伪码如下:

算法2:改进Close-Hit着色器算法

输入:物体材质参数Mat,满足条件的光线列表ValidRayList,系统辐亮度范围Lrange

输出:回波强度值Intensity

(1)FORRay←ValidRayList.Begin() toValidRayList.End()

(2)HitMat←SampleMaterial(Ray,Mat) //获取光线命中点处法线,粗糙度等渲染相关信息

(3)S←BRDF(HitMat,Ray)

(4)根据式(6)使用HitMat与S计算Lr

(5)根据式(5)使用Lr与Lrange计算Intensity

(6)Intensity写入回传缓存

(7)END FOR

(8)回传缓存复制到主机端,执行并行归约算法得到当前帧辐亮度范围

3 实验与结果分析

根据本文提出的自动驾驶仿真器的特性,提出了3组实验来测试整个系统的性能,包括每秒激光雷达最大点云数、仿真平台的数据速率、边缘设备对生成的视频数据进行预测的性能。在实验中发现CARLA与Airsim实现激光雷达仿真的方法基本一致,故在这里选择效果更好的CARLA进行比较。

框架整体分成4个模块进行实现。在世界构建与传感器信息采集模块中,仿真环境生成采用C++语言结合UE4引擎的GamePlay框架进行实现,彩色摄像头、深度摄像头通过引擎的渲染相关缓存进行获取,IMU数据通过采集场景中的车辆相关姿态角经计算后得到。为了支持多路视频的同时编解码,采用基于GPU的VPF框架进行编解码操作。激光雷达仿真模块使用基于CUDA实现的改进光线追踪算法。数据分发模块使用Python实现了一个基于GRPC框架的模块间通信与交换系统。算法容器模块中,使用Python封装车辆操作的逻辑,在没有NVIDIA GPU的节点上采用ffmpg解码视频,在其它节点上使用VPF进行解码。仿真平台的实际运行效果如图5所示。

图5 模拟环境运行效果

实验环境采用AMD 3900X、RTX 2070、32 GB内存的运算设备,操作系统为Windows 10 2004版本,使用的UE4版本为4.25,CARLA版本为0.9.10,Pytorch版本为1.6.0,测试实验配置的参数见表1。

本文的主要实验如下:实验1:将本文的激光雷达仿真方法与CARLA以及典型激光雷达产生的最大点云数量进行对比。实验2:将本文的仿真环境的数据速率与CARLA

表1 系统参数

以及直接渲染的数据速率进行对比。实验3:将本文的模拟路试系统输出的数据在目前的主流检测算法上进行测试。

3.1 仿真激光雷达性能测试

为了验证仿真系统产生点云的效率,本文对比了自动驾驶模拟平台CARLA使用PhysX物理引擎进行场景求交运算产生点云的方法。每秒生成的最大点云数量的计算方法如式(8)

P=AveragePoints×AverageFPS

(8)

(9)

其中,AveragePoints是平均每帧产生的点云数量,AverageFrameTime是每帧平均的帧时间。

本文实验了在16线、32线、64线、128线下的每秒最大点云产生数量,这里的每秒最大点云输出数量定义为:在且扫描线数固定的情况下,横向分辨率设置为激光雷达仿真器的最小值。对于本文方法,通过忽略角分辨率条件使得满足垂直分辨率的每一行像素都发射光线,以达到每秒最大点云输出数量。对于CARLA,在固定射线通道数的情况下,不断加大每秒预期输出点云数量,直到最后的实际输出点云数量不再变化,以达到每秒最大点云输出数量。通过对每秒最大点云输出数量的测试能够得到仿真激光雷达的性能上限。图6的实验结果表明,本文方法相比CARLA在每帧最大输出点云的指标上,在模拟激光雷达线数为128时达到了7倍的最大点云数量。验证改进的光线追踪算法在模拟自动驾驶使用的多线束扫描式激光雷达上相比于基于物理引擎的射线求交方式有着显著的优势。

图6 每秒最大点云数量的对比

3.2 数据速率测试

为了验证整个仿真系统在运行时的数据速率,在开启三路摄像头和激光雷达模拟的情况下,将整套系统部署在同一个节点上,以此对比本文方法和CARLA在每秒最大点云数量下的数据速率。同时也对UE4引擎直接渲染场景的帧率进行了对比测试。图7、图8的实验结果表明,本文提出的自动驾驶模拟路试的仿真部分相较于传统依赖于游戏引擎流水线的架构拥有巨大的优势,提高了40%的帧速率。表2的数据表明,对比CARLA,本文提出的架构也可以有效减少在开启模拟激光雷达的情况下仿真环境的卡顿。通过分析,发现CARLA采集除激光雷达外的其它传感器的时间只占帧时间中很少的一部分,一帧中大多数的时间都用在激光雷达仿真模块与UE4物理引擎的交互中,而使用物理引擎进行射线查询生成点云的方式,因为其与UE4引擎主循环的强耦合,阻塞了渲染线程,导致了性能的大幅度下降。本文提出的方法,利用了GPU并行计算能力强的特点,加快了点云的生成速度,并且数据的生成不依赖于游戏引擎。

图7 仿真激光雷达帧率

图8 UE4引擎帧率

表2 帧时间超过0.5 s数量统计

3.3 典型模型运行测试

为了验证本文提出的架构在运行典型深度学习模型时的效率和准确率,测试采用模型官方发布的COCO数据集上训练的预训练模型进行,输入的数据集为从本文的模拟环境中采集的3段1280*720 30 FPS带语义信息(行人与车辆)的模拟路试画面,分别测试了在YOLO-V3和YOLO-V5以及RetinaNet上的效率。测试采用配置为i5 1035G4 CPU (244.9 GFLOPS),8 GB内存的边缘计算设备,运行示例如图9所示。表3的结果表明,各个模型在算法容器中运行的效率符合预期,生成的数据能够较好地评价算法的性能。AP50指的是重叠度(IoU)阈值为0.5时的平均精度(AP)测量值,IoU以及AP的计算公式如下

(10)

(11)

(12)

(13)

其中,Rdi与Rgi分别为预测目标框和真实目标框,TP表示预测与实际均为正样本的目标数目,FP表示实际为负样本预测为正样本的目标数目,FN表示实际为正样本但预测为负样本的目标数目。AP表示准确率-召回率曲线下的面积precisionmax(i) 表示该点对应的最大准确率。AP越高,模型的检测效果越好。

图9 实时检测结果

表3 各个模型在算法容器中的运行性能

4 结束语

当前自动驾驶模拟路试框架中存在的对激光雷达模拟效果不佳、无法分离部署自动驾驶仿真器和自动驾驶相关算法等问题,本文提出了一种改进的自动驾驶模拟路试系统。为了提高对车载激光雷达进行模拟的效率,本系统提出了一种运行在GPU上的改进路径追踪算法,该算法改进了传统光线追踪算法的渲染方程和Cook-Torrance BRDF函数,实现了性能提升并且能更好地模拟车载激光雷达的实际运行状况。算法提高了平均4.5倍的每秒最大点云数量,模拟时的卡顿概率降低为其它框架的1/9。本系统采用的分布式部署的架构能够较好地评估各个算法的性能,同时降低自动驾驶算法与模拟环境抢占算力的可能。下一步考虑将改进光线追踪算法应用到采用高精度扫描模型的自动驾驶仿真场景中,并且优化和隐藏现有平台的数据传输开销,以达到更加高效的模拟。

猜你喜欢
激光雷达引擎光线
手持激光雷达应用解决方案
法雷奥第二代SCALA?激光雷达
新海珠,新引擎,新活力!
消失的光线
“你看不见我”
基于激光雷达通信的地面特征识别技术
基于激光雷达的多旋翼无人机室内定位与避障研究
三生 三大引擎齐发力
蓝谷: “涉蓝”新引擎
One Engine Left只剩下一个引擎