天津港爆炸事件后,除了安置群众、追究事故责任外,人们最关心的莫过于爆炸污染物对于周边环境的影响,其中最重要的一块就是饮用水的安全。所幸的是,水源的安全监测是实实在在有据可依的。环保单位和供水企业在建设自己的饮用水水源监控系统,实时的监控民生水源安全。

最近我们承接了一个水源地自动化监控系统的项目。由于水源地一般都会远离生产、生活区,例如各地的水库、地下水、井等,派驻人员实时进入水源腹地进行数据监测,是不实际的,为了增强监测的实效性,远程的自动化水源监控系统是必不可少的。该系统除了能够监控各种水质指标外,还可以远程监测水源井的工作情况,远程监控水泵工作状态,同时还可以将监测指标以图形显示方式发布到各级监管单位或者管理领导的工作平台或者移动工作终端(平板、手机等)。

自动化监控产品并不少见,这次项目真正吸引客户眼球的是3D呈现效果。以往的监控系统都是以平面的方式来呈现,例如下图:

或者是这样的假3D效果:

传统的平面方式除了越来越难以满足客户日渐提高的要求之外,的确也难以直观展现出水源井结构、泵体安装位置和工作状态。3D模型本身不具备交互功能,通常需要做大量的开发工作,并且需要在系统中安装插件。这次的项目,我们采用了Legolas开发平台,结合TWaver IOT平台完成了模型构建和数据驱动,不但实现了监控场景的3D化,还能同步显示各类监控指标,让调度、管理人员对于水源井的水质和工作情况一目了然,提升了管理效率,并能有效增强各级工作的服务质量。

上一张手持设备截图:

这不是一张死图,而是可以旋转、拖拽、可交互的3D场景,水位的高低、阀门的开关,都会根据实际采集上的数据变化。水源井模型包含了以下部分:井、泵,传感器、阀门和管道。模型的构建可以通过直接导入3D文件,或者用TWaver Mono Design建模工具生成。

例如,我们找美工mm在3DMax中,对泵进行建模后导出obj文件,引入到场景中:

{
type: 'obj',
src: 'pump',
size: [100,200,100],
translate: [320,-380,80],
rotation: [0, 90, 0],
specularStrength: 4,
color: '#FF1700',
},
loadObj: function(box, json){
var loader = new mono.OBJMTLLoader();
varsrc = json.src;
var size = json.size;
varpos = json.translate;
var style = json.style;
var rotation = json.rotation; loader.load("images/"+src+".obj", "images/"+src+".mtl", json.images || "", function (object) {
var bb = object.getBoundingBoxWithChildren();
var max = bb.max, min = bb.min, w = max.x - min.x, h = max.y-min.y, l = max.z - min.z;
object.getDescendants().forEach(function(child, i){
child.setEditable(false); });
box.addByDescendant(object);
object.setPosition(pos[0],pos[1],pos[2]);
varos = {'x': w,'y':h,'z':l};
object.setScale(size[0]/os.x,size[1]/os.y,size[2]/os.z);
if(style){
object.s(style);
}
if(rotation){
var f = demo.Util.getArc;
object.setRotation(f(rotation[0]), f(rotation[1]), f(rotation[2]));
} });
},

大致如下图所示:

对于较为简单的阀门对象,我们使用了自己的MONO Design编辑器,可视化构建了阀门模型,并转换为相关JSON文件:

{
type: 'mono',
url: 'resource/yali.json',
scale: [0.5,0.5,0.5],
translate: [-250, -155,0],
rotation: [0, -90, 0],
},
well.Default.registerFilter('mono', function(box, json){ initModelLib();
mono.Toolkits.loadTemplateUrl(box, json.url, null, null, function(object){ var translate = json.translate;
object.setPosition(translate[0], translate[1], translate[2]);
var scale = json.scale;
if(scale){
object.setScale(scale[0], scale[1], scale[2]);
}
var rotation = json.rotation;
if(rotation){
var f = demo.Util.getArc;
object.setRotation(f(rotation[0]), f(rotation[1]), f(rotation[2]));
}
if(json.color){
object.getDescendants().forEach(function(child){
child.s({
'm.color': json.color,
'm.ambient': json.color,
}); });
}
});
});

阀门的模型如下:

对于井体对象,由于其结构较为简单,并且用户也很关注该井体的环境结构,我们直接使用TWaver3D的API代码来生成模型,并采用了光照贴图等技术来增强其环境效果。

{
type: 'cable',
color: '#BEC9BE',
direction: 0.05,
repeat: [10,1],
data:[
[-320, -180, 0],
[800, -180, 0],
[800, -1200, 0],
[1500, -1200, 0],
],
},
well.Default.registerFilter('cable', function(box, json){
var path = demo.Default.create3DPath(json.data);
path = mono.PathNode.prototype.adjustPath(path, 5);
var cable=new mono.PathNode(path, 100, 10);
var repeat = json.repeat || [10,1]; cable.s({
'm.type': 'phong',
'm.specularStrength': 4,
'm.color': json.color,
'm.ambient': json.color,
'm.texture.image': 'images/w002.jpg',
'm.texture.repeat': new mono.Vec2(repeat[0], repeat[1]),
'm.texture.offset': new mono.Vec2(0,0.7),
});
cable.setClient('flow', json.flow);
cable.setStartCap('plain');
cable.setEndCap('plain');
box.add(cable);
});

