湖南信息學院 易晨暉 何 蓉
北斗電文編碼與解碼的研究
湖南信息學院 易晨暉 何 蓉
差分定位是提高北斗導航定位精度與可靠性的一種重要手段,該技術在數據傳輸時使用國際通用的RTCM SC-104標準。RTCM SC-104標準由國際海運事業無線電技術委員會(RTCM)1983年11月推出,從1983年到2016年已經經過了多個版本的發展。推出RTCM SC-104標準的目的在于論證用于提供GPS業務的各種方法,并制定各種數據格式標準。經過多個版本的更新,差分改正數的抗差性能和實時動態差分定位(Real-Time Kinematic,RTK)性能在不斷地提高,可用信息量不斷增加。而RTCM 3.2的制定和修訂不僅彌補了之前版本中結構設計上存在的明顯缺陷,還增加和擴展了多種網絡RTK信息,尤其值得強調的是MSM電文組可以對北斗系統提供支持,這對北斗高精度差分定位服務有著重要的意義。但是由于RTCM3.2標準公布的時間較短,支持此標準的接收機較少,對編碼、解碼流程研究少。因此本文基于RTCM 3.2對北斗電文的編碼與解碼展開研究與實現,主要分析了《RTCM STANDARD 10403.2》的電文結構和數據類型,提出了一種關于北斗電文編碼和解碼的方法,實現了北斗電文編碼和解碼程序流程設計,并基于VC++平臺實現了RTCM 3.2電文的編寫、基于VC#軟件開發平臺上實現了解碼操作,同時進行循環冗余校驗以保證數據解析的正確性。通過電文數據的解析與實驗程序結果驗證,證明了編碼和解碼算法的正確性和程序的可靠性。
RTCM 3.2;北斗電文;編碼;解碼
我國自主研發的北斗衛星導航定位系統(BeiDou Navigation Satellite System,BDS)可以和目前世界上其他幾大衛星導航定位系統實現兼容與互操作,它具有三大基本功能,分別是快速定位、雙向通信和精密授時,目前已被廣泛應用于我國交通運輸、海洋漁業、水文監測、氣象預報、測繪地理信息、森林防火、通信時統、電力調度、救災減災、應急搜救等各個領域[1]。北斗衛星導航系統的建設與發展對國家安全,經濟建設、科技發展和社會進步等方面有重大意義。隨著我國北斗衛星導航定位系統及產業的蓬勃發展,人們對北斗導航中定位的精度和可靠性有著越來越高的要求。為了滿足衛星導航定位系統的高精度差分定位以及增強服務的要求,RTCM委員會2013年又推出了RTCM 3.2(RTCM standard 10403.2 differential GNSS Services-Version 2)[5]。RTCM 3.2的制定和修訂,不僅彌補了之前版本中結構設計上存在的明顯缺陷,還增加和擴展了多種網絡RTK(實時動態測量技術)信息,定義了包含GPS、GLONASS、GALILEO和BDS的多信號信息組(Multiple Signal Message,MSM)[6],拓寬了RTCM的應用領域。尤其值得強調的是MSM電文組可以對北斗系統提供支持,這對北斗高精度差分定位服務有著重要的意義[2]。但是由于RTCM3.2標準公布的時間較短,支持此標準的接收機較少,對編碼、解碼流程研究少,因此本文基于RTCM 3.2對北斗電文的編碼與解碼展開研究與實現。
差分定位的精度與差分改正信息的更新速率以及數據傳輸的準確性密切相關,因此,數據傳輸格式是數據通訊鏈的重要環節,只有兼容性強和規范性強的數據格式標準才能保證在導航與定位中數據傳輸的快速、準確和可靠。
RTCM 3.2版本采用了OSI(Open System Interconnection)標準參考模型,在RTCM 3.2標準中包含應用層、表示層、傳輸層、數據鏈層和物理層。應用層為導航和定位應用程序定義了創建和應用數據的指令;表示層則具體規定了消息、數據要素和數據定義;傳輸層定義用于發送或接收消息的幀結構、可變長消息的實現方法以及數據的循環校驗方法等;數據鏈路層定義了消息數據流如何在物理層上編碼;物理層定義了消息數據電氣和機械水平,使用時取決于用戶。其中,對于編碼、解碼最重要的是表示層和傳輸層[3]。最新的RTCM 3.2標準格式,是一種更高效、簡潔且容易適用于新環境的數據格式,可以應用于網絡RTK環境中,主要包括消息幀結構、消息類型、數據字段、數據類型等。
RTCM 3.2標準格式的幀結構與RTCM 3.1標準格式相同[4],每幀數據的結構如表1所示。
消息類型規定了每幀數據可變長度的數據消息,是RTCM 3.2協議傳輸各種消息的載體。消息類型根據用途被劃分為不同的消息組,為有效實現特定服務,服務商需要發送組中的幾種消息類型。每組中不同的消息類型可包含相似的內容,在某些情況下短消息只包含提供服務所需的最少最必要的信息,而長消息類型則包含增強服務的額外信息。例如,1001消息類型是只包含消息觀測值的最短版本,對于一個吞吐量有限的廣播鏈路,使用1001消息類型可能是合適的。而1002消息類型包含增強服務的額外信息,如果吞吐量并未受限并需要額外信息,推薦使用長版本的1002消息類型。與之相類似的1003消息類型只提供了應用層/表示層操作所需的最少數據,而1004消息類型提供了完整的數據內容。較短的觀測值消息可節約吞吐量,但只包含較少的信息;而包含附加信息的長消息不會經常改變,發送次數也少。

