黄 旭
(中铁第一勘察设计院集团有限公司,西安 710000)
随着全球导航卫星系统的发展,卫星定位的技术在轨道交通领域的应用也日渐成熟。国外的RUNE[1]、GADEROS[2]和LOCOPROL[3];国内的青藏铁路增强型列车控制系统(ITCS)以及正在试验的新型列控系统均是将卫星定位作为列车定位的重要手段。尤其随着我国自主研发的北斗卫星导航系统的不断发展,将北斗卫星定位应用于铁路各个领域的研究也日益增长[4-7]。
基于轨道线路的电子地图数据是实现列车卫星定位的前提,不正确的电子地图数据将会导致列车定位失效或错误,甚至会导致系统输出错误或停车等事故,因此确保电子地图数据的正确性至关重要。电子地图数据的生成过程可概括为:前期设计、现场测绘、数据生成、验证与确认。前期设计是生成电子地图数据的第一步,将前期设计输出的内容暂且定义为电子地图基础数据(简称“基础数据”)。基础数据是根据系统需求和相关规范进行设计,可供后续测绘和制作电子地图数据文件使用,基础数据是源头,其正确与否直接关系到后续工作的正确性。为确保列车精确定位和系统安全运行,需对电子地图基础数据进行正确性验证。
当前电子地图基础数据的验证方式主要为人工校验,存在以下问题:一是易出错,校核过程个人的能力水平直接决定着校核质量,易带来错误判断或遗漏等问题;二是效率低,人工判断时间花费较长,且因现场或试验结果,基础数据的迭代频次较高,这就导致人工核对效率无法满足实际需求。因此探索一种高效、准确的验证方法,对确保电子地图的正确性有重要意义,也有助于实现列车精确定位。
当前对轨道电子地图数据的研究主要集中在地图数据处理、约简和地图匹配算法等方面。文献[8]提出一套生成高精度轨道电子地图的数据处理方法,分别采用卡尔曼滤波方法对采集数据进行滤波,采用轨迹拟合方法对轨道曲线进行归一化处理,采用垂直距离判据数据约简算法去除冗余数据,最终可生成高精度电子地图数据。文献[9]提出用线段近似法描述曲线轨道,可保证轨道精度又降低数据量。文献[10]提出基于方位角的曲率方法对线路的平面线性进行特征识别与分段拟合。文献[11]对电子地图数据进行分析,开发了电子地图生成软件。文献[12-14]分别对电子地图的匹配算法进行了研究,通过仿真可证明匹配算法的准确性。作为电子地图数据验证中重要的环节,电子地图基础数据的验证目前研究较少。
针对当前现状,本文首先对电子地图基础数据结构和内容进行分析;深入分析基础数据,结合相关规范和领域专家知识,提取出基础数据验证规则;针对基础数据内容多、变更频繁等特点,提出一种电子地图基础数据建模与验证方法,用Prolog语言描述数据和验证规则,搭建其验证模型。最后以实际线路数据为例,搭建其数据验证模型,证明该验证方法的高效性和准确性。这对提高电子地图数据的正确性有着积极作用。
当前不同列控系统对应的电子地图数据格式不尽相同,本文以其中一种列控系统对应的数据为例展开研究。电子地图数据以车站为最小数据组织单位,区间数据按照划分原则分别纳入相邻的车站数据组织。电子地图数据包含轨道地理信息文件和固定应用数据文件,轨道地理信息描述的是卫星数据与轨道位置数据间的对应关系,固定应用数据文件描述了区间和站内的关键设备及边界所在的轨道和坐标位置信息。地图数据均是依据基础数据加上测绘数据编制而成。
电子地图基础数据一般是由设计院输出的一套Excel表格,描述了每个车站管辖范围内测绘的轨道、关键点的名称、类型、所在轨道、里程等信息。基础数据包括车站信息表、轨道信息表、关键点信息表、应答器信息表和道岔信息表,如线路里程存在里程转换或断链则还需要补充里程转换信息表和断链信息表。车站信息表描述了线路中车站名称、对应的各级编号及车站所属的中心设备序号。轨道信息表描述了线路划分的轨道号、轨道的起始和结束边界以及边界对应的里程和相对轨道起点的位置。关键点包括3种类型:应答器、道岔和数据边界,关键点信息表分别描述了各种关键点的类型、名称、里程、所在轨道、距轨道起始边界的位置等信息。应答器信息表和道岔信息表则根据关键点信息表进行填写,应答器信息表中补充了应答器编号、用途等内容,道岔信息表中补充了开岔开向、定位开向等信息。基础数据中的位置数据均是基于线路运营里程计算所得,可供后续的测绘数据做一致性校验。对应的数据组织关系如图1所示。
图1 轨道电子地图基础数据结构组织
电子地图基础数据验证规则来源可分为两类:一是铁总颁布的各类行业规范文件;二是通过对基础数据的深入分析和挖掘结合领域专业知识提取所得。基础数据本身数据格式定义明确、数据间的关联性较强,因此根据其内容特点,可将规则概括为两类:值域规则和逻辑规则。
基础数据包含几类数据对象,每一类数据对象所描述的信息均需满足其对应的值域规则,从数据类型、格式、精度和取值范围四方面对基础数据的值域规则进行描述。
2.1.1 数据类型
不同的数据对象描述的内容不同,每一项内容属性对应的数据类型不同。基础数据主要包含的数据类型有:整型、字符串、布尔类型、枚举类型。
2.1.2 数据格式
根据相关规范,基础数据格式有明确要求,各项数据均有其对应的命名或表示规则。如里程的格式应为(KXXX+XXX);应答器名称应以B开头等。
2.1.3 数据精度
数据值应与其对应的单位精度匹配,如里程值精确到米;位置值精确到厘米。
2.1.4 取值范围
每一项数据都有对应的实际意义,根据相关规范和专业知识,可总结得到某些数据对应的取值范围,如距轨道起点的位置值一定大于等于0;轨道号取值应为正数;根据区间长度划分原则可确定距轨道起点位置值的上限。
表1为提取得到的基础数据值域规则具体内容的部分示例。
表1 值域规则举例
值域规则是对数据本身的值域、格式等方面的约束,逻辑规则是描述数据之间的约束关系。以下定义并列举了部分电子地图基础数据的逻辑验证规则。
定义1:车站信息定义为
规则1:不可能存在编号相同的两个车站。
(Regionnum,i,Partitionnum,i,Stationnum,i)≠
(Regionnum,j,Partitionnum,j,Stationnum,j)
定义2:若存在线路断链,断链数据定义为
定义3:轨道信息定义为
规则2:断链长度等于断链起点和终点里程之差。
Dlength=|Dend-Dbegin|
规则3:轨道终点位置值与轨道终点里程、轨道起点里程以及是否包含断链信息有关。若轨道起终点之间不存在断链,则轨道终点位置等于终点里程与起点里程之差乘100;若存在断链则需考虑断链长度。Di为断链:
当∀Di∈D,Di∉T,Tend_len=100*|Tend_loa-Tbegin_loa|;
当∀Di∈D,Di∉T,Tend_len=100*(|Tend_loa-Tbegin_loa|±Dlength)。
式中,D为断链合集,Di为断链合集中的一个元素;T表示轨道合集。
规则4:同一车站内轨道号唯一。
(Tstation,i,Tnum,i)=≠(Tstation,j,Tnum,j)
规则5:一般情况一条轨道长度存在上限。
max{Tend_len,1,Tend_len,2, ,Tend_len,n} 定义4:应答器信息定义为 规则6:当且仅当应答器类型是“虚拟”,对应的用途为“XQ”。 Btype=“虚拟”<-->BUSE=“XQ” 规则7:应答器组内间距为5 m。 当BGname,i=BGname,j且Gnum,j=Gnum,i+1时,Bloa,j=Bloa,i±5。 规则8:应答器距轨道起点的位置与应答器里程、应答器所在轨道起点里程以及是否包含断链信息有关。 当∀Di∈D,Di∉B,Blen=100*|Bloa-Tbegin_loa|; 当∀Di∈D,Di∉B,Blen=100*(|Bloa-Tbegin_loa|±Dlength。 式中,D为断链合集,Di为断链合集中的一个元素;B表示应答器与轨道起点之间数据合集。 规则9:应答器所属车站名称一定是车站信息表中的车站。 Bstation∈StationName 定义5:道岔信息定义为 规则10:一个车站内,同一条轨道上不存在岔尖里程相同的两组道岔。 当(Sstation,i=Sstation,j)∩(STtrack,i=STtrack,j)时,Sloa,i≠Sloa,j 规则11:岔尖所属轨道要不与定位所属轨道一致,要不与反位所属轨道一致。 (STtrack=SDtrack∩STtrack≠ SDtrack∩STtrack=SFtrack) 定义6:关键点信息定义为 规则12:关键点信息表中只描述组内第一个应答器信息。 当(Gnum=1∪Gnum=null)∩(Ptype=“应答器”)时,P=B。 规则13:关键点信息表中应包含道岔信息表中所有道岔。 当(Ptype=“道岔”)时,P=S。 规则14:关键点信息表中应包含所有轨道边界。 (Tbeginattr=“起始数据边界”)∪Tbeginattr=“结束数据边界”)∩(Ptype=“数据边界”)时,P=T。 其中:P表示关键点合集,B表示应答器合集,S表示道岔合集,T表示轨道合集。 为实现电子地图基础数据的自动验证,本文采用Prolog语言搭建基础数据的验证模型,目的一是对验证规则进行形式化描述,二是基于验证工具搜索出不满足规则的数据反例,最终可实现基础数据的自动验证。 Prolog语言[15]是以一阶谓词逻辑为基础的逻辑编程语言,采用陈述句式使用演绎推理进行问题求解,它利用已知事实和规则结合内部搜索、匹配和回溯的推理机智自动求解程序设定的目标,不需要在程序中列出详细的求解步骤。Prolog语言仅具有事实、规则和目标3种基本类型[16]。Prolog语言在构建专家系统[17-18]、智能检索系统[19]、数据验证[20-21]等方面已有不少研究。 事实是用来描述已知的对象和他们之间的关系,事实由谓词及对象组成,对象可以是一个或多个。谓词和对象可由用户自己定义。例如like(bill,dog),该事实描述的是bill喜欢cindy。 规则用来描述事实之间的依赖关系,由左边表示结论的谓词和右边表示条件的谓词组成,中间通过“:-”连接,以“.”结束。例如like(cindy,X):-like(bill,X)表示cindy喜欢bill喜欢的东西。 把事实和规则写进Prolog语言描述后,可以其询问有关问题的答案,问题就是程序运行的目标。目标可以是一个简单的谓词,也可以是多个谓词组合。例如?-like(cindy,dog)表示向程序询问“cindy是否喜欢狗?”。 本文用Prolog语言的事实描述电子基础数据,规则描述基础数据应满足的验证规则,目标则是遍历数据是否满足所有规则,并找出反例,即不符合验证规则的数据。 电子地图基础数据由车站信息表、轨道信息表、应答器位置表、道岔信息表、关键点信息表组成,需要将excel表格中的每一行数据转换为Prolog可识别的事实。各数据表的事实表示如下: 车站信息:station(Aid,Aname,Regionnum,Partitionnum,Stationnum,TSRS_Num,RBC_Num)。 轨道信息:track(Tid,Tstation,Tnum,Tbegin_attr,Tbegin_loa,Tbegin_len,Tend_attr,Tend_loa,Tend_len)。 应答器信息:balise(Bid,BGname,BGnum,Gnum,Bloa,Btype,Buse,Bstation,Btrack,Blen)。 道岔信息:switch(Sid,Sstation,Snum,Sloa,Sdir,STtrack,STlen,SDtrack,SDlen,SDtrack,SDlen,SFtrack,SFlen)。 关键点信息:poi(Pid,Pstation,Ptype,Pname,Ptype2,Ptrack,Plen,Ploa)。 断链信息:chain(Did,dtype,Dbegin,Dend,Dlength,Ddir)。 数据事实由对应谓词和参数组成,例如:track是轨道数据事实的谓词,参数Tid序号、Tstation表示轨道所属车站、Tnum表示轨道号、Tbegin_attr表示轨道起点属性、Tbegin_loa表示起点里程、Tbegin_len表示起点位置、Tend_attr表示轨道终点属性、Tend_loa表示终点里程、Tend_len表示终点位置。由此可将excel表中每一行数据转换为事实。 此外,数据值域规则中枚举属性对应的数据事实可用列表来表示。 轨道起点属性Tbegin_attr对应的数据事实为:track_begin_attr([‘起始数据边界’,‘道岔’])。 轨道终点属性Tend_attr对应的数据事实为track_end_attr([‘结束数据边界’,‘道岔’])。 道岔开岔方向Sdir对应数据事实为:switch_dir([0,1])。 关键点类型Ptype对应数据事实为:poi_type([‘应答器’,’数据边界’,’道岔’])。 将提取的基础数据验证规则转换为Prolog语言对应的规则表述,构建数据验证的规则模型。 3.3.1 值域规则模型 值域规则对应的是数据类型和取值的约束。简单的数据类型约束可利用Prolog的内部谓词作为规则谓词,如integer(A),float(A),number(A)等。其他特殊的格式约束需进行自定义规则。 轨道信息事实中轨道起点属性应满足固定几种类型,验证轨道属性的规则可描述为: check_track_beginAttr(Tid):-track(Tid,_,_,_,_,Tbegin_attr,_,_,_,_,_),track_begin_attr(Track_begin_attr),/+member(T_begin_attr,Track_begin_attr)。 其中:Tid是轨道数据的序号,member是Prolog的内部谓词,member(T_begin_attr,Track_begin_attr)描述变量T_begin_attr(轨道起点属性值)是否是集合Track_begin_attr(轨道起点属性值集合)的一个元素,“/+”是Prolog的内部符号,表示取反值。执行check_track_attr(Tid)规则,可搜索出轨道起点属性不满足要求的轨道序号。 应答器名称的第一个字符应是字母“B”。对应规则可描述为: check_blase_name(Bid):-balise(Bid,BGname,_,_,_,_,_,_,_,_),name(BGname,X),X=[X1|_],X1/=66。 其中:Bid是应答器数据的序号,BGname是应答器组名称,name是Prolog的内部谓词,name(BGname,X)是将BGname转换为对应ASCII码列表,X1为BGnameASCII码列表中的第一个元素。执行check_blase_name(Bid)规则可输出名称中第一个字符不是“B”的应答器数据对应的序号,可供错误定位及修改。 3.3.2 逻辑规则模型 规则1:不可能编号相同的两个车站。 check_stationNum(Aid1,Aid2):-station(Aid1,_,Regionnum1,Partitionnum1,Stationnum1,_,_),station(Aid2,_,Regionnum2,Partitionnum2,Stationnum2,_,_),Aid1 执行check_stationNum(Aid1,Aid2)规则可以输出大区编号、分区编号和车站编号分别相同的车站数据序号。 规则2:断链的长度等于终点里程于起点里程之差,对应规则可描述为: check_chainLen(Did):-chain(Did,_,Dbegin,Dend,Dlength,_),Dlength=/=abs(Dend-Dbegin)。 其中:Did是断链序号,abs是Prolog的内部谓词,表示求绝对值。执行Check_chainLen(Did)规则可输出不满足长度等于起终点里程差的断链序号。 规则3:轨道长度与起终点里程和是否存在断链有关,该条规则需多条规则组合描述。 check_ChainIn(Tid,Dtype,Dlength):-track(Tid,_,Tnum,Tbegin_loa,_,_,Tend_loa,_),chain(Did,Dtype,Dbegin,Dend,Dlength,Ddir),(Tbegin_loa check_T_endLen(Tid):-track(Tid,_,_,_,Tbegin_loa,_,_,Tend_loa,Tend_len), check_Chain_in(Tid,Dtype,Dlength),(Dtype=’长链’,Tend_len/=100*(|Tbegin_loa-Tend_loa|+Dlength));(Dtype=’短链’,Tend_len/=100*(|Tbegin_loa-Tend_loa|-Dlength))。 check_T_endLen(Tid):-track(Tid,_,_,_,Tbegin_loa,_,_,Tend_loa,Tend_len),/+check_Chain_in(Tid),Dtype,Dlength),Tend_len/=100*(|Tbegin_loa-Tend_loa|)。 谓词check_ChainIn是判断序号为的轨道数据的起终点范围内是否包含断链,并取得断链的类型和长度。其中”,”代表逻辑关系中的“且”,”;”代表逻辑关系中的“或”。谓词check_T_endLen由两条规则组成,用多条规则可以定义同一个谓词,分为轨道数据包含断链和不包含断链两种情况,执行check_T_endLen(Tid)可输出轨道终点位置与里程不符合逻辑规则的轨道数据序号。 规则4:同一车站内轨道号唯一。 is_uniq(X,Y_list):-member(X,Y_list),delete(Y_list,X,Last_l),length(Last_l,Len_last),length(Y_list,Len_Y),Len_Y is Len_last+1。 首先自定义is_uniq规则,其中member,delete和length均是内部谓词,执行is_uniq(X,Y_list)可判断变量X是否是列表Y_list中的非重复项,如果是输出FALSE,如果是非重复项则输出TRUE。 Check_T_num(Tid):-track(Tid,Tstation,_,_,_,_,_,_,_),findall(Tnum,track(_,Tstation,Tnum,_,_,_,_,_,_),T_numList),findall(Tid,track(Tid,_,Tstation,_,_,_,_,_,_,_),T_IdList),findall(Tid,(is_uniq(T_num,T_numList),track(Tid,_,Tstation,T_num,_,_,_,_,_,_)),Uniq_id),member(Tid,T_IdList),/+member(Tid,Uniq_id)。 利用Prolog内部谓词findall首先找出轨道信息表中同一个车站内所有轨道号和序号分别至变量T_num_list,Id_list中,在找出轨道号T_num是T_num_list中的非重复项的轨道数据对应的序号至变量Uniq_id中,再判断如果序号是Id_list中的元素,但不是Uniq_id中的元素,则说明该序号对应的轨道号是重复项。执行Check_T_num(Tid)可输出同一车站内轨道号重复的数据对应的序号。 规则5:一般情况一条轨道长度存在上限 check_T_max(Tid):- track(Tid,_,_,_,_,_,_,_,Tend_len),/+(Tend_len<10000000)。 执行check_T_max(Tid)可输出轨道长度不小于100 km的轨道数据序号。 规则6:当且仅当应答器类型是“虚拟”,对应用途为“XQ”。 check_baliseUse(Bid):-balise(Bid,_,_,_,_,Btype,Buse,_,_,_),/+(Btype=’虚拟’->Buse=’XQ’,Buse=’XQ’->Btype=’虚拟’)。 3.3.3 错误输出模型 值域规则模型和逻辑规则模型可以验证数据事实是否满足对应规则,并输出不满足规则的数据序号。但每一条规则需在Prolog编译器中逐条去询问后才会输出验证结果,电子地图基础数据的值域规则和逻辑规则多达几十至上百条,每次验证逐条询问规则效率太低。因此本文设计了错误输出模型,可将自动输出违反规则的数据信息至一个文档,可供错误修改。 第一步:将每条规则对应的错误数据信息添加至error事实; 在每一条规则后添加”*-> assertz(error(message)).”,可将错误数据信息添加至error事实中。 ”*->”是Prolog的内部操作符,”A->B”等价于”if A then B”,assertz是Prolog内部谓词,是将插入当前动态数据库中的同名谓词的事实之后。例如: check_track_beginAttr(Tid):-track(Tid,_,_,_,_,Tbegin_attr,_,_,_,_,_),track_begin_attr(Track_begin_attr),/+member(T_begin_attr,Track_begin_attr),*-> assertz(error(Tid,T_begin_attr,'not in',Track_begin_attr))。 执行check_track_beginAttr规则后,error(X)事实中会增加轨道起点属性不满足值域规则的数据信息。 第二步:设置一个总询问规则all_rule(_):-rule1(Tid);rule2(Bid); rule_n(Bid)。每次验证数据只需在编译器询问一次all_rule(_),即可将所有规则对应的错误信息添加至error事实中。 第三步:将所有error事实输出至文档中。 save(FileName):-telling(Old),tell(FileName),listing(error),told,tell(Old)。 其中save,telling,tell,listing,told,tell均是Prolog的内部谓词,save谓词可将当前内存中的事实存入文件“Filename”中,listing(error)列出谓词error中的所有子句。 利用规则模型对实际线路电子地图基础数据进行验证,本文采用GUN prolog解释器作为验证工具,以某单线铁路为例,线路全长800多公里,共设有21个车站,电子地图基础数据共2 499条,提取的值域规则30条,逻辑规则54条。表2是数据验证结果。 表2 规则模型验证结果 验证结果可知,验证2 499条数据,84条规则总耗时约2.6 s,相较于人工验证数据,本文建立的验证模型及方法具有高效性。 错误验证率是模型监测出的错误数量占数据真实的错误数量的百分比,其中真实的错误人工添加所得,是由非模型设计人员对已确认正确的数据添加错误。2 599条数据的错误验证率达94%,可见该验证模型和方法具有较高的准确性。 分析未被模型识别的错误数据,发现主要原因有两方面:(1)数据逻辑关系独立,例如车站信息表中TSRS设备序号与其他数据之间无规则约束,因此当序号由“4”被错误修改为“3”,规则模型无法检测错误;(2)多个错误叠加,构成数据巧合。例如同时修改轨道终点里程和位置值,使得修改后位置和里程之间的关系仍满足规则。 针对电子地图基础数据校核当前存在的问题,提出基于Prolog的数据验证方法,深入分析基础数据格式、内容,通过相关规范以及领域专业知识,提取出基础数据的验证规则,采用Prolog语言搭建数据事实和验证模型,以实际线路为例进行试验,证明了模型的可行性和有效性。3 建模与验证
3.1 Prolog语言
3.2 数据事实
3.3 规则模型
3.4 验证结果
4 结束语
——论胡好对逻辑谓词的误读