最近看到咱們國内的的導航:北鬥導航已經完全部署完了麼,然後就去查找資料了解了一下導航這個玩意,最後發現其實不管什麼導航其實都差不多,隻是用的衛星不一樣,如果用GPS導航可能就是使用美國那邊發射的衛星,如果使用北鬥導航,就使用咱們國家自己發射的衛星。最後都是從衛星哪兒接受到資料,然後本地裝置接收到資料進行計算得出目前位置資訊,過程差不多就是這樣,然後發現有篇文章寫的還不錯,是站在碼農角度去解析分析導航的過程的,個人覺得比較好了解,轉載記錄一下,互相學習。
位置服務已經成為越來越熱的一門技術,也将成為以後所有移動裝置(智能手機、掌上電腦等)的标配。而定位導航技術中,目前精度最高、應用最廣泛的,自然非GPS莫屬了。網絡上介紹GPS原理的專業資料很多,而本文試圖從程式設計人員的角度出發,以一種程式員易于了解的方式來簡單介紹一下GPS定位的基本原理,希望對做GPS開發的朋友有所啟發。當然,本文并沒有涉及具體的開發方面的技術。
一、GPS定位數學模型
之是以先介紹數學模型,是因為我認為這個數學模型可能是程式員比較關心的問題。當然事先聲明,這個模型隻是我根據一些GPS資料總專為程式員總結出來的一個簡化模型,細節方面可能并不符合實際,想了解具體細節請參考專業的GPS講解資料。
GPS定位,實際上就是通過四顆已知位置的衛星來确定GPS接收器的位置。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBHL0FWby9mZvwVZnFWbp1zczV2YvJHctM3cv1Ce-cnW1JkbMlWMXR2bSNDW5lkaZRnVIFGM5ETVRRGMMlXSw0kZOZUVIlTajxmUYFWekZFTspFWh1UM5N2M5ckW1xmMWZXQU1EerNjYp50Vh5mRXJmdwIjYqlTMj5WOHJWa1ITW2BjMipWN5Nmb5ckYpVjMZVXTYplbGdlYwlTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
如上圖所示,圖中的GPS接收器為目前要确定位置的裝置,衛星1、2、3、4為本次定位要用到的四顆衛星:
- Position1、Position2、Position3、Position4分别為四顆衛星的目前位置(空間坐标),已知
- d1、d2、d3、d4分别為四顆衛星到要定位的GPS接收器的距離,已知
- Location 為要定位的衛星接收器的位置,待求
那麼定位的過程,簡單來講就是通過一個函數GetLocation(),從已知的[Position1,d1]、[Position2,d2]、[Position3,d3]、[Position4,d4]四對資料中求出Location的值。用程式員熟悉的函數調用來表示就是:
Location=GetLocation([Position1,d1],[Position2,d2],[Position3,d3],[Position4,d4]);
一看到這個函數調用,程式員們就該來勁了:這些參數從哪裡來?這個函數又是如何執行?由誰來執行的呢?立體幾何還沒有忘幹淨的可能還要問:為什麼必須要4對參數呢?那下面我們就來一起探究一下。
1.Position1、Position2、Position3、Position4這些位置資訊從哪裡來?
實際上,運作于宇宙空間的GPS衛星,每一個都在時刻不停地通過衛星信号向全世界廣播自己的目前位置坐标資訊。任何一個GPS接收器都可以通過天線很輕松地接收到這些資訊,并且能夠讀懂這些資訊(這其實也是每一個GPS晶片的核心功能之一)。這就是這些位置資訊的來源。
2.d1、d2、d3、d4這些距離資訊從哪裡來?
我們已經知道每一個GPS衛星都在不辭辛勞地廣播自己的位置,那麼在發送位置資訊的同時,也會附加上該資料包發出時的時間戳。GPS接收器收到資料包後,用目前時間(目前時間當然隻能由GPS接收器自己來确定了)減去時間戳上的時間,就是資料包在空中傳輸所用的時間了。
知道了資料包在空中的傳輸時間,那麼乘上他的傳輸速度,就是資料包在空中傳輸的距離,也就是該衛星到GPS接收器的距離了。資料包是通過無線電波傳送的,那麼理想速度就是光速c,把傳播時間記為Ti的話,用公式表示就是:
di=c*Ti(i=1,2,3,4);
這就是di(i=1,2,3,4)的來源了。
3.GetLocation()函數是如何執行的?
這個函數是我為了說明問題而虛構的,事實上未必存在,但是一定存在這樣類似的運算邏輯。這些運算邏輯可以由軟體來實作,但是事實上可能大都是由硬體晶片來完成的(這可能也是每一個GPS晶片的核心功能之一)。
4.為什麼要必須要四對參數?
根據立體幾何知識,三維空間中,三對[Positioni,di]這樣的資料就可以确定一個點了(實際上可能是兩個,但我們可以通過邏輯判斷舍去一個),為什麼這裡需要四對呢?理想情況下,的确三對就夠了,也就是說理想情況下隻需要三顆衛星就可以實作GPS定位。但是事實上,必須要四顆。
因為根據上面的公式,di是通過c*Ti計算出來的,而我們知道c值是很大的(理想速度即光速),那麼對于時間Ti而言,一個極小的誤差都會被放大很多倍進而導緻整個結果無效。也就是說,在GPS定位中,對時間的精度要求是極高的。GPS衛星上是用銫原子鐘來計時的,但是我們不可能為每一個GPS接收器也配一個銫原子鐘,因為一個銫原子鐘的價格可能已經超過了這個GPS裝置再加上使用GPS的這輛名貴汽車的價格。
同時,由于速度c也會受到空中電離層的影響,是以也會有誤差;再者,GPS衛星廣播的自己的位置也可能會有誤差。其他等等一些因素也會影響資料的精确度。
總之,資料是存在誤差的。這些誤差可能導緻定位精确度降低,也可能直接導緻定位無效。GetLocation(函數)中多用了一組資料,正是為了來校正誤差。至于具體的細節,我們就不用關心了,我們隻要知道,多用一組資料,就可以通過一些巧妙的算法,消除或減小誤差,保證定位有效。這就是GetLocation()函數必須用四組資料的原因,也就是為什麼必須有四顆衛星才能定位的原因。
5.GetLocation()函數傳回的位置資訊怎樣被GPS裝置識别呢?
前面說在進行位置計算時都是用的空間坐标形式表示,但是對GPS裝置及應用程式而言,通常需要用的是一個[經度,緯度,高度]這樣的位置資訊。那麼我們可以想象,在GetLocation()函數傳回位置結果前,可能會進行一個從空間坐标形式到經緯度形式的轉換,我們不妨假設存在一個Convert(經緯度,空間坐标)這樣的函數來進行這個轉換。
6.單點定位與差分定位
實際上上面所說的隻是定位原理中的其中一種,稱為單點定位,或絕對定位。就是通過唯一的一個GPS接收器來确定位置。
目前定位精度最高的是差分定位,或稱相對定位。就是通過增加一個參考GPS接收器來提高定位精度。
上面我們已經圍繞一個虛拟的GetLocation()函數基本搞清楚了GPS定位的基本數學模型,對于程式設計而言,知道這些就足夠了(其實不知道也不影響程式設計)。如果好奇心還沒滿足的話,我們繼續了解一些GPS相關的背景知識。
二、GPS衛星是哪裡來的?
(廢話,當然是人發射的!地球人發射的!)
GPS(Global Position System,全球定位系統),全稱為NAVSTAR GPS(NAVigation Satellite Timing And Ranging Global Position System,導航星測時與測距全球定位系統)。GPS是一個由美國國防部開發的空基全天侯導航系統,它用以滿足軍方在地面或近地空間内擷取在一個通用參照系中的位置、速度和時間資訊的要求。
1.GPS發展曆程
- 1957年10月第一顆人造地球衛星SputnikⅠ發射成功,空基導航定位由此開始
-
1958年開始設計NNSS-TRANSIT,即子午衛星系統;
1964年該系統正式運作;
1967年該系統解密以供民用。
-
1973年,美國國防部準許研制GPS;
1991年海灣戰争中,GPS首次大規模用于實戰;
1994年,GPS全部建成投入使用;
2000年,克林頓宣布,GPS取消實施SA(對民用GPS精度的一種人為限制政策)。
2.美國政府的的GPS政策
-
兩種GPS服務:
SPS--标準定位服務,民用,精度約為100M;
PPS--精密定位服務,軍用和得到特許的民間使用者使用,精度高達10M.
-
兩種限制民用定位精度的措施(保障國家利益不受侵害):
SA--選擇可用性,認為降低普通使用者的測量精度,限制水準定位精度100M,垂直157M(已于2005年5月1日取消);
AS--反電子欺騙。
3.其他衛星導航系統
- GLONASS(全球軌道導航衛星系統),前蘇聯
- Galileo-ENSS(歐洲導航衛星系統,即伽利略計劃),歐盟
- 北鬥導航系統,中國
三、GPS系統的構成
GPS系統=空間部分+控制部分+使用者部分
1.空間部分
GPS空間部分主要由24顆GPS衛星構成,其中21顆工作衛星,3顆備用衛星。24顆衛星運作在6個軌道平面上,運作周期為12個小時。保證在任一時刻、任一地點高度角15度以上都能夠觀測到4顆以上的衛星。
主要作用:發送用于導航定位的衛星信号。
構成:24顆衛星=21顆工作衛星+3顆備用衛星
2.控制部分
GPS控制部分由1個主要站,5個檢測站和3個注入站組成。
組成:GPS控制部分=主要站(1個)+監測站(5個)+注入站(3個)
作用:監測和控制衛星運作,編算衛星星曆(導航電文),保持系統時間。
- 主要站:從各個監控站收集衛星資料,計算出衛星的星曆和時鐘修正參數等,并通過注入站注入衛星;向衛星釋出指令,控制衛星,當衛星出現故障時,排程備用衛星。
- 監控站:接收衛星信号,檢測衛星運作狀态,收集天氣資料,并将這些資訊傳送給主要站。
- 注入站:将主要站計算的衛星星曆及時鐘修正參數等注入衛星。
分布情況:
- 主要站:位于美國科羅拉多州(Calorado)的法爾孔(Falcon)空軍基地。
- 注入站:阿松森群島(Ascendion),大西洋;疊戈加西亞(Diego Garcia),印度洋;卡瓦加蘭(Kwajalein),東太平洋。
- 監控站:1個與主要站在一起;3個與注入站在一起;另外一個在夏威夷(Hawaii),西太平洋。
3.使用者部分
GPS使用者裝置部分包含GPS接收器及相關裝置。GPS接收器主要由GPS晶片構成。
如車載、船載GPS導航儀,内置GPS功能的移動裝置,GPS測繪裝置等都屬于GPS使用者裝置。
組成:主要為GPS接收器
作用:接收、跟蹤、變換和測量GPS信号的裝置,GPS系統的消費者。
GPS定位是目前最為精确、應用最為廣泛的定位導航技術,以後将會成為每一個移動裝置的标配之一。現在的中高端隻能手機,有相當一部分已經配備了GPS硬體。那麼針對GPS定位的開發技術也将成為一項主流正常技術。本文目的在于讓準備進行GPS定位開發的程式設計人員對于GPS有一個大緻的了解,這對于程式設計可能沒有什麼直接的幫助,但是我想了解一下GPS的大緻工作原理,在程式設計過程中就能夠對GPS裝置的工作特性有一個感性的認識,這對于開發還是有很大間接好處的。
衛星授時原理:
北鬥和GPS的原理基本一緻,出于種種考慮(你懂的),這裡說下GPS的授時原理。
GPS的星座由24顆衛星組成,不同的衛星配置設定不同的僞随機碼進行差別,衛星上一般都配有3-4台的原子鐘以進行時間保持,同時地面上的主要站還會将修正資料(包括衛星軌道,時間修正等)不定期發給衛星,以使24顆衛星之間保持時間同步。
由于GPS的星座經過精心設計,是以地球上絕大多數地方都可以同時看到最少4顆衛星。
同時使用者接收機有4個未知數(經度,緯度,高度,本地時間),通過解一個四元二次方程組即可求出接收機的坐标和時間,這樣就完成了一次定位和授時。
授時可以分為三步來完成:
1、有一個基準源:無論GPS和北鬥衛星上一般搭載原子鐘,老GPS是铯鐘,部分新星是铷鐘。鐘的頻率考慮了相對論效應,保證衛星距離引力場的距離和高速運動帶來的相對論效應下依然能達到設計頻率,做法是假設要産生精确10.23Mhz,實際調校的頻率是比這個差一點點的,剛好抵消掉相對論效應。有了這樣精确的時鐘,加上地面站的不斷校正,GPS會在自己的電文中播發一個GPS時間,播發這個時間的幀的第一個bit的邊沿是和這個時間值嚴格對應的。比如播發的時間是1445s(指從這一周開始經過的秒數,稱周内秒),那麼這一幀的第一個bit反轉的邊沿就應該剛好從這個時刻從天線出去。這樣通過測量這個反轉沿,可以在本地恢複出一個精确的秒的變化邊沿,這個邊沿是與發射時刻同步的,而接收機要授時是要獲得精确的本地時間,那麼剩下的就是計算信号從天線傳播到接收機經過的時間了。
2、知道自己與基準的差:這一步比較複雜,基本實作方法是通過解方程的方式完成,通過設一個本地與衛星原子鐘差的未知數Δt。這一步和定位是一起完成的,也就是說定位精度越高,其授時精度理論上也應該越高。基本定位方法是通過對衛星信号中播發的C/A碼進行觀測,計算接收機與至少4顆衛星的距離(這個距離就是前面各位說的僞距,它并不是真實的距離,實際上應該是真實距離加上光速乘以之前設的未知數Δt,是以接下來可以列方程求出它)。然後是根據衛星播發的電文中的軌道參數,計算出能看到的每一顆衛星的具體位置。然後再設接收機坐标xyz三個未知數,連立4個三維空間求距離的方程,左邊是xyz與衛星的距離,右邊是僞距加上c*Δt,這樣就可以解出xyz和Δt了。由于僞距觀測量會有誤差,是以定位和授時會有誤差,是以GPS的定位精度是有上限的,除非使用載波測量的方式可以極大提高精度,這個就不說了....
3、算個加減法:獲得了2裡面的時間差Δt之後,和1裡面的秒反轉沿進行加減運算即可獲得精确的GPS時間,然後根據GPS和UTC時間的變換關系就可以獲得精确的UTC時間。