表1 RTCM 3.2標準格式的幀結構
RTCM 3.2標準格式中已定義消息組包括觀測數據、測站坐標、天線描述、網絡RTK改正、輔助觀測信息和專有信息,BDS多信號消息(MSM)等。RTCM3.2版本通過定義新消息類型,能夠支持20種服務,同時還實現3種狀態空間差分(SSR)服務,服務商可以按照需求提供基本或者完整的服務[6]。
數據字段是消息的重要組成部分,每條消息是由若干數據字段按一定格式排列而成,數據字段規定數據字段的范圍、分辨率和數據類型。RTCM3.2定義了427個數據字段,其中新定義數據字段主要用于表示坐標轉換、網絡RTK殘差、狀態空間差分、GLONASS網絡RTK改正、FKP網絡RTK改正、MSM消息和GLONASS偏差消息等。
數據類型規定數據的范圍,包括位字段、八位字符、補碼整數、無符號整數、帶符號數值整數和UTF-8編碼共六種形式的數據類型。RTCM 3.2定義了55種數據類型,數據類型有bit(n)、char8(n)、int、uint、intS、utf8(n)等,其具體描述見表2所示。需要注意的是數據字段范圍有可能會小于數據類型所允許的最大可能范圍(DF Range),RTCM 3.2中有詳細的標明。有些數據計算出來不一定是整數數據,這個時候需要來乘以分辨率(DF Resolution)再通過解碼和數據類型轉換得到整數結果。

表2 數據類型說明
如果有幾個衛星提供信息,每個消息都包含一組特定的數據字段集,其中有時會有重復。這些數據字段將在廣播中順序列出,并將最重要的多字節信息最先傳送而不那么重要的字節消息后傳送。RTCM 3.2中新定義的消息類型多,其中MSM消息是為不同衛星系統觀測數據提供通用傳輸格式而定義的,可以分解成壓縮消息和完整消息(類似于消息類型1003和1004)[6]。各種導航定位系統的MSM消息具有相同的結構,內部模塊排序也基本相同。
RTCM 3.2電文編碼的實現需要了解并熟悉《RTCM STANDARD 10403.2》標準內容,根據服務類型來選擇消息類型,了解電文的整體結構,熟悉電文的數據字段存儲的內容以及占用的位數,其中有些數據字段涉及計算;同時也需要了解C++程序的結構,各種結構體以及各類消息的編寫流程等。
本文選擇VC++開發平臺來實現RTCM 3.2電文編碼。VC++開發平臺是面向對象的可視化集成編程系統,它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設計集成交互操作、可開發多種程序等優點,而且通過簡單的設置就可使其生成的程序框架支持數據庫接口、OLE2、WinSock網絡、3D控制界面。它允許用戶進行遠程調試,單步執行,在調試期間重新編譯被修改的代碼,而不必重新啟動正在調試的程序。在系統設置及程序編譯中,預編譯頭文件、最小重建功能及累加連結等這些特征明顯縮短程序編輯、編譯及鏈接所花費的時間,在大型軟件上效果尤其顯著。
RTCM 3.2電文編碼實現過程中,為了達到較高的傳輸完整率,一條標準的電文采用消息幀結構,具體的消息幀結構如表1所示。在RTCM 3.2中,不是每條電文都是按整字節編寫的,所以在編碼的過程中我們需要對不是整字節的電文進行補碼。同時,進行循環冗余校驗以保證數據解析的正確性。循環冗余檢查(CRC)是一種數據傳輸檢錯算法,對數據進行多項式的計算,并將算出的結果附在電文的后面,用來保證數據傳輸的正確性和完整性。消息幀的接收方用一個二進制因子(生成多項式)除以消息幀的內容計算出余數,并將所計算出的余數與發送方存儲在消息幀中的檢驗碼進行比較。本文編碼中采用按字節計算CRC,并把8位二進制序列數的CRC全部計算出來,如放一個表里,采用查表法,大大提高了計算速度。通過實測數據驗證解析結果的正確性。
基于VC++開發平臺的RTCM 3.2電文編碼流程如下圖所示:

