一种多激光雷达仿真点云的快速绘制方法和装置与流程
1.本发明涉及激光雷达仿真领域,尤其涉及一种多激光雷达仿真点云的快速绘制方法和装置。
背景技术:
2.激光雷达作为自动驾驶技术的核心关键传感器,近年来在自动驾驶领域扮演着愈来愈重要的角。激光雷达内置一个高速旋转的激光发射器阵列,通过测定激光发射器与目标物体之间的传播距离,分析目标物体表面的反射能量、反射波谱的幅度、频率和相位等信息,并计算得到探测目标的位置、速度等特征量,从而呈现出目标物精确的三维结构信息。为了更高效地利用激光雷达点云数据的进行感知算法测试,对于激光雷达的仿真和绘制不可或缺。
3.基于硬件加速的激光雷达仿真算法一般会调用图形绘制接口生成一张测距深度纹理。传统的激光雷达仿真点云绘制方法通常会将这张纹理回读到cpu端,根据激光雷达的位姿信息求出点云坐标,然后再上传到gpu端进行绘制。该方法计算效率低,数据传输延时大,并且对于多激光雷达同时仿真绘制的支持也存在明显不足。
技术实现要素:
4.为解决现有技术的不足,实现多激光雷达仿真点云的快速绘制,本发明采用如下的技术方案:一种多激光雷达仿真点云的快速绘制方法,包括以下步骤:s1,初始化仿真场景和待仿真的n个激光雷达,创建包括n个区域的一张纹理和一个顶点缓存,每个区域对应一个激光雷达仿真计算的深度信息;所述纹理的每个像素初始化为非有效值;所述顶点缓存的每个顶点对应所述纹理的一个像素,存储该像素所属的激光雷达的索引值;s2,更新仿真场景中的物体和激光雷达的位姿,依次对所有激光雷达进行仿真计算,将扫描得到的场景深度信息存储到所述纹理中;s3,将纹理、顶点缓存以及所有激光雷达的相关参数上传到顶点着器中,计算出当前顶点所对应的激光雷达仿真点云的顶点坐标;s4,将s3得到的仿真点云的顶点坐标传入几何着器中,生成若干图元,并传入像素着器进行最终的着绘制。
5.进一步地,所述s1中,所述顶点缓存的每个顶点还存储对应所述纹理的像素的像素坐标;此时,所述s3中仿真点云的顶点坐标的计算过程分为以下几个步骤:s3.1,根据当前顶点存储的像素坐标,采样纹理中存储的深度值;判断深度值的大小,如果为非有效值,则直接将所述非有效值作为当前顶点的顶点坐标;否则继续执行s3.2;s3.2,根据当前顶点存储的索引值,查对应的激光雷达的相关参数,包括激光雷
达的位置、姿态、水平扫描角度和垂直扫描角度;s3.3,使用所述像素坐标和激光雷达的水平扫描角度、垂直扫描角度计算出当前仿真点云的顶点相对于激光雷达坐标系的射线方向,将该射线方向通过激光雷达的姿态变换到世界坐标系,和激光雷达的位置构成一条世界坐标系下的射线;再根据该射线和纹理中存储的深度值计算出当前激光雷达仿真点云的顶点坐标。
6.进一步地,所述s4中,将s3得到的仿真点云的顶点坐标传入几何着器后,所述几何着器首先判断传入的顶点是否有效:如果为非有效顶点,则输出一个空的图元列表到像素着器;如果为有效顶点,则以当前仿真点云的顶点为中心,生成若干个几何图元构成一个图元列表,输出到像素着器;最后将生成的若干个图元传入到像素着器中进行着绘制。
7.进一步地,在生成几何图元的过程中,根据当前的绘制视角调整图元的角度,使其法向和绘制视线方向一致,并使用传入的外部参数确定几何图元的大小。
8.进一步地,所述s2中每个激光雷达的仿真计算会根据激光雷达的水平扫描角度切分成多次进行,每次只绘制一部分扫描角度;所有激光雷达的多次仿真计算的深度信息被拼接到一张纹理中;纹理的深度值分布和实际扫描的场景深度值分布保持一致。
9.进一步地,所述s1中的纹理和顶点缓存都位于gpu显存中,激光雷达仿真点云的每个顶点唯一对应顶点缓存中的一个顶点。
10.进一步地,所述s1中的仿真场景的初始化和纹理、顶点缓存的创建只需要在仿真开始前执行一次。
11.一种多激光雷达仿真点云的快速绘制装置,该装置包括一个或多个处理器,用于实现多激光雷达仿真点云的快速绘制方法。
12.一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现多激光雷达仿真点云的快速绘制方法。
13.本发明的有益效果如下:(1)本发明首先初始化仿真场景和仿真激光雷达,创建纹理和顶点缓存数据;依次仿真激光雷达,将扫描的场景深度信息存储到纹理中;在顶点着器中生成激光雷达仿真点云的顶点坐标,传入几何着器生成若干图元,最终传入像素着器中完成着绘制,从而实现只在gpu内部进行数据传输和计算,避免将gpu中的仿真结果回传到cpu中计算出点云坐标再传回gpu的过程,减小了数据的传输延时;充分利用gpu的并行性能,实现更高效的点云绘制。
14.(2)本发明在顶点缓存中存储激光雷达的索引值,实现将多个激光雷达的深度信息存储到一张纹理中,相对于现有的一个激光雷达对应一张纹理,减少了着器对纹理的访问延时,从而实现仿真点云的快速绘制。
附图说明
15.图1为示例性实施例中一种多激光雷达仿真点云的快速绘制方法的步骤图。
16.图2为示例性实施例中仿真场景和多个仿真激光雷达示意图。
17.图3为示例性实施例中深度值纹理存储结构示意图。
18.图4为示例性实施例中多激光雷达仿真点云生成过程示意图。
19.图5为示例性实施例中多激光雷达仿真点云的快速绘制效果图。
20.图6为示例性中的多激光雷达仿真点云的快速绘制装置示意图。
具体实施方式
21.为了使本发明的目的、技术方案及优点更加明白清楚,结合附图和实施例,对本发明进一步的详细说明,应当理解,此处所描述的具体实施例仅仅用以解释本发明,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得 的所有其他实施例,均在本发明保护范围。
22.在一个实施例中,如图1所示,一种多激光雷达仿真点云的快速绘制方法,该方法首先初始化仿真场景和多个激光雷达,创建纹理和顶点缓存数据;依次仿真所有激光雷达,将扫描的场景深度信息存储到纹理中;在顶点着器中生成激光雷达仿真点云的顶点坐标,传入几何着器生成若干图元,最终传入像素着器中完成着绘制。
23.该方法具体包括以下步骤:s1,初始化仿真场景和待仿真的n个激光雷达,创建包括n个区域的一张纹理和一个顶点缓存,每个区域对应一个激光雷达仿真计算的深度信息;所述纹理的每个像素初始化为非有效值;所述顶点缓存的每个顶点对应所述纹理的一个像素,存储该像素所属的激光雷达的索引值。
24.如图2所示,本实施例中,仿真场景为某园区的数字孪生场景,包含机动车车道、一台搭载若干激光雷达的无人车和各类交通参与者;该场景的模型一部分由无人机倾斜摄影拍摄的视频通过算法生成,一部分由美术手动建模得到;有4个待仿真激光雷达,分别定义为激光雷达a/b/c/d,均为某品牌的机械式激光雷达;激光雷达被固定安装在无人车上,一个安装在车头处,两个安装在车的左右两侧,一个安装在车尾处;每个激光雷达的具体硬件参数如下:激光雷达a:垂直线束为40线,水平分辨率为0.2度(水平采样数为1800),水平探测距离200米,垂直视场角为40度,提供-25度到15度的视角范围;激光雷达b:垂直线束为40线,水平分辨率为0.27度(水平采样数为1350),水平探测距离200米,垂直视场角为40度,提供-25度到15度的视角范围;激光雷达c:垂直线束为20线,水平分辨率为0.2度(水平采样数为1800),水平探测距离100米,垂直视场角为25度,提供-15度到10度的视角范围;激光雷达d:垂直线束为20线,水平分辨率为0.2度(水平采样数为1800),水平探测距离100米,垂直视场角为25度,提供-15度到10度的视角范围。
25.本实施例中,激光雷达的工作原理如下:激光雷达具有多个激光发射器,这些激光发射器以相同的频率同步发射激光射线,每个激光发射器发出1条激光射线,其起点均为激光雷达上的同一个点,称该点为基准点;所有激光发射器围绕着过基准点的一根直线进行定轴旋转,称该直线为转轴,垂直于转轴的平面为基准面;同一时刻激光发射器发射的多条射线位于垂直于基准面的平面内,任选转轴一侧方向为转轴方向,这些激光射线与转轴方向形成固定夹角;激光雷达每个扫描周期开始时刻射出的激光射线在基准面上的垂直投影都重合于由基准点发出的一条射线,该射线称为基准线;激光雷达的水平扫描角度范围为
[0,360],水平角度分辨率为r
,
,水平采样数量h=360/r;将扫描角度范围均匀切分成6等分,分别为[0,60],[60,120],...,[300,360];激光雷达上的基准点、基准线、基准面和转轴位置与姿态均定义在固定于激光雷达的物体坐标系中。
[0026]
本实施例使用opengl作为仿真程序的引擎绘制接口。如图3所示,在初始化阶段调用glteximage2d函数创建一张1800*120的纹理,纹理的像素格式为rgba8,纹理的每个像素初始化为非有效值(0,0,0,0);该纹理用来存储激光雷达仿真过程中的场景深度信息,场景深度信息为32位的浮点数,通过算法编码写入像素的rgba四个通道中;纹理沿纵轴(宽度方向)被分为4个区域,其中第一个区域分布于像素坐标(0,0)到像素坐标(39, 1799)的矩形区域,第二个区域分布于像素坐标(40,0)到像素坐标(79, 1349)的矩形区域,第三个区域分布于像素坐标(80,0)到像素坐标(99, 1799)的矩形区域,第四个区域分布于像素坐标(100,0)到像素坐标(119, 1799)的矩形区域,四个区域分别用来存储激光雷达a/b/c/d仿真计算的深度信息。
[0027]
调用glcreatebuffers函数创建大小为1800*120的顶点缓存,顶点缓存的每个顶点对应纹理的一个像素,由3个浮点数构成,存储了所对应像素所属的激光雷达的索引值。
[0028]
在该实施例中,为了进一步计算激光雷达仿真点云的顶点坐标,顶点缓存还存储所对应像素的像素坐标。
[0029]
上述步骤创建的纹理和顶点缓存都位于gpu显存中,后续步骤生成的激光雷达仿真点云的每个顶点唯一对应顶点缓存中的一个顶点。
[0030]
s2,更新仿真场景中的物体和激光雷达的位姿,依次对所有激光雷达进行仿真计算,将扫描得到的场景深度信息存储到所述纹理中。
[0031]
本实施例中,仿真场景中的物体包括场景中的静态物体、交通参与者、交通设施和各类障碍物,静态物体包括地面、道路、行道树、建筑等,交通参与者包括行人(未成年/青年/中年/老年)、车辆(自行车/电瓶车/三轮车/小汽车/客车/卡车/公交车/吊车等),交通设施包括交通锥、石墩、施工牌等,各类障碍物包括石块、土堆、纸箱等其他阻碍车辆运行的物体;激光雷达固定安装在无人车上,无人车的运动驱动激光雷达位姿的变化。
[0032]
本实施例中,激光雷达的仿真频率为10hz,每隔0.1s更新场景中所有物体的位置和姿态,并依次对所有激光雷达进行仿真计算;每个激光雷达的仿真计算会根据激光雷达的水平扫描角度切分成6次进行,每次只绘制一部分扫描角度;所有激光雷达的多次仿真计算的深度信息被拼接到步骤s1创建的纹理中;纹理的深度值分布和实际扫描的场景深度值分布保持一致。
[0033]
s3,将纹理、顶点缓存以及所有激光雷达的相关参数上传到顶点着器中,计算出当前顶点所对应的激光雷达仿真点云的顶点坐标。
[0034]
本实施例中,纹理是sampler2d类型的uniform变量,通过glbindtexture绑定到顶点着器中;顶点缓存作为顶点属性(vertex attributes),被绑定到顶点数组对象(vertex array object)的顶点缓存对象(vertex buffer object)上,通过gldrawarrays函数提交到顶点着器中;激光雷达的相关参数包括激光雷达的位置、姿态、水平扫描角度和垂直扫描角度,都使用浮点类型的uniform变量通过gluniform{class}函数上传到顶点着器中,其中class包括3f/3fv/2f/2fv/1i等类型;激光雷达仿真点云的顶点坐标的计算过程分为以下几个步骤:
(1)根据当前顶点存储的像素坐标uv,使用texture函数采样纹理的rgba像素值,解码出存储的深度值d;判断深度值d的大小,如果为非有效值0,则直接将非有效值作为当前顶点的顶点坐标(0,0,0),传入几何着器中;否则继续执行下一步。
[0035]
(2)根据当前顶点存储的索引值i,查第i个激光雷达的相关参数,包括激光雷达的位置pos、姿态rot、水平扫描角度horzangle和垂直扫描角度vertangle;(3)将像素坐标uv变换到第i个激光雷达的局部像素坐标luv,luv被标准化到[-1,1]范围;使用luv和水平扫描角度horzangle、垂直扫描角度vertangle算出当前仿真点云的顶点相对于激光雷达坐标系的射线方向ldir,计算公式如下:yaw=arctan(luv.x*tan(horzangle*0.5))pitch=arctan (luv.y*tan(vertangle*0.5))ldir.x= sin(pitch)cos(yaw)ldir.y= sin(pitch)sin(yaw)ldir.z=cos(pitch)其中,yaw表示射线方向ldir与激光雷达朝向的水平夹角,pitch表示射线方向ldir与激光雷达朝向的垂直夹角;ldir.x、ldir.y、ldir.z分别为射线方向ldir的向量的三个坐标值。
[0036]
将射线方向ldir通过激光雷达的姿态变换到世界坐标系,和激光雷达的位置构成一条世界坐标系下的射线r:r.dir=rot.inv_transform(ldir)r.pos=pos其中,r.dir表示射线r的射线方向,r.pos表示射线r的原点;inv_transform函数可以将向量根据一个姿态反向变换到世界坐标空间;根据射线r和深度值d即可计算出当前激光雷达仿真点云的顶点坐标p:p=r.pos+r.dir*ds4,将s3得到的仿真点云的顶点坐标传入几何着器中,生成若干图元,并传入像素着器进行最终的着绘制。
[0037]
本实施例中,如图4所示,激光雷达仿真点云的顶点坐标p通过gl_position变量传递到几何着器中,在几何着器中判断传入的顶点是否有效,如果为非有效顶点(0,0,0),则输出一个空的图元列表到像素着器;否则以当前仿真点云的顶点为中心,生成若干个几何图元构成一个图元列表,输出到像素着器;在生成几何图元的过程中会根据当前的绘制视角调整图元的角度,使其法向和绘制视线方向一致,并使用传入的外部参数确定几何图元的大小,本实施例中具体创建图元的过程如下:(1)构造一个正方形,其中心点为仿真点云的顶点坐标p;(2)根据绘制方向旋转正方形的四个顶点,使得正方形的法向和视线方向一致,保证能一直观察到正方形的正面;(3)将正方形沿着对角线切分成两个等边三角形,这两个等边三角形即为生成的几何图元,将两个三角形图元通过triangle_strip类型和emitvertex、endprimitive函数传递到几何着器中。
[0038]
最后在像素着器中完成着绘制。本实施例中,像素着器的每个像素都被着
上红(r:255, g:0, b:0),也支持各种自定义的着方案,例如根据顶点距离激光雷达的远近进行渐变着。
[0039]
最终的多激光雷达仿真点云的快速绘制结果如图5所示,图中同时显示了4个激光雷达仿真点云的绘制结果。可以看出,这些激光雷达仿真点云显示的效果正确,点云和场景中的物体紧密贴合深度误差小,轮廓清晰准确,且绘制更新的频率高于10hz,体现了本发明的有益效果。
[0040]
与前述的实施例相对应,本发明还提供了一种多激光雷达仿真点云的快速绘制装置的实施例,如图6所示,该装置包括一个或多个处理器,用于实现上述多激光雷达仿真点云的快速绘制方法。
[0041]
本发明多激光雷达仿真点云的快速绘制装置的实施例可以应用在任意具备数据处理能力的设备上,该任意具备数据处理能力的设备可以为诸如计算机等设备或置。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在任意具备数据处理能力的设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的任意具备数据处理能力的设备通常根据该任意具备数据处理能力的设备的实际功能,还可以包括其他硬件,对此不再赘述。
[0042]
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0043]
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0044]
本发明实施例还提供一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现上述实施例中的多激光雷达仿真点云的快速绘制方法。
[0045]
所述计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是外部存储设备,例如所述设备上配备的插接式硬盘、智能存储卡(smartmedia card, smc)、sd卡、闪存卡(flash card)等。进一步的,所述计算机可读存储介质还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算仉程序以及所述任意具备数据处理能力的设备所需的其他程序和数据,还可以用于暂时地存储己经输出或者将要输出的数据。
[0046]
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的范围。