APP下载

基于OSG的OBS导航定位系统三维可视化场景实现

2017-08-12郑贵洲

计算机应用与软件 2017年8期
关键词:线程漫游船只

王 跃 郑贵洲

(中国地质大学(武汉)信息工程学院 湖北 武汉 430074)



基于OSG的OBS导航定位系统三维可视化场景实现

王 跃 郑贵洲*

(中国地质大学(武汉)信息工程学院 湖北 武汉 430074)

在海洋地震勘探中,海底地震仪OBS(Ocean Bottom Seismometer)导航定位系统可提高OBS投放精度。系统是在VS2010和OSG 3.0.0的可视化开发环境下,基于MFC框架,运用三维可视化技术搭建OBS投放场景,实现场景节点有效组织与管理,动态显示船只和OBS运动过程。采用Chunked LOD算法处理测深格网数据构建地形细节层次模型,应用OSG数据库分页管理和分页细节层次节点技术实现了OBS投放场景地形数据动态调度。通过场景漫游功能实现了OBS投放过程的多角度三维可视化监控,直观反映海底地形地貌与作业过程,提高了OBS投放精度和数据质量。

海底地震仪 三维可视化 OpenSceneGraph 线程冲突 地形动态调度

0 引 言

海底地震仪OBS是一种放置在海底接收人工震源或天然地震信号的海洋调查设备。自20世纪60年代问世以来,在海底深部构造调查、海洋油气勘探和天然气水合物的调查中得到了广泛应用[1]。OBS投放可分为有缆和无缆两种投放方式,均需采用专业的导航定位系统,引导作业船只到达设计目标点附近后投放OBS,使其在海底的触底点尽可能靠近目标点站位,以满足海洋地球物理对于OBS野外资料采集的导航定位的精度控制要求。然而,在实际的海上作业中,受海风、海流等复杂环境因素影响,自由落体的OBS在降落至海底的过程中会偏离设计点一定距离,这将直接影响到OBS数据采集的质量。目前应用最为广泛的有缆投放方式,通常需要结合超短基线USBL[2](Ultra Short BaseLine)水下定位系统实施作业。在此过程中,需要借助专用的导航定位系统,辅助工作人员全面了解投放区域的地理环境,实时可视化监控和引导整个投放过程,以提高OBS投放成功率。

近年来,三维可视化技术日趋成熟,在海洋研究领域的应用也不断深入。李勃[3]、王想红[4]、李新放等[5]分别构建了全球尺度的海洋多维动态三维可视化系统,实现了海洋多源数据的直观显示,但是缺乏面向OBS水下投放与定位的模块。张莉等[6]采用蒙特卡罗法模拟OBS降落海底的过程,该方法在一定程度上提高了OBS位置精度,但不能直观反映OBS水下运动过程,不具备实时性。胡家赋等[7]针对OBS水下投放的需求,设计实现了二维OBS导航定位系统,但无法直观精确了解设备的采集环境。在实际OBS投放作业过程中,要求能从不同视角观测OBS从海面到设计目标点投放过程中实时移动状态和相对位置关系,同时能直观获悉拟投放区域的海底地形地貌,充分地考虑海底地形对OBS工作状态的影响,传统的二维可视化方法显然无法满足这些要求。针对以上问题,本文在研究三维渲染引擎OpenSceneGraph[8]的基础上,通过Chunked LOD算法处理测深格网数据并生成地形细节层次模型。以VS2010为开发平台,采用OSG 3.0.0作为图形开发库,结合osgOcean海洋模块构建了OBS投放三维可视化场景,直观反映研究区域海底地形地貌,实现对OBS的实时监控和精确定位。

1 OBS投放场景结构设计

1.1 场景体系结构设计

OBS投放场景体系结构可分为数据层、驱动层和应用层三部分,如图1所示。数据层包括场景模型、海底地形模型及导航定位数据。场景模型包括调查船只、OBS、站位等.3ds格式的模型数据;海底地形模型是测深格网数据通过VPB等工具处理得到的分页地形数据库文件;导航定位数据包括GPS、罗经、OBS以及水深仪实测数据,系统通过支持串口通信和TCP/IP网络通信两种方式的实时通信模块读入外设数据[9]。驱动层通过OSG渲染引擎对场景数据进行组织、渲染和管理。应用层实现了OBS和调查船只等场景要素的显示、场景动态更新以及场景漫游等功能,可以全方位观测投放过程中OBS与目标站位间的空间位置关系。