圖3-1 編碼流程圖
具體流程說明:①所選擇的消息號是否含有消息頭。如果有,先添加消息頭內容;如果沒有,直接添加電文消息內容。②將編碼完的消息號轉為二進制輸出;③在數據前面添加引導字“11010011”和保留字“000000”;④在這條電文后面添加24位CRC校驗碼。⑤得到完整的電文。
以上是對一條完整的電文數據詳細進行的編碼過程,不同系統之間的編碼流程是一致的,所有信息類型的編碼過程與上述思想大致相同。

圖3-2 編碼文件導入

圖3-3 編碼內容展示

圖3-4 基于VC++的RTCM 3.2電文編碼實現界面
程序界面簡潔易懂,實用性好,通過實測數據驗證了編碼結果的正確性。
本文選擇VC#開發平臺來實現RTCM 3.2電文解碼。VC#是由C和C++衍生出來的面向對象的編程語言,擁有簡單的可視化操作、高運行效率和Microsoft.net提供的最大程度地開發利用計算與通訊領域的一系列工具和服務。VC#開發應用軟件可以大大縮短開發周期,同時可以嵌入用戶C++代碼。
基于VC#開發平臺的RTCM 3.2電文解碼流程如下圖所示:

圖4-1 解碼程序流程圖
具體流程說明:①讀取RTCM 3.2電文數據;②從末尾位置開始往上提取 24 位得到完整的 CRC ;③進行CRC 24校驗,若校驗通過,則進行下一步;④從前24位開始提取12位電文消息號,代表信息類型。⑤選擇電文消息號,通過該電文在 RTCM 3.2 文檔中的具體要求進行解碼。⑥輸出解碼后的數據。
以上是對一條完整的電文數據詳細進行解碼的過程,不同系統之間的解碼流程是一致的,所有信息類型的解碼過程與上述思想大致相同。
在VC#開發平臺上實現RTCM 3.2電文解碼,實現過程中界面如下圖所示:

圖4-2 解碼文件導入

圖4-3 解碼電文解析
進行解碼后的電文數據能夠實現自動保存在自定義的路徑中:

圖4-4 電文解碼實現界面
對實測數據進行解碼后得到的數據信息,將解碼的數據與接收機保存的文件進行了對比,得出了一致的結果,驗證了算法的正確性。
本文基于RTCM 3.2對北斗電文的編碼與解碼展開研究與實現,基于VC++平臺實現了RTCM 3.2電文庫的編寫,基于VC#軟件開發平臺上實現了解碼操作,同時進行循環冗余校驗,實驗結果驗證了算法的正確性和可靠性。
RTCM 3.2標準格式正逐漸成為衛星導航定位領域芯片制造商、板卡集成商、整機制造商、應用服務提供商以及用戶等在設計研發、生產加工、應用推廣等產業鏈中遵守的關鍵協議之一。目前,RTCM 3.2標準電文容量為4096條,已經占用了1310條電文(含保留電文1112條),但僅在多頻率多信號電文組(MSM)中為北斗制訂了10條電文,在四大全球衛星導航系統中北斗電文數量最少。BDS在RTCM 3.2電文業務的發展仍需不斷努力,才能在國內外GNSS高精度差分定位領域有進一步突破,從而能提供更完整、獨立、兼容的服務。
[1]中華人民共和國國務院新聞辦公室.《中國北斗衛星導航系統》白皮書.[EB/OL].http://news.xinhuanet.com/tech/2016-06/16/c_1119053495. html.2016,6.
[2]吳海玲,李作虎,劉暉.關于北斗加入RTCM國際標準的總體研究[J].全球定位系統,2014,39(1):27-33.
[3]朱靜然,潘樹國,孔麗珍.DGPS數據格式RTCM3.2介紹及編解碼方法[C].第四屆中國衛星導航學術年會論文集-S1 北斗/GNSS導航應用,2013.
[4]陳振,王權,秘金鐘,谷守周,方書山,向常淦.新一代國際標準RTCM V3.2及其應用[J].導航定位學報,2014,2(4):87-93.
[5]RTCM special committee no.104. RTCM-standard 10403.2 for Differential GNSS[S]. Arlington:Radio Technical Commission for Maritime Services, 2013.
[6]RTCM special committee no.104. Amendment 1 To RTCM-standard 10403.2 for Differential GNSS[S]. Arlington:Radio Technical Commission for Maritime Services, 2013.
易晨暉,女,碩士研究生,湖南信息學院講師,主要從事計算機應用、人工智能、北斗導航等研究。