首页> 中国专利> 一种在Unity中获取点云路面高度的方法

一种在Unity中获取点云路面高度的方法

摘要

本发明本提供一种在Unity中获取点云路面高度的方法,包括获取整个场景的点云地图、对点云地图进行切分得到多个区块、对每一区块点云进行点云高度计算、输出结果等几个步骤,导出每个区块点云的高度信息即得到了路面所需要的高度信息。本发明充分利用Unity引擎的优势,能够快速准确地生成点云地面高度信息,并且利用一些并行处理方法加速了数据流处理,能够自动获取点云路面高度信息,后续添加的路面元素,可自动贴合到路面,大缩减了人工调整所需的工作量,也减少了产生人为误差的概率。

著录项

  • 公开/公告号CN110163880A

    专利类型发明专利

  • 公开/公告日2019-08-23

    原文格式PDF

  • 申请/专利权人 奥特酷智能科技(南京)有限公司;

    申请/专利号CN201910481170.9

  • 发明设计人 周路翔;陈诚;张旸;

    申请日2019-06-04

  • 分类号

  • 代理机构南京中高专利代理有限公司;

  • 代理人李晓

  • 地址 211800 江苏省南京市浦口区桥林街道步月路29号12幢-289

  • 入库时间 2024-02-19 13:54:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-03-17

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06T 7/11 专利号:ZL2019104811709 变更事项:专利权人 变更前:奥特酷智能科技(南京)有限公司 变更后:奥特酷智能科技(南京)有限公司 变更事项:地址 变更前:211800 江苏省南京市浦口区桥林街道步月路29号12幢-289 变更后:210012 江苏省南京市雨花台区安德门大街57号楚翘城5幢401室-404室

    专利权人的姓名或者名称、地址的变更

  • 2020-04-14

    授权

    授权

  • 2019-09-17

    实质审查的生效 IPC(主分类):G06T7/11 申请日:20190604

    实质审查的生效

  • 2019-08-23

    公开

    公开

说明书

技术领域

本发明一种使用点云地图编辑矢量信息时获取点云路面高度的方法,属于自动驾驶仿真技术领域。

背景技术

自动驾驶汽车的成功涉及到高精地图、实时定位以及障碍物检测等多项技术, 激光雷达(LiDAR)是一种向指定方向发射激光束并检测返回光束来获取目标位置等数据的装置。自动驾驶领域常用的激光雷达为多线束机械旋转式激光雷达,由于其定位精准,算法实现难度低,不受昼夜影响等诸多优点,成为自动驾驶核心定位与检测设备之一。在无人车行驶的过程中,LiDAR同时以一定的角速度匀速转动,在这个过程中不断地发出激光并收集反射点的信息,以便得到全方位的环境信息。LiDAR在收集反射点距离的过程中也会同时记录下该点发生的时间和水平角度(Azimuth),并且每个激光发射器都有编号和固定的垂直角度,根据这些数据我们就可以计算出所有反射点的坐标。LiDAR每旋转一周收集到的所有反射点坐标的集合就形成了点云。

在使用点云地图编辑矢量信息时,需要获取点云路面高度信息,而通常建图时点云高度不会完全平整,因此现有的点云路面高度信息多通过人工获取,自动化程度不高,漏测、错测、漏画、错画等现象时有发生。

发明内容

发明目的:本发明充分利用Unity引擎的优势,提供一种在Unity引擎中高效地从点云地图中自动获取点云路面高度信息的方法。

技术方案:为解决上述技术问题,本发明提供的点云路面高度信息自动获取方法,包括以下步骤:

步骤一、获取整个场景的点云地图;

步骤二、对点云地图进行切分得到多个区块,即将整个场景的点云按照所在区块切分成小块点云;

步骤三、对每一区块点云进行点云高度计算;具体如下:

1)使用IJobParallelFor类型并行处理,获取每个区块所有点的索引,伪代码如下:

indices[index] = math.floor(data[index].xy / b);

其中,b为采样栅格边长

2)使用IJobParallelFor类型并行处理,将索引与对应点数据填入NativeMultiHashMap<int3, float4>类型的map,伪代码如下:

map[index].add(indices[index],data[index]);

3)使用IJobNativeMultiHashMapMergedSharedKeyIndices类型Job过程在map中处理索引一致的点并获取最低点高度填入数组NativeArray<float3> bottom,伪代码如下:

ExecuteFirst: height [index] = data[index].z;

ExecuteNext: if(bottom [firstIndex].z> data[index].z)

bottom [firstIndex].z = data[index].z;

步骤四、输出结果

经步骤三处理后的bottom中只包含最低点的点云,导出这些点云的高度信息即得到了路面所需要的高度信息。

优选的,步骤四执行完成后,将bottom中每个点云的高度信息导出形成高度图或者绘制成网格。

获取路面高度信息时,单个大场景处理需要很大内存,因此本发明优先将点云切块,即将大场景切分杨多个区块,在小块中进行处理,每次执行一个小块的处理,处理完成后释放资源,减小了内存占用。本发明充分利用Unity引擎的优势,能够快速准确地生成点云地面高度信息,并且利用一些并行处理方法加速了数据流处理,能够使后续添加的路面元素,可自动贴合到路面,大缩减了人工调整所需的工作量,也减少了产生人为误差的概率

另外由于对整个场景的点云进行切分还是需要很大的硬件开销,因此这里只是将区块切分作为高度计算的前置条件使用,在实际应用时,可以采用至少以下两种方法获得切分的区块:

(1)在点云地图导出阶段完成区块切分,并导出小块的点云地图文件(通常为pcd文件)。

