黃 旭
(中鐵第一勘察設計院集團有限公司,西安 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 結束語