王毅恒,李俊麟,张 伟
(1.沈阳化工大学 信息工程学院,沈阳 110142;2.中国科学院 沈阳自动化研究所机器人学国家重点实验室,沈阳 110016;3.中国科学院 机器人与智能制造创新研究院,沈阳 110169)
在航天技术发展过程中,故障诊断逐渐成为航天器在轨道安全运行[1]的重要保障。由于航天器身造价高昂、系统结构复杂[2],在轨运行期间需要面对特别恶劣的空间环境,从而导致航天器在轨运行期间会持续地发生故障。在已知的卫星系统故障中,卫星电源系统出现的故障在所有卫星分系统出现的故障中是最高的[3],占比44%,并且卫星电源系统的故障贯穿了整个卫星寿命阶段。如果卫星发生故障时不能有效的处理,其所产生的后果是不堪设想的,所以就需要故障诊断系统能够及时发现故障、隔离故障,并且为卫星故障处理提供决策依据。从而保障卫星在轨道安全运行,并延长卫星在轨时长。这就对故障诊断方法的诊断效率提出比较高的要求,以此来保障卫星诊断系统的时效性[4]。
故障诊断包含了对系统健康状况的推理、异常行为的识别、故障组件的隔离[5],以及正常和异常条件下的系统行为预测。随着系统的规模化和复杂化,故障诊断变得更具有挑战性。基于定性模型的诊断是一种人工智能的方法[6],R.Davis[7]和Reiter[8]共同奠定了基于定性模型诊断的基本理论体系[9],基于定性模型的诊断方法是通过系统的结构、行为、功能对系统进行诊断推理,通常需要建立系统的结构、行为、以及功能模型。基于结构与行为知识的诊断推理由冲突识别和候选产生组成,当冲突存在时,表示系统中至少有一个元素是有故障的,候选就是为了解释冲突,一个候选诊断可以解释所有的冲突。基于定性模型诊断的思路是,通过系统的内部结构、行为或功能模型来预测系统行为,当观测值与预测值不一致,表示存在差异,通过这些差异,来搜索到使预测模型与观测值相一致的状态假设。基于冲突的故障诊断一般需要解决两个问题:第一个是计算最小冲突,可能的冲突数量会随着系统组件的数量呈指数级增长,第二个问题是诊断的完整性,大多数基于冲突的故障诊断方法是无法发现所有的可能冲突。通用诊断引擎[10](GDE)在解决这种问题上是比较经典的方法之一,GDE使用ATMS[11]来管理和优化冲突的产生和最小化,但是在诊断复杂系统时,GDE产生的冲突和内核诊断的数量成指数增长,这一情况限制了GDE的使用。而后Williams将GDE的工作扩展到对行为模式的推理,从而建立了结果系统Sherlock[12],Sherlock利用故障模式知识更平等地查明故障并确定组件在何种模式下运行。Ragno[13]提出了子句导向A*(CIA)搜索诊断,它可以实现同时将搜索指向可行性和最优的分配,从而实现故障的快速检测。William和Ragno提出了冲突导向A*(CDA*)搜索诊断[14-15],它结合了Reiter方法中的冲突集和最佳优先搜索方法,CDA*根据先验概率和冲突信息可以快速给出解决问题的最佳候选者。Stern[16]通过利用冲突和诊断之间关系的二元性来扩展Reiter的诊断理论,利用二元性较差诊断搜索,从而比冲突导向A*更快地找到最小基数诊断。
上述介绍的方法基本都是基于弱故障模型,弱故障模型只有一个正常模式和一个未知的故障模式。但现实世界常见的故障是已知的,比如水下机器人的传感器故障有3种故障模式[17],分别是传感器输出信息保持不变、发生跳变、在时间轴上振荡,那么它的模型就是强故障模型。在诊断强故障模型中,虽然检测模式与检测弱故障一样,但是在隔离故障组件和识别故障模式具有挑战性。通过CDA*诊断强故障模型效率比较低下,是因为在弱故障模型中,n个变量具有2n个搜索空间,但是在强故障模型中,平均m个强故障模式,共计mn个搜索空间。基于上述分析本文提出了一种基于冲突A*算法的改进方法,该方法的优势在于增加了一个扩展节点消减模块,此模块可以隔离故障,并且缩小诊断对象的域的大小,减少搜索次数,提高搜索效率。基于神经网络的卫星电源系统故障诊断方法需要大量的故障数据进行训练,而卫星电源系统故障数据量较少,并且神经网络的故障诊断方法移植性较差,与神经网络的故障诊断方法相比,基于定性模型的改进的冲突A*算法不需要大量的历史数据,并且在强故障模型诊断中,改进的冲突A*算法移植性较强,可以适用于不同的卫星电源系统。所以改进的冲突A*算法故障诊断方法可以更好地应用于卫星电源系统故障诊断。
解释冲突A*算法,需要定义约束满足问题constraint satisfied problem (CSP),CSP由(xDxCx)三部分组成,系统变量problem由部件x组件成,Dx表示部件x的域,在Dx内包含部件x可能发生的状态,Cx是部间的约束,约束Cx由一组变量x组成,变量的行为状态范围是在Dx内,对于约束Cx:x→[true,false]。诊断结果应该需要满足约束Cx内的任何x的赋值,即Cx[x]=true。为CSP设定属性成本g的方法是通过多属性成本函数,它将属性成本g(x)与多个变量赋值Xi的先验概率相关联从而建立全局成本。大多数实际的多属性决策问题[18]满足称为相互优先独立性的原则,即已被赋值的变量对余下的决策变量的特定赋值无关。在本文中对相互优先独立性的使用方法是对每个变量的属性成本最大化。CSP的示例就是布尔电路,如图1所示,由或门OR和与门AND组成。
图1 布尔电路图
输入和输出由图1所示,即每个组件都处于3种可能模式中的一种模式,正常的模式(G)满足正常的布尔元件的功能,坏的模式1(U1)表现为输出常为1、坏的模式2(U2)输出常为0。该示例采用的是候选的先验概率,并且假设组件的概率是相互独立的,布尔电路的部件状态全局成本g由公式(1)计算可得:
g(y)=-∏ipi(yi)
(1)
式中,P={p0,p1,…,pi}表示部件处于某种状态的概率,Y={y0,y1,…,yi}表示部件当前所处的状态,每个部件当前所处的状态Y与部件概率P是对应的。固定成本的代价由乘法组成,在该示例中OR门坏的时候且输出常为1的概率是0.5%、输出常为0的概率是0.5%,AND门的输出常为1的概率是0.25%,与门输出常为0的概率是0.25%,满足图1所示的布尔电路解决方案是或门O1的状态应该是处于故障U2输出常为0,即{03=G,O2=G,O1=U2,A2=G,A1=G},全局成本g为0.9*0.9*0.05*0.95*0.95,为0.036 551 25。
在离散空间搜索问题的最佳方法首选就是A*算法,A*算法是通过启发式的方法去搜索解决方法。但在搜索速度上,伴随着节点数目的增多,A*算法效率会有所减低。基于冲突的A*算法可以实现A*的加速,它的原理是通过选择满足冲突条件的节点来实现节点的删减,从而实现搜索进度的加速,通俗地说,冲突就是一组状态,这些状态被证明了不满足模型的约束。改进的冲突A*算法首先生成一个候选,并通过约束函数去测试候选,当候选诊断方案不满足约束时,生成兄弟节点函数会生成多个可扩展节点,并且冲突函数会标记出不满足约束的冲突部件,以及对应的冲突部件当前状态,当被标记的冲突部件被确定为发生故障的部件,改进的冲突A*算法会隔离故障部件的状态,减小发生故障部件的域,从而实现快速识别故障模式。
改进的冲突A*算法有五大模块组成,分别是节点预估代价函数f(x)、最佳子节点函数best-child(x)、扩展兄弟节点函数best-sibling(x)、目标测试函数goal-test-state(x)、冲突节点选择函数conflict-select-node(x)。改进的冲突A*算法搜索过程是以生成搜索树的形式进行叶节点选取,改进的冲突A*算法的如图2所示。
图2 改进的冲突A*算法
搜索树的生成从根节点开始,最开始的可扩展节点集合中只有根节点,节点预估代价函数从可扩展节点集合中选取全局成本g最大的节点,也就是根节点,并将根节点放入生成最佳子节点函数,然后最佳子节点函数从第一个部件状态中选取概率最大的状态,生成节点n2,其中根节点n1是节点n2的父节点,然后递归使用生成最佳子节点函数,依次选择相应的部件状态,生成相应的节点,直至选择最后一个部件并生成叶节点,叶节点里面的信息包含了从根节点到叶节点的部件状态,因此叶节点可以作为候选诊断方案。
扩展兄弟节点函数使用叶节点,采用递归的方式,依次生成叶节点的兄弟节点,以及叶节点的父节点的兄弟节点,直到根节点为止结束递归,其中叶节点的兄弟节点表示的是和叶节点同样的部件,但是是不同的部件状态,叶节点的兄弟节点部件状态概率仅小于叶节点的部件状态概率。
目标测试函数是用于判断候选诊断方案是否满足部件输出约束,当满足部件输出约束时,候选诊断方案添加到解决方案集solution,搜索结束,并输出解决方案。当不满足输出约束时,相应的函数会生成冲突集,冲突集包含了不满足约束的部件状态,以及确定的故障部件及其部件状态。
冲突节点选择函数包含了扩展节点消减模块,冲突节点选择函数在生成的扩展兄弟节点中选择包含冲突集的节点,然后将这些节点放入可扩展节点集合中,用于下一次的搜索树节点扩展。扩展节点消减模块主要作用就是隔离故障,并消减故障部件的域,从而减少搜索空间。冲突节点选择函数首先会标记出冲突部件,以及冲突部件的当前状态,当冲突部件被判断出是发生故障的部件时,选出用于扩展的冲突节点会移除含有发生故障部件状态的节点,故障部件的状态集会移除被标记出的故障部件状态,这些可以缩小搜索空间,从而加快搜索进度,冲突节点选择函数如下所示:
function conflict-select-node (sibling-nodes,
leaf-node, problem)
conflict-component←generate-conflict(
leaf-node, problem)
conflict-component-region←generate
-conflict-region (leaf-node, problem)
conflict-nodes←choose-conflict-node(
sibling-nodes, problem)
if true-conflict-component (
conflict-componet)
conflict-component-nodes←select
-conflict-component-node(conflict-nodes,
conflict-component-region)
else return conflict-nodes
return conflict-nodes
定性模型建模的变量一般选取有限数目的定性值[19],例如一些数值变量名称:littlelow,low,middle,high,组件状态也是有限数目的,比如:stuckhigh,stuckmiddle,stuckon,on,off等等。每个组件状态表示了其输入与输出的约束关系。
定性模型的建模过程可分为四步。第一步是知识获取,通过对系统的工作原理进行深入研究,明确工作部件之间的关系,并给出部件是否正常的判断依据;第二步是范围定义,通过系统的工作原理和故障判断依据,合理的设置部件的特征变量和特征信息;第三部是模型创建,大多数系统表现的都是连续行为,由于建立的电源系统的模型是离散的,所以就需要建立有用的系统的离散描述;第四步就是模型测试,确保可以对系统模型的故障场景进行测试。
在文献[20]中,给出了典型的航天器电源系统结构图,该系统包含太阳能电池板(solarArray),并联调节器(S3R),母线(BusBar),充电调节器(BCR),放电调节器(BDR),电池组(accumulator),其中方框内表示的是电源系统组件,圆圈内表示的是各个测点的传感器,卫星电源系统模型[21]如图3所示。
图3 卫星电源系统模型
本文通过组件化的方法对卫星电源系统进行建模,通过建立起各个组件的模型,然后按照电源系统的工作结构,将各个模型连接起来,形成整个电源系统的工作模型。如表1所示,太阳能电池阵故障模式包含控制命令失效与电池阵短路,总共5种故障状态,并联调节器的故障模式有4种,母线、充电调节器、蓄电池、放电调节器的故障模式只有一种,因此卫星电源系统在光照区会有状态共计480种。
表1 光照区卫星电源系统故障
本文通过组件化的方法对卫星电源系统进行建模,通过建立起各个组件的模型,然后按照卫星电源系统的工作结构,将各个模型连接起来,形成整个卫星电源系统的模型。以太阳能电池阵为例,在光照区内太阳电池阵有3种状态,分别是正常模式、控制命令失效和电池阵短路,其中控制命令失效有4种,包括一直输出微弱电流、一直输出小电流、一直输出中电流及一直输出大电流,太阳电池阵这6个状态的程序设计为{solar-goodmode,solar-stuckhigh,solar-stuckmiddle,solar-stucklow,solar-stucklittle,solar-shortcircuit},并且每个状态对应不同的概率。
本文采用lisp语言来建立卫星电源系统模型,卫星电源系统太阳电池阵部件状态模型如图5所示,图(a)为太阳电池阵短路状态,图(b)为太阳电池阵处于一直输出大电流的故障状态。其中:position表示的是部件当前的状态,用于解释部件的故障状态,:current表示的是部件当前状态输出电流值的大小,:biaoshi用于标识部件的名称,在搜索树中区分部件,:probability表示当前部件状态发生的先验概率,本文的太阳电池阵发生短路的概率是0.002。
太阳电池阵短路:
(defparameter solar-shortcircuit
(make-instance
'zhong
:position 'shortcircuit
:current 'zero
:biaoshi 'solar
:probability 0.002 ) )
太阳电池阵一直输出大电流:
(defparameter solar-stuckhigh
(make-instance
'zhong
:position 'stuckhigh
:current 'big
:biaoshi 'solar
:probability 0.002 ) )
太阳电池阵输出约束函数的输入为太阳电池阵所处的状态以及太阳电池阵的输出命令,当太阳电池阵处于正常模式时,太阳电池阵按照输出命令CmdIn输出需要的电流,当太阳电池阵处于发生故障的情况下,太阳电池阵输出当前状态的电流,并联调节器输出约束函数的输入为并联调节器的当前状态、太阳电池阵的输出、并联调节器的控制命令vmeanin,当并联调节器处于正常状态,并且太阳电池阵输出不为零时,并联调节器按照控制命令输出相应电流,当不满足以上条件时,并联调节器按照故障模式输出相应状态的电流。
太阳电池阵输出约束:
(defun solar-yueshu (solar cmdin)
(let (( output (slot-value solar 'output)))
(if (eql output 'G)
(slot-value solar cmdin)
(let (( nq (slot-value solar'position)))
(if (not (eql nq cmdin))
(slot-value solar 'current)
nil)))))
S3R输出约束:
(defun s3r-yueshu ( s3r solary vmeain)
(let ((output (slot-value s3r 'output)))
(if (eql output 'G)
(if (eql solary 'zero)
solary
(s3r-good-yueshu solary vmeain))
(if (eql solary 'zero)
nil
(s3r-ungood-yueshu s3r solary vmeain)))))
为了验证本算法的有效性,进行了卫星电源系统故障诊断测试,在测试中验证了多种故障模式的诊断,如表2所示,给出了其中的3种测试诊断结果,以故障2为例,太阳电池阵的输出命令CmdIn是middle,并联调节器的输出命令VmeaIn是middle,根据太阳电池阵的输出约束函数和并联调节器的输出约束函数、以及其他部件的约束输出函数,可以得到太阳电池阵、并联调节器、充电调节器、放电调节器的预测输出,当预测输出与传感器S1、S2、S3、S4观测的数不一致,从而去判断测试模式中存在故障部件以及部件发生的故障状态。
表2 测试模式
图4是故障模式2的搜索树展开,节点n7代表的是候选1。
图4 卫星电源系统搜索树展开
{Solar=G,S3R=G,BusBar=G,BCR=G,
Accumu=G,BDR=G}
候选1中部件为G表示部件处于正常状态,电源系统部件输出函数根据候选1可以得到S1至S4的预测传感器数据值{S1=middle,S2=middle,S3=middle,S4=zero},与传感器数据{S1=big,S2=big,S3=big,S4=zero}不相同,表示候选1不满足部件输出约束,得到冲突部件{Solar,S3R}和冲突集{Solar=G,S3R=G},冲突部件集{Solar,S3R}被判断为故障部件,冲突节点选择函数在扩展的兄弟节点中提取出不包含冲突集{Solar=G,S3R=G}中这两个部件状态的节点,为节点n12和节点n13,因为节点n12的父节点中包含了故障部件solar的状态solar=G,所以节点n12也被移除,只有节点n13被添加到扩展节点集中。冲突节点选择函数中的扩展节点消减模块将故障部件solar的状态集{G,U1,U2,U3,U4,U5}移除不满足输出约束的状态solar=G,缩小为{U1,U2,U3,U4,U5},同样故障部件S3R的状态集也移除不满足输出约束的状态S3R=G,缩小为{U1,U2,U3,U4}。通过节点预估代价函数,在扩展节点集中选择了预估代价最大的节点n13,然后通过递归使用生成最佳子节点函数,生成了叶节点n18,同时叶节点n18代表候选2。
{Solar=U1,S3R=U1,BusBar=G,
BCR=G,Accumu=G,BDR=G}
候选2中的太阳电池阵的状态为U1,U1为stuckhigh的故障状态,即太阳电池阵一直输出大电流,并联调节器的状态为U1,U1为bigbroken的故障状态,即不能输出大电流,与传感器S2的观测值big发生冲突,所以候选2不满足输出约束,得到冲突集{S3R=U1},将候选2的冲突集与候选1的冲突集合并得到{Solar=G,S3R=G,S3R=U1}。冲突节点选择函数在扩展的兄弟节点中根据冲突集提取出节点n23和节点n24,因为候选诊2中{Solar=U1}满足传感器S1的输出,所以节点n24被剔除,将节点n23添加到扩展节点集中。节点预估代价函数在扩展节点集中选择了预估代价最大的节点n23,然后生成叶节点n28,也就是候选3。
{Solar=U1,S3R=U2,BusBar=G,BCR=G,Accumu=G,BDR=G}
系统部件输出根据候选3得到预测传感器数据{S1=big,S2=big,S3=big,S4=zero},与传感器测量值相同。所以候选3满足输出约束,所以诊断结果为{Solar=stuckhigh,S3R=middlebroken},也就是太阳能电池处于一直输出大电流的故障状态,并联调节器处于不能输出中电流的故障状态。
表3表示的是在相同故障部件个数条件下,卫星电源系统模型故障诊断测试的平均次数。在单重故障诊断测试中,因为改进的冲突A*算法相较于冲突A*算法是增加了一个扩展节点消减模块,该模块的主要作用是隔离故障部件以及减小搜索空间,当发生故障的部件个数为一个时,扩展节点消减模块无法起到作用,所以改进的冲突A*算法和冲突A*算法的搜索次数是相同的,在多重故障诊断测试中,扩展节点消减模块通过隔离故障部件并缩小故障部件的状态空间,因此改进的冲突A*算法的搜索次数总是少于冲突A*算法的搜索次数,改进的冲突A*算法搜索效率相比冲突A*算法提升50%,与子句导向A*算法相比,在多重故障诊断中,改进的冲突A*算法的搜索次数也是少于子句导向的A*算法。
表3 卫星电源故障测试次数
在卫星电源系统模型故障诊断测试中,改进的冲突A*算法的故障诊断准确率为96%,当注入的故障部件处有传感器时,改进的冲突A*算法可以准确并快速的定位故障部件状态,若注入的故障部件处没有传感器,故障部件的输出会影响下一级部件的输出,改进的冲突A*算法无法准确定位故障部件,因此降低了改进的冲突A*算法的故障诊断准确率。
在对强故障模型的诊断中,针对强故障模型的搜索树节点过多、诊断效率低下的缺点,提出一种改进的冲突A*算法诊断方法。在卫星电源系统模型故障诊断测试中,因为有较多的传感器检测部件输出,当发生故障时,改进的冲突A*算法可以快速地确定出发生故障的部件,并且与冲突A*算法相比,在发生多重故障的情况下,搜索效率提升了50%,有些部件处没有传感器进行检测,当这些部件发生故障时,改进的冲突A*算法无法准确地定位故障部件,本文中部件故障模式均采用程序语言描述,部件故障状态无法可视化,后续可以增加传感器的数量,提高故障诊断效率,设计部件状态图像窗口实现部件故障状态可视化。