(2)利用Unity引擎对点云地图进行切分得到多个区块,具体如下:

1)使用IJobParallelFor类型并行处理,获取所有点云的索引,伪代码如下:

indices[index] = math.floor(data[index].xy / b);

其中,b为当前选取的区块边长;

2)使用IJobParallelFor类型并行处理,将索引与对应点数据填入NativeMultiHashMap<int3, float4>类型的map,伪代码如下:

map[index].add(indices[index],data[index]);

3)使用IJobNativeMultiHashMapMergedSharedKeyIndices类型Job过程将map中索引一致的数据插入队列NativeQueue<float4> queue,伪代码如下:

queue.Enqueue(data[index]);

4)将NativeQueue queue转化为NativeArray array,保持连续信息;

5)使用IJobParallelFor类型并行处理,获取到每个区块的起始索引NativeArray<int> startIndex,伪代码如下:

If(array[index] == array[index - 1])

startIndex[index] = index;

else

startIndex[index] = 0;

6)使用IJobParallelForFilter类型并行处理,筛选出每个区块中不为0的索引,这些索引就是array中每个区块的初始索引;循环读出每个区块中初始索引对应的点数据,即得到切块后的每个区块的点数据。

以上所述的本发明解决的技术问题、构成技术方案的技术特征以及由这些技术方案的技术特征所带来的优点外。为使本发明目的、技术方案和有益效果更加清楚,下面将结合本发明实施例中的附图,对本发明所能解决的其他技术问题、技术方案中包含的其他技术特征以及这些技术特征带来的优点做更为清楚、完整的描述。

附图说明

图1是本发明实施例的流程示意图;

图2是区块切分的示意图;

图3是本发明实施例中某一区块的点云高度信息示意图;

图4是将图3可视化成网格后的示意图。

具体实施方式

实施例:

Unity作为通用图形引擎,内部集成了第三方物理引擎,能够满足自动驾驶领域的物理与图像仿真需求。得益于这些优势,我们可以在较新版本的Unity中实现高效获取激光雷达点云的新方法,其实施总流程如图1所示,包括以下步骤:

步骤一、获取整个场景的点云地图。

步骤二、对点云地图进行切分得到多个区块,即如图2所示,将整个场景的点云按照所在区块切分成小块点云。

通常可以采用至少以下两种方法获得切分的区块:(1)在点云地图导出阶段完成区块切分,并导出小块的点云地图文件(通常为pcd文件)。

(2)利用Unity引擎对点云地图进行切分得到多个区块,具体方法如下:

1)使用IJobParallelFor类型并行处理,获取所有点云的索引,伪代码如下:

indices[index] = math.floor(data[index].xy / b);

其中,b为当前选取的区块边长,可根据需要设置,通常可取1米;

2)使用IJobParallelFor类型并行处理,将索引与对应点数据填入NativeMultiHashMap<int3, float4>类型的map,伪代码如下:

map[index].add(indices[index],data[index]);

3)使用IJobNativeMultiHashMapMergedSharedKeyIndices类型Job过程将map中索引一致的数据插入队列NativeQueue<float4> queue,伪代码如下:

queue.Enqueue(data[index]);

4)将NativeQueue queue转化为NativeArray array,保持连续信息;

5)使用IJobParallelFor类型并行处理,获取到每个区块的起始索引NativeArray<int> startIndex,伪代码如下:

If(array[index] == array[index - 1])

startIndex[index] = index;

else

startIndex[index] = 0;

6)使用IJobParallelForFilter类型并行处理,筛选出每个区块中不为0的索引,这些索引就是array中每个区块的初始索引;循环读出每个区块中初始索引对应的点数据,即得到切块后的每个区块的点数据。

步骤三、对每一区块点云进行点云高度计算;具体如下:

1)使用IJobParallelFor类型并行处理,获取每个区块所有点的索引,伪代码如下:

indices[index] = math.floor(data[index].xy / b);

其中,b为采样栅格边长,通常如步骤二中一样可取1米;

2)使用IJobParallelFor类型并行处理,将索引与对应点数据填入NativeMultiHashMap<int3, float4>类型的map,伪代码如下:

map[index].add(indices[index],data[index]);

3)使用IJobNativeMultiHashMapMergedSharedKeyIndices类型Job过程在map中处理索引一致的点并获取最低点高度填入数组NativeArray<float3> bottom,伪代码如下:

ExecuteFirst: height [index] = data[index].z;

ExecuteNext: if(bottom [firstIndex].z> data[index].z)

bottom [firstIndex].z = data[index].z;

步骤四、输出结果

经步骤三处理后的bottom中只包含最低点的点云,导出这些点云的高度信息即得到了路面所需要的高度信息,如图3所示即为某一区块的高度信息。

本实施例还可以作以下改进:步骤四执行完成后,将bottom中每个点云的高度信息导出形成高度图或者绘制成网格,如图4所示,即绘制成网格。

本发明充分利用Unity引擎的优势,能够快速准确地生成点云地面高度信息,并且利用一些并行处理方法加速了数据流处理,能够自动获取点云路面高度信息,避免了漏测、错测、漏画、错画等现象的发生。而且能够自动获取点云路面高度信息,后续添加的路面元素,可自动贴合到路面,大缩减了人工调整所需的工作量,也减少了产生人为误差的概率。

另外由于对整个场景的点云进行切分还是需要很大的硬件开销,因此这里只是将区块切分作为高度计算的前置条件使用,在实际应用时,在点云地图导出阶段完成区块切分。

本发明为自动驾驶仿真领域的环境点云地图生成提供了一种全新的思路与方法,具体实现该技术方案的方法和途径很多,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,对附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号