场景中水管都是通过API方式创建的,其中罐体、水位、挡板这些模型涉及到模型的加减,通过mono design或API都可以生成。

静态模型和场景搭建完毕后,通过TWaver的IOT平台完成了境内采集数据的绑定,已经可以用实时数据来驱动场景中的对象了。用户希望能有更加逼真的交互效果,希望我们能增加一些动画支持。水的流动,泵的启停,水位的升降这些动作使用水井内的工作状态更形象逼真。

下面是模型的动画的使用方式举例:

varoffsetAnimate = new twaver.Animate({
from: 0 ,
to: 1,
type: 'number',
dur: 3000,
repeat:Number.POSITIVE_INFINITY,
reverse: false,
onUpdate: function(value){
cable.s({
'm.texture.offset': new mono.Vec2(value, 0),
});
},
});
offsetAnimate.play();

数据驱动是借助TWaver的IOT平台完成的数据采集、分发、控制和数据绑定,这里就先不赘述了。感兴趣的朋友可以给我们发邮件:tw-service@servasoft.com, 多多交流和沟通想法和意见。

Legolas工业自动化平台案例 —— 水源地自动化监控系统的更多相关文章

  1. Legolas工业自动化平台入门(一)搭建应用

    前两篇给大家介绍了TWaver家族的新面孔--Legolas工业自动化平台,通过两个应用案例钻井平台工程用车和水源地监控系统,相信大家对Legolas已经有了一定程度的了解.这几篇文章,我们会逐步介绍 ...

  2. Legolas工业自动化平台入门(三)交互事件响应动作

    在上一篇Legolas工业自动化平台入门(二)数据响应动作 一文中,我们介绍了"动作"相关内容,了解到"动作"分为多种,各种动作的添加方式相同,但是应用方式各自 ...

  3. Legolas工业自动化平台入门(二)数据响应动作

    在上一篇文章Legolas工业自动化平台入门(一)搭建应用里,我们简单地提到了"动作"的概念.不清楚的童鞋不要着急,这篇我们就来介绍如何在Legolas平台上添加动作,并应用动作. ...

  4. 自动化监控系统(三) 搭建xadmin做网站后台

    Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin 我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/x ...

  5. HBase实践案例:车联网监控系统

    项目背景 本项目为车联网监控系统,系统由车载硬件设备.云服务端构成.车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端.服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验 ...

  6. 容器云平台No.7~kubernetes监控系统prometheus-operator

    简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...

  7. 自动化监控系统(二)连接数据库,创建app,添加model,同步数据库

    数据库我使用:mysql5.7 程序连接数据库的模块:pymysql 一.创建数据库: dbname:automatedmonitor 二.使用pip安装pymysql,这里我直接在pycharm上安 ...

  8. TWaver家族新成员 — Legolas工业自动化设计平台

    对于TWaver可视化家族的成员,大家比较熟悉的是我们的网络拓扑图组件和MONO Design三维建模工具.作为开发工具,这两款产品面向广大的程序猿同志,在界面可视化上为大家省时省力.但是,当项目交付 ...

  9. 实战 Prometheus 搭建监控系统

    实战 Prometheus 搭建监控系统 Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于 ...

随机推荐

  1. H5 Canvas刮刮乐

    玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个 ...

  2. 浅谈压缩感知(二十八):压缩感知重构算法之广义正交匹配追踪(gOMP)

    主要内容: gOMP的算法流程 gOMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.gOMP的算法流程 广义正交匹配追踪(Generalized OMP, g ...

  3. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  4. 在ASP.NET MVC5中建置以角色为基础的授权机制

    在前一篇贴文中,已探索过如何在MVC5中自定ASP.NET Identity,接下来要来试试在MVC5中如何运用 ASP.NET Identity来设定一个以 "角色"为基础的授权 ...

  5. UICollectionView基础

    初始化部分: UICollectionViewFlowLayout *flowLayout= [[UICollectionViewFlowLayout alloc]init]; self.myColl ...

  6. Cocos2dx.3x入门三部曲-软件环境配置(一)

    一.环境: Win7 32位 二.必备软件: l  Java JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...

  7. URLEncode与URLDecode总结与实现

    URLEncode: 用于编码URL字符串,数字和字母保持不变,空格变为'+',其他(如:中文字符)先转换为十六进制表示,然后在每个字节前面加一个标识符%,例如:“啊”字 Ascii的十六进制是0xB ...

  8. Asp.Net customErrors与httpErrors的区别

    先看一下简单的对比 customErrors Asp.Net级别的错误处理程序,只处理Asp.Net应用抛出的异常(404,403,500..) 在IIS7+的服务器依然可用(IIS7之前就引进了) ...

  9. 免安装版MySQL安装步骤

    http://downloads.mysql.com/archives/community/ 1:添加环境变量把MySQL解压后的bin目录添加到path环境变量中 2:修改或者添加my-defaul ...

  10. Navi.Soft30.开放平台.腾讯.开发手册

    1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...