图1 场景体系图

1.2 场景组织结构设计

OSG场景采用一种自顶向下的分层树状数据结构来组织空间数据集,以提高渲染的效率。场景树由节点组成,节点可以是可绘制对象、矩阵变换以及状态切换等,它能够反映场景的空间组成结构以及对象的属性状态。场景树顶部是一个根节点,自根节点向下分别为组节点和叶子节点。组节点包含了场景对象的渲染状态信息和几何信息,而处于场景树底部的叶子节点则包含了场景对象的实际几何信息,叶子节点没有子节点。osgOcean是OSG的海洋模块,作为一个子节点加入场景中,具备有可调波浪大小、水面的反射与折射、支持海平面模型的快速傅里叶(FFT)变换、水底光照(God Rays)、海面光晕、海底的雾效果等特效[10]。场景树结构如图2所示。

图2 场景树结构图

2 OBS投放场景实现

2.1 场景核心类设计

三维可视化场景核心类主要分为三部分:继承自osg::Referenced的COSG、OBS3D、SteelCable3D、Ship3D、OBS3DSurveyLine及OBS3DStation等类;继承自osg::NodeCallBack的SteelCableCallBack、OBSPosCallBack、SurBoatCallBack及SurCameralCall-Back等类;继承自osgGA::CameraManipulator的TravelManipulator类。场景核心类图如图3所示。

图3 场景核心类图

COSG类主要负责场景、相机、漫游器的初始化,海底地形的加载和移除及场景渲染。OBS3D、SteelCable3D、Ship3D、OBS3DStation及OBS3DSurveyLine类分别负责OBS、拖缆、船只、站位及测线在场景中的加载和移除。SteelCableCallBack、OBSPosCallBack和SurBoatCallBack类继承自节点回调类,根据读入的外设数据对场景进行动态更新,通过回调机制实现拖缆、OBS和船只等场景模型的动态显示效果。SurCameraCallBack类负责天空盒跟随视点移动,确保场景的可见性。TravelManipulator类定义了一系列操作实现场景的漫游、目标居中定位、视点跟随等功能。

2.2 场景动态更新

OSG中节点主要使用回调机制来完成用户在每帧中所要执行的工作。在遍历场景过程中,如果遇到与用户定义的回调类和函数相关联的节点,则执行该节点的回调。按照关联方法的不同,可分为更新回调和人机交互回调等。本文主要通过船只、OBS及拖缆的更新回调方案实现场景动态显示效果。以船只节点回调为例,首先编写继承自NodeCallback类的新类SurBoatCallBack;其次重载operator()方法获取船只节点位置变换矩阵;最后在Ship3D类中通过VecMatrix->setUpdateCallback(VecCallBack.get())设置回调实例,完成船只节点的回调,其中VecMatrix为位置变换矩阵。节点更新回调功能主要通过operator()方法实现,它包含两个参数,分别是关联节点地址osg::Node* node和节点访问器osg::NodeVisitor* nv。获取关联的船只节点并设置节点访问器遍历类型为UPDATE_VISITOR,分别计算世界坐标系下的变换矩阵、缩放矩阵和旋转矩阵,相乘可以得到船只节点在更新回调中的位置变换矩阵,主要实现代码如下:

void operator()(osg::Node* node, osg::NodeVisitor* nv)

{

vecNode->GetBoatGNode();

//获取船只节点

nv->getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR;

//设置节点访问器

//计算船只节点位置变换矩阵

matrix=osg::computeLocalToWorld(nv->getNodePath());

//计算世界坐标系下的变换矩阵

scal.makeScale();

//计算缩放矩阵

rot.makeRotate();

//计算旋转矩阵

matrix = scal * rot * matrix;

//计算位置变换矩阵

}

此外,拖缆是连接船只和OBS的缆线,它实质上是一个osg::Vec3Array类型的三维顶点数组,根据船只节点坐标和OBS节点坐标,通过算法可以计算拖缆上一系列点的坐标,并存储在三维数组中,再由渲染线程绘制出来。由于在读取外设数据时船只和OBS的位置坐标值是不断变化的,因此拖缆上点的坐标在每帧渲染时也需要更新。此时拖缆在进行更新回调时主线程和渲染线程就会发生资源同抢的问题,导致场景运行卡顿。本文解决线程冲突的具体流程如图4所示。

