海量变电站点云实时渲染方法*

2021-04-12 09:29杨雪飞杨绍远向东伟杨成城
科技与创新 2021年7期
关键词:海量插件内存

杨雪飞,杨绍远,向东伟,杨成城

(1.中国南方电网超高压输电公司柳州局,广西 柳州 545006;2.武汉汇卓航科技有限公司,湖北 武汉 430070)

1 引言

随着电力行业的快速发展,电网规模急速扩大,传统的变电站安全运维手段需要消耗大量财力、人力去采集各金具实时温度、避雷针偏移等数据,但往往精度很低,增加了变电站事故防范和变电站检修的难度[1]。采用无人机机载激光扫描系统、可见光相机后处理三维重建等手段对变电站进行三维测量,帮助电网相关部门在最短时间内采集到变电站的三维信息,为变电站危险点智能检测、运行情况评估等提供决策依据[2]。伴随着变电站点云数据后处理技术在电力巡线中得到了广泛的应用,而如何在有限的计算机内存容量下对海量点云数据进行高效组织管理并实时渲染显示等处理已经成为阻碍变电站维护应用进一步发展的突出问题。

近年来,已经有许多国内外学者对LiDAR 点云三维可视化进行深入研究,形成了各具特色的方法案例。闫利等人[3]提出了车载LiDAR 海量点云数据管理与可视化方法,基于八叉树结构构建LOD 索引,采用多线程动态调度技术实现基于视点的海量点云渲染与漫游。王磊等人[4]提出了基于改进的八叉树索引与分层渲染的海量激光点云可视化研究,采用三维点云分块,建立八叉树索引数据文件,根据屏幕显示范围与视角变化实时读取释放点云索引数据。石祖旭等人[5]提出了基于树形结构网格矢量量化的点云渲染算法,采用八叉树构建索引,支持在线实时压缩渲染。吴建军等人[6]提出了电力巡线直升机激光扫描数据的高效组织与显示,通过并行化阈值分割构建八叉树结构,采用视点变化与分页数据库的内外存调度方法。李冻[7]提出了基于OSG的LAS 文件三维渲染方法,采用四叉树存储结构和内外存调度的方法,生成多个子节点的Las 文件,同时对多个文件读写消耗大量时间。以上相关研究的激光点云数据场景主要是城市激光扫描点云数据,而变电站点云数据相比城镇激光扫描点云数据,存在场景中地物复杂,平面X、Y轴方向上跨度大,竖直平面Z轴方向点云分布稀少且不均匀等问题,针对海量变电站点云数据进行组织管理以及实时渲染显示需要考虑这些特点。虽然吴建军等人[6]的研究对象为电力场景点云数据,但是其采用八叉树数据结构来对点云数据进行组织与调度,为保证八叉树数据结构的动态性以及平衡性,对电力场景点云数据进行额外预处理,延长了点云分块时间。

针对以上情况,本文在前人研究的基础上,提出一种适用于海量变电站点云数据的快速可视化和实时渲染的方法。采用四叉树构建索引,结合OSG[8]三维引擎的PagedLOD 技术[9]根据不同视域分页显示,并结合GLSL 着色语言对点云实时渲染。本文主要通过以下几点对其说明:①快速构建四叉树结构的LOD[10]索引,利用文件内存映射解决海量数据存储问题,简化分块算法、缩短构建索引时间;②自定义PPCD 插件,基于OSG 的PagedLOD 技术,设置不同视域显示相应的细节层次,采用多线程实现实时调度和加载;③利用GLSL 着色语言[11]实现点云实时渲染、裁剪等处理。

2 基于四叉树结构的LOD 索引快速构建

