前言

在飞机航行的过程中,客舱里座位上方的荧屏上,除了播放电视剧和广告之外,还会时不时的切换到一个飞机航行的监控系统。这个监控系统的主要目的是,让乘客可以了解到飞机在航行过程中的整体状况、距离目的地的航线进程以及一些有可能出现的突发事件。飞机航行的监控系统在一定程度上,可以使乘客在旅途过程中得到准确的信息源,最重要的是可以使乘客在旅途中得到安心。在保障乘客获取到实际信息源的同时,飞机航行的监控系统也能将采集到的数据及时的反馈给航务人员,而且将数据记录保存下来,在飞机过站或航后供航务和机务人员使用和监测维护。介于 2D 组态和 3D 组态上,Hightopo(以下简称 HT )的 HT for Web 产品上的有着丰富的组态化可供选择,本文将介绍如何运用 HT 丰富的 2/3D 组态搭建出一个飞机航行的监控系统的解决方案。

预览地址:flight-monitor

系统分析

飞机航行监控是一种测量、跟踪飞机性能变化趋势的简单而实用方法。在日常航班飞行中,用机载仪表记录飞机巡航时的有关参数,并将其与原有性能进行比较。监控的主要参数有:飞行单位时间消耗的燃油量、飞机的巡航飞行速度和消耗单位燃油量飞机飞过的水平距离。它们分别表示发动机、飞机及飞机发动机的综合性能。它们分别表示发动机、飞机及飞机发动机的综合性能。性能监控的结果,既可为飞机维修提供可能的故障信息,又为制定飞行计划提供可靠的性能依据。

目前,先进的喷气运输机都已安装飞行状态监控系统,它记录下有关参数值,并存储在数据管理装置中,这些数据可以发送到或在飞机着陆后送到地面站,用专用计算机程序进行计算和修正,使性能监控数据采集、发送、计箅分析工作自动化,节省了人力,提高了精确度。

1、飞行数据记录器:自从飞行数据记录器 FDR(Flight Data Recorder)“俗称黑匣子”诞生以来,其提供的详实准确的飞行数据为事故调查、机务维护保障、安全运营监控提供了重要依据,成为航空安全运营的重要管理手段。

2、ACMS(Aireraft Condition Monitoring System)的系统概述:ACMS 系统是飞机上安装的先进机载数据采集和处理系统,它能以实时方式收集数据,对发动机状态和飞行性能进行监控以及进行特殊的工程调查。由飞机通信寻址与报告系统(ACARS)通过地空数据链发送到地面接收站,最后传送到航空公司的终端,也可通过快速存取记录器(QAR)将数据记录保存下来,在飞机过站或航后供航务和机务人员使用。

而 HT 实现的业务功能可以通过ACMS 系统采集到的数据,对接到显示终端去展示,通过实时监测的数据准确地显示出来,起到对飞机状态的监控功能并即时反馈信息数据的变化。

实现过程

云中穿行效果

为了达到飞机云中穿行的效果,最开始我遇到的问题是飞机飞行的层次感,也就通常所说的透视效果,这里我采用的是云通道和云背景以不同的速度流动,制造一种飞行的透视效果。

云我采用的是贴图的方式呈现的,但是仅仅是贴图会遮挡天空和飞机,非常影响飞机飞行的观感,所以我开启了相应图元的transparentopacity,云背景和云通道设置不同的透明度,不仅增加了层次感,还会让人产生云朵从眼前飘过的错觉。

云通道采用的是ht.Polyline类型,通道缩放拉大了 Y 轴的比例,使云通道有更大的纵向空间,设置reverse.flip背拷贝使云通道内部也显示出贴图,仿佛让飞机置身于云海中穿梭;云背景采用ht.Node类型,只设置一个面显示充当云背景。

整体的云流动效果采用offset偏移实现,改变相应图元或相应图元面的贴图偏移量来达到飞机云中穿行的效果, 代码如下:

var i = 1,p = 0;
setInterval(() => {i -= 0.1; p += 0.005;clouds.s('shape3d.uv.offset', [i, 0]);cloudBackground.s('all.uv.offset', [p, 0]);
}, 100);

升降颠簸效果

虽然达到了飞机云中穿行的效果,但是如果飞机只是直直的飞行,那也会降低飞行的实感,相信坐过飞机的朋友肯定都遇到过因气流产生的颠簸,也经常感受到飞机飞行途中的爬升和下降,这其实是因为飞机的航线并不是一直固定在一个高度上,有时会爬升有时会下降,所以我就用ht-animation.jsHT 动画扩展插件去实现飞机颠簸效果,代码如下:

dm.enableAnimation(20);
plane.setAnimation({back1: {from: 0,to: 160,easing: 'Cubic.easeInOut',duration: 8000,next: "up1",onUpdate: function (value) {value = parseInt(value);var p3 = this.p3();this.p3(value, p3[1], p3[2]);}},//...省略相似start: ["back1"]
});

球扇形视角限制

飞行效果完善之后,这时我就遇到了一个比较棘手的问题,因为实际上虽然看着飞机是在云海中穿梭,但是仅仅是在通道中飞行,背景其实也只是平面贴图,所以当视角到达某种程度的时候就会有强烈的违和感和不真实感,就需要一个视角限制,使视角的调整刚刚好在一个范围内。

视角限制的话一般是限制 g3d 的 eyecenter ,不太了解的朋友可以去看 hightopo 官网中的 3d 手册,里面有详细的说明,这里我就不再赘述了;因为视角范围的关系,所以我决定固定center的位置,代码如下:

g3d.addPropertyChangeListener(e => {// 固定中心点if (e.property === 'center') {e.newValue[0] = center[0];e.newValue[1] = center[1];e.newValue[2] = center[2];}
}

然后再把eye限制在某一个范围内就大功告成了,然而这里却并不是那么简单,最开始我把eye限制在一个立方体的空间内,但交互效果很不理想,考虑到 g3d 默认交互中,鼠标拖拽平移视角变换时,实际上eye是在一个以center为球心的球面上运动的,所以我决定从这个球中挖出来一块作为eye的限制空间,也就是球扇形,不太理解的朋友可以参考这个图:

球扇形视角限制,一共需要三个参数,分别是中心参考轴、中心轴和外边所成角度、所在球限制半径,其中中心参考轴可根据初始eyecenter的连接延长线确定,所在球限制半径又分最大限制和最小限制,代码如下:

function limitEye(g3d, eye, center, options) {var limitMaxL   = options.limitMaxL,limitMinL   = options.limitMinL,limitA      = options.limitA;g3d.addPropertyChangeListener(e => {// 固定中心点if (e.property === 'center') {e.newValue[0] = center[0];e.newValue[1] = center[1];e.newValue[2] = center[2];}// 限制视角if (e.property === 'eye') {var newEyeV = new ht.Math.Vector3(e.newValue),centerV = new ht.Math.Vector3(center),refEyeV = new ht.Math.Vector3(eye),refVector = refEyeV.clone().sub(centerV),newVector = newEyeV.clone().sub(centerV);if (centerV.distanceTo(newEyeV) > limitMaxL) {newVector.setLength(limitMaxL);e.newValue[0] = newVector.x;e.newValue[1] = newVector.y;e.newValue[2] = newVector.z;}if (centerV.distanceTo(newEyeV) < limitMinL) {newVector.setLength(limitMinL);e.newValue[0] = newVector.x;e.newValue[1] = newVector.y;e.newValue[2] = newVector.z;}if (newVector.angleTo(refVector) > limitA) {var oldLength = newVector.length(),oldAngle  = newVector.angleTo(refVector),refLength = oldLength * Math.cos(oldAngle),vertVector,realVector,realEye;refVector.setLength(refLength);newEyeV = newVector.clone().add(centerV);refEyeV = refVector.clone().add(centerV);vertVector = newEyeV.clone().sub(refEyeV);vertLength = refLength * Math.tan(limitA);vertVector.setLength(vertLength);realVector = vertVector.clone().add(refEyeV).sub(centerV);realVector.setLength(oldLength);realEye = realVector.clone().add(centerV);// 防止移动角度大于 180 度,视角反转if (oldAngle > Math.PI / 2) {realEye.negate();}e.newValue[0] = realEye.x;e.newValue[1] = realEye.y;e.newValue[2] = realEye.z;}  }})
}

飞机监控系统

当然作为监控系统,自然要有监控了,增加右下角的小地图,并提供三种模式,分别是聚焦飞机,聚焦飞行轨迹和聚焦地图,并根据飞机的飞行方向控制飞行轨迹的流动效果,其中聚焦飞机会跟随飞机移动进行fitData,使飞机一直处于小地图的中心,代码如下:

var fitFlowP = function (e) {if (e.property === 'position' && e.data === plane) {mapGV.fitData(plane, false);}
};
buttonP.s({'interactive': true,'onClick': function (event, data, view, point, width, height) {map.a('fitDataTag', 'plane2D');mapGV.fitData(plane, false);mapDM.md(fitFlowP);}
});
buttonL.s({'interactive': true,'onClick': function (event, data, view, point, width, height) {mapDM.umd(fitFlowP);map.a('fitDataTag', 'flyLine');mapGV.fitData(flyLine, false);}
});
// ...省略

增加鼠标移到飞机相应位置进行名称的提示、双击后显示飞机相应位置的信息面板并将视角聚焦到面板上、点击飞机任意地方切换回飞机飞行模式等效果。

左侧增加监控面板替代上面提到的双击相应位置这步操作直接聚焦到相应位置的信息面板上,这里按钮开启了交互并添加了相应的交互逻辑,代码如下:

button_JC.s({'interactive': true,'onClick': function (event, data, view, point, width, height) {event.preventDefault();let g3d = G.g3d,g3dDM = G.g3d.dm();g3d.fireInteractorEvent({kind: 'doubleClickData',data: g3dDM.getDataByTag(data.getTag())})}
});
//...省略

天空渲染效果

既然是监控系统肯定是 24 小时无差别的监控,这就涉及到一个问题,我总不可能半夜的时候飞机也从瓦蓝瓦蓝的天空上飞过,这就很欠缺真实性了,所以要有一个天空从亮到暗再从暗到亮的过程,这个过程我暂定到 06:00-06:30 和19:00-19:30 这两个时间段。

天空采用的是shape3d : 'sphere’球形,包裹整个场景,然后使用reverse.flip背拷贝 和blend染色,之后天空就可以渲染成我想要的颜色,如果按照时间改变天空明暗只要改变染色值就可以了。

但是由于白天和晚上光照情况的不同,云反射光的强度也不同,就导致了白天和晚上云的差异,所以也要调整云道和云背景的贴图的opacity透明度,晚间更为透明度,代码如下:

if ((hour > 6 && hour < 19) || (hour == 6 && minutes >= 30)) {timePane && timePane.a({'morning.visible': false,'day.visible': true,'dusk.visible': false,'night.visible': false,'day.opacity': 1})skyBox.s({"shape3d.blend": 'rgb(127, 200, 240)',})cloudBackground.s({"back.opacity": 0.7,})clouds.s({"shape3d.opacity": 0.7,})
} else if ((hour < 6 || hour > 19) || (hour == 19 && minutes >= 30)) {//...省略
} else if (hour == 6 && minutes < 15 ) {//...省略
} else if (hour == 6 && minutes >= 15 && minutes < 30) {//...省略
} else if (hour == 19 && minutes < 15) {//...省略
} else if (hour == 19 && minutes >= 15 && minutes < 30) {//...省略
}


这里我还增加了对右上角时间面板时间状态图标的支持,并增加了图标切换时的渐隐渐显效果,同时给时间面板状态图标位置增加了点击切换到下一时间状态的功能。

为了演示效果我增加了时间倍速按钮,下图是 500 倍时间流速下的变化情况:

总结

身处大数据时代的我们,在网络科技发展越来越快的环境下,迎来了 5G 的新征程和工业4.0的新变革,在信息数据采集传输和数据可视化系统的融合下,可以发掘出许多行业管控可视化系统的解决方案。而 HT 长久以来一直致力于多样化行业系统可视化的搭建,涉猎的技术行业所累积的经验,通过自主创新研发的技术产品,已经打造出许多行业上具有代表性意义的可视化管控系统,例如同样有关于飞机的监控可视化系统:无人机 3D 可视化系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvYQGzq8-1591092123840)(https://img2020.cnblogs.com/blog/1496396/202006/1496396-20200601185137243-2111613258.gif)]

2019 我们也更新了数百个工业互联网 2D/3D 可视化案例集,在这里你能发现许多新奇的实例,也能发掘出不一样的工业互联网:https://mp.weixin.qq.com/s/ZbhB6LO2kBRPrRIfHlKGQA

同时,你也可以查看更多案例及效果:https://www.hightopo.com/demos/index.html

Web 三维组态的仿真运用案例:民航飞机的数据监控相关推荐

  1. 组态王仿真学习案例之石灰石断烧系统,拥有实时历史曲线,报表

    组态王仿真学习案例之石灰石断烧系统,拥有实时历史曲线,报表,报警等功能,几乎包含所有项目常用功能 非常适合组态王入门学习与提高 ID:8619613023884971

  2. 【金猿技术展】基于数据控制三维组态的方法及装置——实现数据驱动三维模型的精准运转技术...

    数字冰雹技术 本项目由数字冰雹投递并参与"数据猿年度金猿策划活动--2021大数据产业创新技术突破榜榜单及奖项"评选. 数据智能产业创新服务媒体 --聚焦数智 · 改变商业 基于数 ...

  3. 电力系统 接线图,配电图,地理接线图,电力系统组态与仿真,电力调度,自动控制,VC++和DELPHI以及web应用示例与源代码...

    电力系统 接线图,配电图,地理接线图,电力系统组态与仿真,电力调度,自动控制,VC++和DELPHI以及web应用示例与源代码 --所有功能均可扩展, 您所见到的界面的所有VC++源代码全部提供! 电 ...

  4. 电力系统 接线图,配电图,地理接线图,电力系统组态与仿真,电力调度,自动控制,VC++和DELPHI以及web应用示例与源代码

    电力系统 接线图,配电图,地理接线图,电力系统组态与仿真,电力调度,自动控制,VC++和DELPHI以及web应用示例与源代码 --所有功能均可扩展, 您所见到的界面的所有VC++源代码全部提供! 电 ...

  5. 7 张图三维组态编辑器图片,教你轻松数字孪生工厂

    行业背景 随着中国制造 2025 计划的提出,新一轮的工业改革拉开序幕.大数据积累的指数级增长为智能商业爆发奠定了良好的基础,传统制造业高污染.高能耗.低效率的生产模式已不符合现代工业要求. 图扑拖拽 ...

  6. 数字孪生水电站,三维组态助力发电流程优化

    从大禹治水到三峡大坝的建造,人类为控制和调配自然界的地表水和地下水,修建了许多的水利工程.对水资源进行了广泛的开发利用,诸如农业灌溉.工业和生活用水.水力发电.航运.港口运输.淡水养殖.旅游等. 将图 ...

  7. 现代控制理论-章节组织结构和仿真应用案例详细分析

    现代控制理论-章节组织结构和仿真应用案例详细分析 以第五章线性定常系统为例,将前四章内容,状态空间表达式.求解.能控能观和稳定性,对于线性定常系统综合设计作用等,逐一进行详细说明,并通过倒立摆仿真进行 ...

  8. 三维组态可视化解决方案

    HTML5 WebGL 在三维中的应用,已经发展的如火如荼,使其在三维组态(工业控制)方面也变得简单易行! 三维组态软件提高了工业控制的管理效率,让工业控制的资源管理.风险管控得到很大的改善. 传统的 ...

  9. 倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果

    倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果 倾斜摄影超大场景的三维模型的顶层合并后,可以采取以下措施来提升模型在WEB三维展示效果: 1.优化模型数据:对于倾斜摄影超大场景的三 ...

最新文章

  1. 计算机书籍-Go语言入门经典SAMS Teach Yourself
  2. AS3中的序列化与反序列化
  3. Promise 解析
  4. 【转】8 个用于业余项目的优秀 Python 库
  5. Linux上搭建Samba,实现windows与Linux文件数据同步
  6. 五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...
  7. Confluence 6 PostgreSQL 创建数据库和数据库用户
  8. (29)FPGA摩尔型状态机设计(第6天)
  9. 95-40-105-java.util.concurrent-线程-Executor
  10. x86和amd64指令参考
  11. Spark数据倾斜是如何造成的
  12. [luogu3369]普通平衡树(替罪羊树模板)
  13. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱[转]
  14. 肖风:分布式网络是区块链机制设计的第一个层次
  15. 亚马逊服务器 购买 流程_亚马逊环如何使我们对购买的每种产品都抱有偏执
  16. 恢复出厂设置后HOME键失效问题
  17. 用python实现判断9*9数独的正确性
  18. 百度语音识别jar下载
  19. 【架构】大数据风控数据系统架构
  20. 2020年教师资格证考试课件百度云网盘地址分享

热门文章

  1. [ Python ] 数据挖掘:股票价格
  2. 30个HTML+CSS前端开发案例(四)
  3. 解决方案:IDEA没有Java Enterprise选项的问题
  4. 使用记事本编写Java程序的运行步骤及乱码问题
  5. python读取文件乱码问题
  6. 笔记本_cpu_突然性能下降_cpu锁频_cpu降频_重装无用_解锁办法
  7. Linux 文件服务系统
  8. 安装免费360随身wifi一键创建WiFi热点让电脑与手机共享wifi无线网
  9. 一个pom文件中出现了两个相同的依赖_在IDEA里解决maven的pom引用jar包冲突
  10. 消息队列技术的介绍和原理(MQ)