图4 线程冲突解决机制

当需要更新顶点数组时,先暂停渲染线程,由主线程进行修改,修改完成后再启动渲染线程进行渲染。首先定义全局布尔型变量NeedModify和CanModify,并初始化值为false。在渲染线程中,通过函数PreFrameUpdate()判断是否需要进行修改,若不需要修改,则进入frame()函数进行渲染;若需要修改,在主线程中将NeedModify值置为true。此时在函数PostFrameUpdate()中CanModify值也变为true,再回到主线程中更新顶点数组坐标值,修改完成后将NeedModify值置为false,启动渲染线程进行场景渲染工作。通过这种设置信号量的方法可以有效解决线程冲突问题,保证场景的流畅显示。

2.3 场景漫游

进行场景交互时,通过改变视点位置和视点方向,实现虚拟场景漫游功能,获取场景对象的相关信息[11]。 osgGA::CameraManipulator类继承自osgGA事件处理器osgGA::GUIEventHandler类,它由GUIEventAdapter和GUIActionAdapter组成。前者定义了一个且仅有一个人机交互事件,是OSG交互事件和系统交互事件的适配接口;后者实现了用户向系统传递请求的功能。场景漫游功能主要在TravelManipulator类中实现,该类继承自CameraManipulator类,它提供了矩阵变换和事件处理的接口,可以通过重载矩阵变换函数和事件处理函数实现漫游功能。四个矩阵变换函数均为纯虚函数,分别是setByMatrix()、getMatrix()、setByInverseMatrix ()及getInverseMatrix(),可以通过重载get函数向viewer传递矩阵,从而控制当前视口。定义事件处理函数bool TravelManipulator::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIAction-Adapter &us),首先在handle()函数中添加所需的事件处理函数,包括handleKeyUp、handleKeyDown、handleMousePush、handleMouseDrag及handleMouse-Release五种类型的事件,通过响应键盘和鼠标操作实现漫游功能;其次进行碰撞检测[12];最后通过viewer->setCameraManipulator(camera)将操作器和场景相关联。

三维场景提供多种观测角度对OBS投放过程进行监控,可以通过视点跟随功能实现。视点跟随是一种是基于目标的漫游,其原理是选取一个视点,将船只和OBS的运动矩阵和相机矩阵关联起来,实现相机跟随视点的效果[13]。分别定义函数computeFollowSide-Position()和computeFollowBackPosition()来实现侧视角和后视角跟随功能,实现过程中根据场景中有无OBS节点可分为两种情况。船只航向角是以正北方向为基准线的,首先获取船只航向,再经过坐标转换得到直角坐标系下的角度变量,最后分别计算位置坐标和旋转角度的值,通过矩阵函数实现视点跟随功能。

3 OBS投放场景地形动态调度

3.1 地形网格LOD模型构建

随着三维地形可视化技术不断发展,对地形的显示范围和精度要求越来越高。本文研究区域范围为105°E-122°E,8°N-25°N,横跨UTM投影下48、49、50和51四个分带,原始格网数据量较大,地形数据难以一次性载入计算机内存中,加大了实时渲染的难度。

本文采用Chunked LOD[14]算法构建地形模型,后人也对基于分块的地形算法进行了一定改进和应用[15-18],地形效果图如图5所示。本文构建一个自上而下包含整个地形区域的四叉树,它的每个节点包含一块地形,子节点包含其父节点地形的四分之一,但分辨率更高,根节点表示最粗糙的地形,叶子节点表示最高分辨率的精细地形。该算法需要对地形数据进行预处理,将生成的静态地形数据存储在网格中。每个块内的数据可以通过一个绘制命令和一个高级的混合通道来完成绘制。本文中构建的四叉树深度值为8,将地形数据按照不同的细节层次进行分块预处理,块与块之间相互独立,在地形渲染过程中,通过多线程分别调用不同层次不同区域的地形,实现了out-of-core算法对数据的分页管理和动态调度。此外,相邻块的细节层次不同会导致裂缝的产生,本文采用“裙边法”消除裂缝,如图6所示。在块的周围构造垂直的裙边,每个地形块的纹理不变,裙边只影响本块,该方法可以有效地消除裂缝。