目前,索引树主要包括K-D 树[12]、四叉树[13-15]、八叉树[16]、R 树[17]等,其中,R 树具有较强的调节性和灵活性,相关学者提出了一系列的改进方法。其中如BECKMANN通过对R 树算法研究改进提出R*树[18],R*树的优越性主要体现在查找方式和节点操作的多样性,但是R*树相对R 树构建索引所需要的时间过长,不适合海量点云数据处理。K-D 树结构为一种二叉树,特别之处是每一层都存在选择子节点,通过每一层的节点遍历寻找其子节点并显示,但是在可视化分页显示中对节点剔除、显示的计算会显得十分复杂,不利于海量点云数据的实时渲染。与结构相对简单的四叉树和八叉树相比,R 树节点之间存在交集,容易导致数据存储冗余,过多消耗计算机性能。相对于城市建筑物的点云数据,变电站点云数据分布不均匀,直接采用八叉树数据结构会导致叶节点不平衡,构建效率低。而利用四叉树对变电站点云数据进行划分,仅需考虑平面内X、Y方向的坐标而直接忽略Z方向坐标,处理简单且四叉树构建效率较高。经上述分析,本文采用四叉树数据结构来对变电站点云数据创建索引。

四叉树索引是将地理空间递归划分为不同层次树的结构。将已知范围的空间等分成四个相等的子空间,如此递归下去,直到树的层次达到一定深度后停止分割,如图1 所示,四叉树的查询子节点效率较高,能更好实现点的快速查询。

图1 四叉树结构的索引树结构

由于海量点云数据的数量以千万甚至亿级作为计量单位,若是分块算法显得冗余,则会导致构建索引时间过长,消耗内存过大。本文解析的点云数据文件采用LAS、LAZ格式存储,其中包含点云坐标值、颜色信息、分类信息、强度信息等相关信息。由于原本存储的点云属性丰富,导致构建索引树时会占用大量内存,需重新定义点云数据结构,构建的数据结构如图2 所示,其中包含简单的三维点位置信息pos_x、pos_y、pos_z,颜色信息 rgb_r、rgb_g、rgb_b,quadrant表示四叉树最底层节点编号。

图2 自定义单个点数据结构

点云数据如何快速按照四叉树索引结构分块是基于四叉树结构的LOD 索引构建的关键点。若是分块算法在运算中烦琐、冗余,则会导致处理速度大大降低。本文本着将分块算法极简化,解析LAS、LAZ 文件过程中便将点云按照四叉树结构分块完成。

算法输入:点云集合,四叉树最大深度(树高)为H。

算法输出:点云按照grid_id从小到大排序好。

具体步骤如下:①读取LAS、LAZ 文件的头文件获取外围包围盒大小(Xlong,Ylong)X轴方向上最小值xmin,Y轴方向上最小值ymin;②根据N=4(n-1)计算出网格数,得到X轴、Y轴方向上的网格数n,根据并根据grid_id=(grid_x-1)×n+grid_y计算每个点的grid_id;④最后按照每个点记录的grid_id值从小到大使用快速排序法排序;⑤退出算法。

根据提前构建的四叉树,按照grid_id值有序放在对应的节点位置上。通过对四叉树由下到上的遍历,并写入LOD索引文件中。

父节点按照子节点数据进行点云抽稀如图3 所示,初始设置索引树为4 层。第四层中5、7、6、6 分别代表此节点中所含有的将原始点云根据顺序编码值分块之后的点云数量。将5、7、6、6 点云集构成一个集合,根据抽稀比例1∶4,得到父节点包含的点云数为8 个,以此类推遍历完四叉树。

图3 父节点按照子节点数据进行点云抽稀

