水下冰层声纳可视化
在第二次世界大战期间,北极成为德国和苏联潜艇的活跃战区,它们偶尔会潜入冰下以躲避探测。战后,人们对冷水声学的兴趣促使了声纳和导航仪器的研究,这些仪器可以应用于在北极地区作业的潜艇。由于冷战以及海军对北极核战争可能性的日益关注,几乎所有美国潜艇都实现了冰下作战能力。
随着第一艘核潜艇 USS 鹦鹉螺号 的出现,覆盖冰层下的北冰洋最终得以充分探索并用于海军作战。今天,冰下作业已成为美国和其他国家潜艇的标准操作。此外,研究表明,声纳可用作探测和定位冰下石油泄漏的工具。因此,出于战略和环境原因,研究冰下声音特性非常重要。
二十多年来,位于罗德岛州纽波特的 Naval Undersea Warfare Center(海军水下作战中心)一直在研究和建模冰下声音环境。目前的工作涉及使用 3-D 可视化来帮助理解由声能撞击构成水下压力脊的冰块而产生的复杂散射。这些压力脊,在水面以上被称为冰丘,在水面以下被称为冰龙骨,是在漂浮的北极冰碰撞时形成的(图 1)。
当前的 3-D 可视化工作建立在先前一项努力的基础上,该努力在概念上旨在向潜艇指挥官展示通过渲染来自拖曳式潜艇声音传感器的数据而创建的目标位置体积。随后,该软件经过修改和大大增强,可以显示世界各地的环境信息,包括北极冰层下。增强型 3-D 显示器能够在多种环境中实现沉浸式立体视觉观看,包括固定的岸基设施,如 3-D CAVETM,或移动系统,如使用头戴式显示器 (HMD,图 2) 的笔记本电脑。
预计通过使用这些高水平的图形技术,无论是战术还是环境方面的快速目标识别,以及数据挖掘都将有助于更好地理解海军感兴趣区域中复杂的声音行为。
虽然最初的软件是为在 Silicon Graphics IRIX 操作系统下运行而编写的,但在撰写本文时,新的 Undersea Environmental Visualization (UEV) 版本与 Red Hat Linux 7.0 到 9.0 兼容,并且已在这些版本下进行了测试和开发。选择 Linux 作为操作系统有几个原因。首先,它与当前和未来的潜艇作战系统兼容。其次,它是一个通用的 UNIX 操作系统,这意味着在 Linux 下开发的软件和脚本文件可以轻松地转移到 UNIX 操作系统,如 HP-UX 和 IRIX。第三,它是一个开源操作系统,拥有庞大的用户社区,可以利用它进行系统优化和维护。
UEV 系统由两个主要模块组成,即边框和主 3-D 显示应用程序。这两个模块通过 TCP/IP 套接字相互通信。图 3 说明了这种架构。
选择单独的模块来显示 2-D 和 3-D 数据,以便为每个显示使用单独的查看媒体,从而为两者实现最高分辨率。在其扩展形式中,边框还支持 2-D 俯视图。尽管如此,该系统足够灵活,允许在单个屏幕上同时显示两个显示器,如图 3 所示。这种同步视图不支持 2-D 俯视图,但它支持扩展版本的所有功能。
边框是一个数字信息和 3-D 场景控制程序。在边框和主程序之间传递的变量包括 3-D 海洋/地形图、3-D 冰盖数据(包括冰龙骨)、冰龙骨目标强度数据和 3-D 声音传播数据,以及载具位置数据。UEV 显示器的边框是使用 XForms 库编写的。XForms 是一个基于 Xlib 的 GUI 工具包,用于 X Window System。它具有丰富的对象集,如按钮、滚动条和菜单,集成到一个简单高效的对象/事件回调执行模型中,可以快速轻松地构建应用程序。此外,该库是可扩展的,可以轻松创建新对象并添加到其中。此外,之所以为 UEV 软件的原型版本选择 Xforms,是因为它是一个稳定且易于使用的应用程序程序员界面 (API)。此外,在 Linux 下操作完全不需要重新编码。
边框和主 3-D 显示之间的通信通过套接字进行,这些套接字建立为数据报,其中通过网络发送的消息是在两个应用程序之间异步传递的自包含数据包。之所以选择这种异步通信形式,是因为两个程序之间的数据更新速率足够慢,以至于这种原始的程序内通信形式就足够了。这些链接在其构造中是原始的,需要运行边框和 3-D 主应用程序的机器的特定 IP 地址。同样,至少对于海军实验室的研发而言,快速且廉价的实施是创建原型软件的驱动力。这是因为软件通常不会超越原型阶段——与编程优雅相关的成本是一种奢侈。
但是,后续 UEV 软件的要求是它必须在 Microsoft Windows 和 Linux 下运行。XForms 的 Xlib 版本对于 Linux 来说没有问题,但对于 Windows 来说却是一个大问题,除非它在 Cygwin 环境中运行。虽然这是一个选项,但首选是在 Microsoft Visual C++ 和 Linux 环境中本地运行的代码。
我们的解决方案是将边框未来转换为 Fast Light Tool Kit (FLTK),这将解决多个问题。由于 FLTK 在 Microsoft Visual C++ 和 Linux 下都可以编译,因此相同的软件可以用于这两个系统。其次,边框和主应用程序之间的信息传输可以从笨拙的 TCP/IP 套接字转换为更优雅的共享内存方法。最后,通过将其 XForms C 例程转换为 FLTK C++ 方法,可以将边框代码带入 21 世纪。转换过程目前正在进行中,并且在很大程度上借鉴了 NUWC、弗吉尼亚理工大学和 Naval Research Laboratory (NRL) 为 TALOSS 项目联合开发的基于 Open Inventor 的软件。随着系统越来越依赖与 3-D 环境的 3-D 交互,边框控件将变得越来越不重要,甚至可能完全消失。最有可能的是,它们将被虚拟工具箱和基于手势的界面所取代。
3-D UEV 显示器从一个冰下冠层数据库接收其地图和导航信息,该数据库在启动时加载并根据声学情况的演变进行更新。冰下冠层数据库由一个深度均匀的冰体积和一个或多个嵌入式冰龙骨组成。声学覆盖范围决定了冰冠层的范围。
所有冰下声学信息都预渲染为 OpenGL Performer 二进制 (pfb) 文件。pfb 文件的构建始于在 Linux 平台上使用 Matlab 7.0.1。Matlab 是一种灵活的交互式工具,用于使用矩阵和向量进行数值计算,但能够以图形方式(包括 2-D 和 3-D 形式)显示此信息。因此,通过结合使用 Matlab 和基于 C 的转换代码,由 G. Bishop 开发的基于 FORTAN 的模型输出的冰下信息被消息化为与基于 OpenGL Performer 的 3-D UEV 显示器兼容的形式。
转换从一个 Matlab 例程开始,该例程计算所有多边形表面及其法线。然后,它将此信息输出到 C 编码的例程,这些例程将信息转换为 pfb 文件格式。pfb 转换是对 Silicon Graphics 实用程序 pfConvert 的修改,该实用程序可用于 IRIX 和 Linux。清单 1 中显示的代码片段被添加到 pfConvert.c 中,以读取 Matlab 代码生成的多边形信息。然后,pfConvert 例程使用自己的库将数据输出到 Performer pfb 文件。3-D 主应用程序将所有战术、导航和声学信息组合成一个全面的 3-D 图片。它使用与计算机平台无关的场景图 OpenGL Performer 渲染图片。之所以需要使用 OpenGL Performer,是因为需要一种高效且经济高效的方式在同一 3-D 显示器中显示平面和体积数据。OpenGL Performer 提供了实现这种集成的最省力的方式,尽管开源免费软件,如 OpenSceneGraph,可以在该软件的未来版本中提供 OpenGL Performer 的廉价替代品。
清单 1. pfb 转换代码片段
Load Ice Keel Node and Store as pfb file /** read input file(s) **/ i = 0; group = pfNewGroup(); for (i = 0; i < num_files - 1; i++) { printf("Make keel: %s\n",files[i]); bot_switch = (pfSwitch*) LoadKeel(files[i],limits,i); pfAddChild(group, bot_switch); printf("adding switch to group\n"); } node = (pfNode *)group; /** optimize input file (optional) **/ node = optimize(node); /* * write output file */ pfdStoreFile(node, files[num_files - 1]); /* * indicate success */ return 0; } Convert Ice Keel to Performer Node /***** LOAD AND CREATE A 3D SURFACE **********/ pfSwitch *LoadKeel( const char *file_name, float *limits, long numfile ) { /* Declare Local Variables */ pfSwitch *root; pfGroup *depth_group; pfGroup *mag_group; pfLOD *lod_ptr; pfDCS *dcs12; pfGeode *ice_geode; pfCoord coord; long lod_cols; long lod_rows; pfMaterial *material; long i; long j; long status; /* Create work space to create surface */ arena = pfGetSharedArena(); /* Load vertices, normals and colors */ status = load_data(file_name); if( status != OK ) { exit (1); } /* Create the KEEL geode */ ice_geode = MakeKeel(); /* Create a group to hold all Depth and * Magnitude Features of Surface */ depth_group = pfNewGroup(); root = pfNewSwitch(); /* Add ice geode to group */ magflag = 0; pfAddChild( depth_group, ice_geode ); dcs12 = pfNewDCS(); coord.xyz[PF_X] = 0.0f; coord.xyz[PF_Y] = 0.0f; coord.xyz[PF_Z] = 0.0f; pfAddChild( dcs12,depth_group ); pfAddChild( dcs12,mag_group ); pfDCSScaleXYZ( dcs12, 1.0f,1.0f,1.0f); pfAddChild( root,dcs12 ); pfDelete(dcs12); /* Return 3D Surface Switch */ limits[0] = -1; limits[1] = 1; limits[2] = -1; limits[3] = 1; limits[4] = 0; limits[5] = 0; limits[6] = 0; limits[7] = 1; limits[8] = 1; limits[9] = 1; return(root); }
理解复杂环境(如北冰洋覆盖冰层下)中声音能量散射产生的行为是美国海军和其他海军非常感兴趣的领域。通过同时可视化水下声混响和来自冰龙骨的相关声散射,可以大大有助于深入了解这种复杂的声学环境。
声混响,也可能被称为不需要的声音噪声,仅仅是由声音在各个方向从表面反弹引起的重音。在冰下环境中,这些表面是冰冠层和冰龙骨(图 4)。由于声能以三维方式从物体反弹,因此可以表示为一个体积。这个体积被称为混响体积,可以用称为体素的单个体积元素在 3-D 中表示。每个体素都经过颜色编码,以匹配到达它的声音能量的强度级别。类似地,直接从嵌入式冰块反弹的声音能量强度(称为声散射)也针对强度进行颜色编码。UEV 软件背后的中心思想是创建一个动画显示,使使用者能够更好地解释冰块散射的行为,以及混响体积的一些时空特性。
场景图中的各个节点表示感兴趣信息的 3-D 显示,即来自冰块表面的声散射。每个块都形成为一个六面多边形表面,每个面都经过着色,以表示来自该面的声散射的目标强度。为了节省内存并减少渲染时间,在任何给定的声散射时间间隔内,仅点亮高于预定阈值的表面。龙骨面的开启或关闭是通过使用连接到每个面部节点的开关来完成的。与给定声散射间隔相关的混响由一个颜色编码的体积表示,该体积由代表给定水深混响的薄体素体积堆栈组成。同样,这些组件混响体积在场景图中被单独寻址为节点。图 5 以图形方式说明了清单 2 中给出的冰面和混响体积的节点结构的代码片段。声散射-混响显示的推进或倒退由边框控制。显示可以设置为连续更新模式或手动步进模式。对于任何给定的时间间隔,用户可以查看冰块散射和混响信息的任何组合,包括被声波照射的块、整个冰龙骨内点亮的块;仅点亮感兴趣的冰块;整个混响体积;或用户选择的混响体积深度切片。
清单 2. 代码片段——冰面/体积混响的节点结构
Adding Target Strength & Reverb Nodes /* Target Strength & Reverberation MAKING ROUTINES */ /* Load the target strength reflected keels */ nts = 0; /* Number of keel target strengths */ for (i = startpfb; i< stoppfb; i=i+5){ sourcetime[nts] = i; /* Create load name for pfb file */ sprintf(nts_name,"./PFB/out%d.pfb",i); /* Create Target Strength switch */ ts_switch[nts]= pfNewSwitch(); /* Load Target Strength pfb file */ ts_group = pfdLoadFile(ts_name /* Create a coordinate node for * target strength */ dcs6 = pfNewDCS(); coord.xyz[PF_X] = -3300.0f; coord.xyz[PF_Y] = -650.0f; coord.xyz[PF_Z] = -125.0f; pfDCSCoord( dcs6, &coord ); /* Add target strength node to * coordinate node */ pfAddChild( dcs6, ts_group); /* Scale for good display */ pfDCSScaleXYZ( dcs6, 0.201f,0.101f,0.2f); pfDCSScaleXYZ( dcs6, 5.0f,3.3f,15.0f); /* Add Target Strength in position node * to nodal switch */ pfAddChild( ts_switch[ts], dcs6); /* Increment the Target Strength counter */ nreflects = nreflects + 1; } /* Load the reverberation field corresponding * to TSkeels */ nreverbs = 0; for (i = startpfb; i< stoppfb; i=i+5){ /* Create load name for pfb file */ sprintf(reverb_name,"./REVERB/reverb%d.pfb",i); /* Create Reverberation switch */ reverb_switch[nreverbs]= pfNewSwitch(); /* Load Reverberation pfb file */ reverb_group = pfdLoadFile(reverb_name); /* Stack the reverb planes to form a volume */ for(j=150; j<190; j++) { /* Create a coordinate node for the reverb * plane */ dcs6 = pfNewDCS(); coord.xyz[PF_X] = -450.0f; coord.xyz[PF_Y] = 300.0f; coord.xyz[PF_Z] = j*-1.0f; pfDCSCoord( dcs6, &coord ); /* Add target strength node to coordinate * node */ pfAddChild( dcs6, reverb_group); /* Scale for good display */ pfDCSScaleXYZ( dcs6, 3.5f,3.5f, 0.01f); pfDCSScaleXYZ( dcs6, 1.6f,4.3f,0.01f); /* Add Reverb plane node to nodal switch */ pfAddChild( reverb_switch[nreverbs], dcs6); } /* Increment the Reverb counter */ nreverbs = nreverbs + 1; } /**** TS and Reverb SWITCHES ADDED TO SCENE ****/ for (k = 0; k < nreflects; k++) { pfAddChild(ViewState->sceneGroup, reflect_switch[k]); ++loaded; pfSwitchVal(reflect_switch[k],PFSWITCH_OFF); } for (k = 0; k < nreverbs; k++) { pfAddChild(ViewState->sceneGroup, reverb_switch[k]); ++loaded; pfSwitchVal(reverb_switch[k],PFSWITCH_OFF); }
3-D 场景导航还允许用户放大和操作感兴趣的声学环境的特定区域。这种数据挖掘有助于更好地理解特定区域中正在发生的过程。图 7 说明了被声波照射的冰龙骨区域的目标强度的放大视图。请注意,用户可以操作场景并从几个不同的角度查看。图 7 还说明了在相同的声散射间隔内混响体积的构建,以及用于显示的单个混响切片的选择。
最后,用户可以观察构成冰龙骨的块状面的目标强度和伴随的水混响的同时演变。图 8 说明了声信号沿着冰龙骨长度的传播以及接收器(在本例中为潜艇的声学系统)的伴随混响。
冰龙骨等数据集的复杂性非常适合沉浸式可视化。龙骨可视化环境以体积形式显示声能。将用户的视点放置在该体积内,采用第一人称视角而不是当前的第三人称视角,应该可以帮助观察者。
目前,3-D 场景的操作依赖于标准键盘和鼠标。计划对冰下可视化环境进行的升级包括过渡到沉浸式显示和 3-D 手势界面。我们想到的沉浸式显示器是头戴式显示器。这种设计是便携式的,并且很容易在狭小的空间中使用,例如潜艇上的空间。
当在纯 3-D 环境中操作时,二维用户界面变得笨拙。一个优雅的解决方案是以标准游戏手柄的形式使用手势界面,并附带一个无源惯性跟踪器。目的是允许用户以任何方式轻松定位视点。此功能允许用户更好地理解目标强度和混响级别的复杂可视化表示。图 9 展示了 UEV 软件演进的下一步的原型。
一种灵活的、模块化的 3-D 数据融合可视化系统,用于研究和数据挖掘冰下声学信息,在军事和民用方面都具有广泛的适用性。海军水下作战中心基于最初由海军研究办公室 (ONR) 赞助的工作和多年的北极经验,正在为综合理解复杂海洋环境(如北冰洋覆盖冰层下和世界各地浅水沿海地区)的声学特性开发开创性的可视化技术。
由于 Linux 操作系统具有很强的适应性和通用性,因此很容易将最初为 Silicon Graphics 机器编写的软件转换为现在在 Linux 上运行。此外,由于美国海军在 Linux 和 Microsoft Windows 环境中都进行操作,因此 Linux 提供了一种经济高效的方式来更新、编译和测试 UEV 软件。我们发现,如果软件在 Linux 下编译时没有错误,那么它几乎总是在 Visual C++ 下编译,只要确保所有 Microsoft Windows 路径都正确设置的繁琐过程即可。Linux 为快速原型设计提供了独特的环境,从而产生了与 UNIX 和 Microsoft Windows 操作系统兼容的软件,因此有资格成为有价值的舰队软件加速器。
本文资源: /article/8532。
Richard R. Shell 是 Naval Undersea Warfare Center Division, Newport, Rhode Island 的电气/计算机工程师。由于他是开发 TALOSS 3-D 潜艇水下战场可视化软件团队的一员,该软件在 2003 年 11 月号的《Linux Journal》中重点介绍,因此他也是 NUWC 2003 年技术创新特殊成就中心奖的共同获得者。
Garner C. Bishop 于 1968 年获得贝茨学院数学学士学位,并分别于 1976 年和 1982 年获得康涅狄格大学理论物理学硕士和博士学位。1983 年,他开始在 Naval Undersea Warfare Center 工作,从 1994 年到 1996 年,他曾担任达特茅斯马萨诸塞大学水下声学访问讲师。他是美国声学学会会员。
Douglas B. Maxwell 是 NAVSEA Division Newport 的 Center for Advanced System Technology 的机械工程师和研究科学家。他的专业领域包括虚拟环境中的设计综合和合成训练应用。他与妻子和腊肠犬住在罗德岛州纽波特。