许昌许继软件技术有限公司的研究人员贾亚楠、张延辉、霍智超、王少鹏、贺博,在2020年第4期《电气技术》杂志上撰文,阐述了一种采用OpenSceneGraph(OSG)技术在电力监控系统中的运用,将三维可视化图形与传统的电力监控系统相结合,提供了一种将三维可视化图形集成在电力监控系统的方法。
目前,电力监控系统的界面大部分还停留在二维正交图的阶段。现行的变电站监控系统不能清晰展示出变电站设备的形状信息,运检人员对设备运行状态没有一种直观的观察方法。特别是新建的换流站要比原有的交流变电站复杂的多,运维人员的日常工作任务非常繁重。二维正交图显示运行状态信息的方式有一定的局限性,而采用三维可视化的方式,使运维人员更能直观的查看当前监控设备的运行状态。
三维可视化技术是一种将模型数据转换成图形或者图像显示在屏幕上的技术,此技术已经应用在产品设计、流体力学、建筑、地球科学等领域。目前,OpenGL(开放图形库)被证明是一种性能比较高的实现三维图形绘制技术标准。
OpenSceneGraph(OSG)是在OpenGL基础上开发的一套基于C++平台的开源开发组件,它能够跨平台的展示交互式图形,并且能为程序开发者提供许多实用工具。三维可视化技术在电力监控的应用是解决三维电力监控系统的关键技术,将OSG应用在现有的电力监控系统,是解决三维可视化技术在电力监控系统实现的一种方法。
采用将OSG技术在电力监控系统的运用方法,在对原有监控系统改动比较小的情况下,实现了将场站或电力设备三维模型展示在监控系统中。此方法具有对原有系统改动比较小,能够实现二维正交图与三维模型的交互,比较直观的展示对应设备的状态信息。
1 理论基础研究
目前大部分监控系统采用的是Qt+ Microsoft Visual Studio方式开发的客户端界面。Qt是一款跨平台的C++图形用户界面应用开发框架;是一种面向对象的框架。Microsoft Visual Studio(简称VS)是微软公司的一款基本完整开发工具包,是目前比较流行的windows应用程序集成开发环境。
Qt5.4以后的版本,Qt新增了QOpenGLWidget类,此类继承于QWidget。QOpenGLWidget提供了显示集成到Qt开发的应用程序中OpenGL图形的功能,它能够使开发者像使用其他QWidget继承类一样方便运用。相比于原有的QGLWidget类使用更加方便。
QOpenGLWidget提供了三个方便的虚拟函数,可以在子类中重新实现它们来执行典型的OpenGL任务:
- 1)paintGL()——渲染OpenGL场景。在需要更新小部件时调用。
- 2)resizeGL()——设置OpenGL视口、投影等。每当小部件被调整大小时(以及第一次显示小部件时,因为所有新创建的小部件都会自动获得一个resize事件)调用。
- 3)initializeGL()——设置OpenGL资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次。
采用继承QOpenGLWidget实现OSG对Qt的支持,在技术理论上解决了OSG三维可视化技术在Qt应用程序里的集成。
实现方式如下:
Class osgQOpenGLWidget:public QOpenGLWidget
{
Q_OBJECT
public:
osgQOpenGLWidget (QWidget* parent = nullptr);
virtual ~osgQOpenGLWidget ();
... ...
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
... ...
};
重新实现paintGL()函数,实现三维图形的渲染。
void osgQOpenGLWidget::paintGL()
{
OpenThreads::ScopedReadLock locker(_osgMutex);
//Oview = new osgViewer::Viewer();
Oview ->frame();
}
![6e65ece26f75eacd2dd01a1768b9e922.png](https://i-blog.csdnimg.cn/blog_migrate/750a0d872ddb73787b6d5ea308907f6e.jpeg)
2 三维可视化模型嵌入现有监控系统方法
三维可视化模型嵌入现有监控系统有两种解决方式:一种是三维可视化图形作为独立的窗口显示,另一种作为监控界面的一部分跟原有二维正交图显示在一起。由于第二种方法在使用中兼顾了现行的监控平台,使用人员的操作习惯不会有较大的改变,所以本文采用第二种方法作为研究方向。
目前采用Qt编写的监控系统大部分,是利用QGraphicsScene作为载体,在上面绘制相关的图形信息。采用上述第二种方式就是将三维可视化模块作为图元绘制在QGraphicsScene上作为界面的一部分。
采用QGraphicsProxyWidget类作为代理,可以在QGraphicsScene中嵌入QWidget。QGraphicsProxyWidget类能够解决QGraphicsScene与QWidget之间的事件转发,并且解决了QWidget的基于整数的几何图形和QGraphicsScene的基于实数的几何图形之间进行转换。QGraphicsProxyWidget支持QWidget的所有核心功能,包括选项卡焦点、键盘输入、拖放和弹出窗口。
对QGraphicsProxyWidget进行继承封装成在QGraphicsScene绘制的基本图元,为其配置三维可视化需要的属性信息,这样就将三维可视化的模型像原有二维图元一样作为图元添加到QGraphicsScene上面,如图1所示。
![b65f7d01cd79eb582836fa7e84b8f1a3.png](https://i-blog.csdnimg.cn/blog_migrate/89ad0433bc2e52d12f619f06a480bffe.jpeg)
图1 三维可视化应用示例
在同一面视图上同时展示二维正交图与三维可视化模型,根据设备不同的状态信息,设备对应三维可视化模型做出相应的变化,并根据右边的数据信息,这样更能方便直观的将设备运行状态展示给运行监护人员。
具体实现方法如下dsOsgItem继承于QGraphics- ProxyWidget。
class dsOsgItem : public QGraphicsProxyWidget
{
public:
dsOsgItem();
virtual ~dsOsgItem();
...
};
将osgQOpenGLWidget设置为dsOsgItem代理的窗口即可,既调用函数dsOsgItem.setWidget (osgQOpenGLWidget)。
3 三维模型交互设计
上文已经实现了将三维可视化模型展示在QGraphicsScene画布的绘制显示,下面讨论三维模型的交互设计。
1)三维模型人机交互
三维模型人机交互既运行人员通过鼠标事件控制三维模型。根据需要重新实现osgQOpenGLWidget的如下事件函数:
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void wheelEvent(QWheelEvent* event);
解决三维可视化模型对应的鼠标、键盘事件交互。
2)三维模型与监控数据之间的交互
OSG中osg::NodeVisitor类能够实现节点访问,继承osg::NodeVisitor设计apply(osg::Node& node)函数,
简单示例如下:
virtual void apply(osg::Node &node)
{
traverse(node);
}
上述示例遍历了所有节点。每个三维模型都设置有惟一的ID值,分别一一对应显示中的实际设备。当监控系统采集到某一设备的状态数据后,调用上述apply函数,通过模型ID找出对应的节点(node),修改此模型节点的颜色、形状、位置以表示该设备的当前状态信息。这样就实现了数据交互的功能。
4 结论
![8048b25866c4d2adf459622a67d4d23f.png](https://i-blog.csdnimg.cn/blog_migrate/a97722c60efe9c1b384234e59a4b10d1.jpeg)
图2 组态工具集成三维示意图
目前许继集团正在开发的新一代监控平台三维展示组件采用此了方案。图2是将三维展示组件使用的示意图,是三维可视化技术集成在监控系统组态工具中示意,图中展示了在绘图区内添加了GIS三维模型。
此文方法针对现行的二维正交图电力监控系统,将三维可视化集成到原有电力监控系统的方法,不用对原有监控系统进行较大修改就能实现,但是此文献只是初步的讨论了理论上的实现,特别是数据交互方面。具体的实现还需进一步研究。