本文重点研究的是海量变电站点云的显示及渲染,其数据规模通常远大于千万数量级,若仅仅依靠计算机内存来存储构建索引树过程中生成的临时数据,会面临因计算机内存不足而导致生成索引失败的问题。若是采用邱炎等人[19]提出的基于外存八叉树的三维激光点云实时渲染技术,将超过计算机内存容量的点云数据通过外部存储器构建索引结构,则导致计算机一直对多个文件进行读写,严重影响构建索引树的效率。由于上述原因,本文采用的文件内存映射[20]方法,将需存储在物理内存的数据映射到特定地址范围,然后通过指针访问内存映射文件里的内容。一旦需读取的LAS 文件被映射,就能访问它,就像整个LAS 数据已经加载内存一样,从而不需要对文件执行I/O 操作,这对LAS 文件解析并存储效率较高,提高构建索引树生成LOD 索引文件速率。

3 基于PPCD 插件的点云动态管理

基于OSG 和OpenGL 技术对点云可视化进行研究,采用C++平台的程序接口(Application Pro-gramming Interface,API),能够更加方便、快速地创建高性能、跨平台的交互式图形程序[21]。OSG 自带插件(osgdb_las)支持对LAS 点云文件解析并显示,但是osgdb_las 插件将点云数据一次性读取并放入物理内存,若是点云数据过大,会导致点云交互卡顿甚是死机,因此osgdb_las 插件不能满足大规模点云渲染的需求。

PPCD 插件需要满足OSG 插件工作机制,如图4 所示,尝试使用osgDB 读取或写入文件时,根据文件的后缀名查找OSG 中已注册的插件,若是存在成功执行I/O 操作,返回相应的数据;若是不存在则不能成功执行I/O 操作,返回失败信息。

图4 OSG 插件机制图

PPCD 插件根据四叉树模型,由上往下遍历节点信息并显示,在OSG 的场景树管理结构中,专门提供了场景结点osg::PagedLOD 技术来展示不同的细节层次模型。其中,osg::PagedLOD 结点作为父结点,每个子节点作为单个细节层次展现,通过设置不同的视域,在不同的视域内显示相应的细节层次,加载过程中有单独的线程负责实时调度和加载,以此决定对物体渲染的资源分配与资源删除,降低非重要物体模型的面数和细节度展示,获得高效率的渲染运算。OsgDB::DatabasePager 负责执行场景动态调度工作,通过DatabasePager::registerPagedLOD(node)注册 PagedLOD 节点,DatabasePager 实时遍历场景中节点设置视域范围,计算节点与窗口视域距离,将长期处于不在设置视域范围内的节点认为不会立即显现的场景元素,通过数据线程删除。利用osg::Group、osg::Node、osg::Geometry、osgDB 等相关类实现显示。其核心代码如下。

osg::Geode*geode=new osg::Geode;

osg::Geometry*geometry=new osg::Geometry;

osg::Vec3Array*vertices=new osg::Vec3Array;

osg::Vec4ubArray*colours=new osg::Vec4ubArray;

for(int i=0;i

vertices->push_back(osg::Vec3(points[i].x, points[i].y,points[i].z));

colours->push_back(osg::Vec4ub(points[i].r, points[i].g,points[i].b,a));

}

geode->addDrawable(geometry);

osg::PagedLOD*plod=new osg::PagedLOD();

plod->addChild(geode);

plod->setRange(0,0,radius);

plod->setCenter(plod->getBound().center());

其中,points 为四叉树节点点云集合,(0,radius)为视域范围。

4 基于GLSL 的点云着色及剪裁

三维渲染引擎为了实现三维场景图像的结构管理和绘制,包含至少两个层次:构建层和交互层,前者提供三维空间中设计和完成需要的工具集,或者从外部加载复杂模型的数据接口;后者提供对三维空间及所含模型的装配、渲染、优化和控制功能。通过场景视图、图形设备、渲染器、摄像机等联合控制场景节点,详细关系如图5 所示。

图5 窗口、摄像机、渲染器、场景图等之间的关系