图5 地形效果图

图6 裙边法

3.2 地形数据动态调度

在渲染地形时,不管是视锥体裁剪技术还是通过LOD算法构建金字塔模型与四叉树索引,都是减少传入渲染管道中的顶点数量,以此提高渲染效率。但是这并不能完全解决在内存中载入海量数据的问题,因此,地形数据的分页机制尤为重要。本文中,借助OSG的分页数据库(DatabasePager)与分页细节层次节点技术(PagedLOD)实现了地形的动态调度。

DatabasePager的核心思想是在内存中加载需要的数据,卸载不需要的数据,确保内存中始终维持有限的数据额度。其主要工作可以分为删除对象、加载对象、预编译对象及将对象合并到场景四部分,其中分页和节点管理工作由DatabasePager内置的数据线程DatabaseThread负责。PagedLOD用于实现动态分页加载,它的每个节点都是磁盘中的文件,可以根据需要加载这些文件,加载过程中有单独的线程负责实时调度及加载。PagedLOD技术需要用到DatabasePager,它在场景中会筛选不同细节层次的模型,选择出需要的,并通知DatabasePager进行加载和卸载操作。因此,PagedLOD技术整合了LOD技术和DatabasePager技术,既能提高渲染效率,又能提高内存效率[19]。地形的渲染流程如图7所示。

图7 地形渲染流程图

图8 三维可视化效果图

本文实验数据为场景模型数据、南海局部海底地形格网数据、GPS导航定位数据及OBS数据等,实验所采用的计算机硬件配置为:CPU Intel Core i5-2410M,6.0 GB RAM,NVIDIA GeoForce GT540显卡,显存为1 GB;软件环境为:Windows 7 64 bit操作系统,Visual Studio 2010,渲染引擎采用OpenSceneGraph,编程语言为C++。场景效果图如图8所示,(a)为海洋表面效果图;(b)为OBS投放作业场景,此时洋面自动隐藏以显示海底地形,船只拖着OBS沿测线行进,并绘制出OBS轨迹线。该系统相比于国内其他专业水上测量导航系统而言,采用三维可视化的表达方式更加直观,可以充分考虑海底地形地貌对OBS工作状态的影响,多角度实时观测OBS从海面投放点到设计目标点的投放过程中实时移动状态和相对位置关系,从而提高OBS定位精度。系统经过模拟测试与海上测试,在作业时场景渲染流畅,地形渲染效果达到预期,系统运行稳定,操作方便,可以很好地辅助工作人员实施作业,实际的布设效果理想。

4 结 语

OBS导航定位系统是以VS2010集成开发环境为平台, OSG为三维渲染引擎实现的。基于MFC框架,结合OSG海洋模块osgOcean,运用三维可视化技术搭建OBS投放场景,直观反映海底地形地貌及OBS投放过程。通过Chunked LOD算法处理地形格网数据构建地形LOD模型,采用OSG数据库分页管理和分页细节层次节点技术实现了OBS投放场景地形的动态调度。通过视点跟随的方法辅助多角度监控OBS投放,实现虚拟场景管理及漫游,完成良好的交互式三维可视化。但系统还存在很多不足,例如,Chunked LOD算法无法实时更新或者增强细节,突跳现象明显,系统的运行速度有待提高等问题。随着GPU可编程管线渲染技术不断成熟,采用一种更加有效的地形网格渲染方法也是下一步研究的重点。此外,随着OSG的地景渲染工具osgEarth不断发展和完善,使用osgEarth对OBS投放场景进行构建必将取得更好的效果。

[1] 吴志强, 陈建文. OBS在我国海洋深部地质调查中的应用现状和前景[J]. 海洋地质动态, 2008, 24(9): 35-42.

[2] 王德刚, 韩富江, 来向华, 等. 超短基线定位原理及校正方法研究[J]. 海洋科学, 2011, 35(2): 77-81.

[3] 李勃. 虚拟海洋与三维可视化仿真引擎的研究与开发[D]. 中国海洋大学, 2013.

[4] 王想红. 基于三维虚拟地球的海洋环境数据动态可视化研究[D]. 辽宁工程技术大学, 2013.

[5] 李新放, 刘海行, 周林, 等. 基于 OpenSceneGraph 的海洋环境三维可视化系统研究[J]. 海洋科学, 2012, 36(1): 54-58.