基于PPCD 插件的读取点云显示完成后,为了最大程度地保证点云数据实时渲染、交互流畅性。本文点云数据渲染采用GLSL 着色语言,其中点云实时渲染操作包括:点云裁剪、分类渲染、高程渲染。点云裁剪应用视锥体裁剪技术,设置显示范围区域,使用深度优先的递归遍历对四叉树节点进行遍历,判断节点是否在视锥体范围内,如果在视锥体内则计算节点里的点云数据是否在视锥体范围内。分类渲染主要是根据读取点云属性类别信息,根据不同的类别信息设置不同RGB 值。高程渲染主要是根据读取点云Z轴方向上最大值与最小值,依次求取各点的高程值在最大值与最小值所在区间的比率,根据比率修改RGB 值,达到自上而下颜色渐变过程,具体思路流程如图6 所示,最终加入到渲染队列中完成渲染,渲染效果如图7 所示。

5 实验与分析

为了验证本文海量点云组织管理方法能够高效支持点云实时渲染、快速处理。基于Visual Studio2017 采用C++编程实现索引树构建、文件内存映射、osg::PagedLOD 节点动态加载、点云实时渲染。主要硬件配置:CPU 为Inter CoreI7、32 GB 内存、显卡为Nvidia GeForce GTX1080。

本文采用广西壮族自治区柳州市某变电站的点云模型数据,总文件大小为17.1 GB,通过裁剪方式将LAS 文件分成665 MB、1.2 GB、3.21 GB、7.3 GB 等不同大小LAS 文件。将LAS 文件导入市面上流行的点云显示软件,如:CloudCompare、Lidar360、Displaz。通过对几种软件的海量点云显示所需要进行比较,结果如表1 所示。

图6 高程渲染-计算单个点RGB 值思路流程

图7 高程、分类渲染,裁剪效果图

由表1 分析得到当LAS 文件越来越大时,每个主流软件构建索引树并显示所需要的时间呈直线上升。其中表1 中Lidar360、PPCD 插件显示点云速度所需要时间是因为第一次打开该LAS 文件,需要构建索引书生成LOD 索引文件,之后打开该LAS 文件所需要显示时间几乎可以忽略不计。

基于OSG 三维引擎搭建的可视化平台PowerModel,将17.1 G 的LAS 文件生成相应的LOD 索引文件,导入可视化平台。由于该文件为激光数据,为了展示更好的效果,初始设置渲染为高程渲染,渲染效果如图8 所示。

表1 各种三维平台显示点云速度

图8 点云模型在三维平台显示

PowerModel 程序初始化占用内存130 MB;图8(a)表示在PowerModel 中远看点云数据模型时程序占用内存1.7 GB;图8(b)表示在PowerModel 中近看点云数据模型时程序占用内存630.2 MB。从上面数据可以看出,当点云数据细节层次展示时不会加重计算机内存容量负担,反而远看点云数据模型全貌更消耗计算机内存容量。同时PowerModel 支持对点云数据的放大缩小、漫游、旋转和全图等操作。

6 结束语

为了满足海量变电站点云数据的快速调度与后处理需求,本文提出一种支持海量点云快速构建四叉树结构的LOD索引的方法,并在该方法上实现了高效的海量变电站点云数据的实时渲染。通过相关实验表明,本文研究技术能够支持大范围海量变电站点云数据的动态调度显示、交互操作等过程,支持对点云的分类、裁剪等相关后处理,具有一定的应用价值。海量点云数据的包围盒大小与四叉树最优深度的关系、海量点云生成LOD 索引文件速率是后续研究的重点,这些研究有望进一步提高变电站点云数据分析、处理系统的自动化程度、点云交互流畅性。

猜你喜欢
海量插件内存
一种傅里叶域海量数据高速谱聚类方法
海量GNSS数据产品的一站式快速获取方法
用好插件浏览器标签页管理更轻松
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
海量快递垃圾正在“围城”——“绿色快递”势在必行
“春夏秋冬”的内存
请个浏览器插件全能管家
基于jQUerY的自定义插件开发
一个图形所蕴含的“海量”巧题
内存搭配DDR4、DDR3L还是DDR3?