[6] 张莉, 赵明辉, 王建, 等. 南海中央次海盆 OBS 位置校正及三维地震探测新进展[J]. 地球科学: 中国地质大学学报, 2013, 8(1): 33-42.

[7] 胡家赋, 晋俊岭, 任东宇, 等. 海底地震仪布设导航定位系统的设计与实现[J]. 测绘科学, 2014, 39(4): 68-73.

[8] 王锐, 钱学雷. OpenSceneGraph三维渲染引擎设计与实现[M]. 北京: 清华大学出版社, 2009.

[9] 袁国斌, 裴承艳, 尚建嘎, 等. 面向 OBS 导航定位的实时通信模块设计与实现[J]. 电子技术应用, 2013, 39(6):136-138.

[10] 陈宁, 聂垒鑫, 刘炜, 等. 基于 OSG 的海洋漫游场景开发[J]. 江苏科技大学学报(自然科学版), 2013, 27(4): 386-390.

[11] Hu J, Wan W, Wang R, et al. Virtual reality platform for smart city based on sensor network and OSG engine[C]// Audio, Language and Image Processing (ICALIP). Washington DC: IEEE Computer Society Press, 2012: 1167-1171.

[12] 明芳, 李峻林. 基于 OSG 的虚拟场景漫游技术研究[J]. 计算机与数字工程, 2011, 39(3): 133-137.

[13] 叶伟. 基于 OSG 的虚拟校园漫游系统研究与实现[D]. 南昌航空大学, 2013.

[14] Ulrich T. Rendering massive terrains using chunked level of detail control[C]// Proc.of SIGGRAPH’02. San Antonio, Texas,USA: ACM Press, 2002.

[15] 宋省身, 全吉成, 赵秀影, 等. 基于 Chunked LOD 的实时细节增强地形算法[J]. 计算机工程与设计, 2014, 35(2): 578-582.

[16] 万明, 梁霞, 张凤鸣. 一种四叉树地形渲染裂缝的改进消除算法[J]. 系统仿真学报, 2015 (7): 1520-1525,1531.

[17] 侯绍洋, 赵学胜, 官亚勤. 基于多分辨率半边的分块 LOD 模型无缝表达[J]. 地理与地理信息科学, 2015, 31(4): 18-21.

[18] Suárez J P, Trujillo A, Santana J M, et al. An efficient terrain Level of Detail implementation for mobile devices and performance study[J]. Computers, Environment and Urban Systems, 2015, 52: 21-33.

[19] 李雷. 基于OGRE的海量三维模型动态调度技术的研究与实现[D]. 广西大学, 2012.

IMPLEMENTATIONOF3DVISUALIZATIONSCENEFOROBSNAVIGATIONANDPOSITIONINGSYSTEMBASEDONOSG

Wang Yue Zheng Guizhou*
(CollegeofInformationEngineering,ChinaUniversityofGeosciences(Wuhan),Wuhan430074,Hubei,China)

In marine seismic exploration, OBS navigation and positioning system can improve the OBS delivery precision. In order to organize and manage scene nodes efficiently and display movements of ship and OBS dynamically, the system uses 3D visualization technology to build OBS delivery scene based on MFC framework under the visual development environment of VS2010 and OSG 3.0.0. We use bathymetric grid data to generate terrain LOD model based on Chunked LOD, and use DatabasePager and PagedLOD technology to realize dynamic scheduling of terrain. The system achieves 3D visualization and multi-angle surveillance of OBS delivery process through roaming. It shows the seabed topography and operation process directly, and improves the OBS delivery precision and data quality.

OBS Three dimensional visualization OpenSceneGraph Thread conflict Dynamic scheduling of terrain

2016-07-04。国家高技术研究发展计划项目(GZH201200508)。王跃,硕士生,主研领域:虚拟现实,三维可视化。郑贵洲,教授。

TP391.41

A

10.3969/j.issn.1000-386x.2017.08.017

猜你喜欢

线程漫游船只
实时操作系统mbedOS 互斥量调度机制剖析
基于国产化环境的线程池模型研究与实现
霹雳漫游堂
NASA漫游记
计算机中的多线程问题
孟加拉船只“罢工”
边走边看:漫游海底 梦想成真
Java的多线程技术探讨