1. 程式人生 > >地圖定位技術揭祕(二)

地圖定位技術揭祕(二)

GPS定位實現原理解析

什麼是GPS定位?

我們手機上的GPS定位,是衛星定位的一種約定俗成的說法,嚴格來說應該叫做GNSS(GlobalNavigation Satellite System)定位。因為GPS確實只是GNSS的一種,是美國部署的一套全球衛星系統。這套系統給個簡單的描述,就是

  1. 天上有24顆衛星在不斷的繞地球運動(下圖左),
  2. 每顆衛星不斷髮送“我是誰,我在哪裡”的訊號
  3. 接收機(比如手機GPS晶片)收到了多顆衛星發出的這樣的訊號,根據訊號傳播時間推算出離衛星的距離,進而解出了接收機自己的位置,順便可以得到當前準確時間(下圖右)。

關於GPS的基本原理問答

如果對這個原理稍微琢磨一下,就很容易出現不可理解之處,比如:
有人問,為什麼能保證每時每刻都能定位呢?如果天上就兩顆衛星,又如何唯一解算出裝置位置?這就是天上為什麼部署24顆衛星的原因,這種部署方式就可以保證無論何時天空中都能接收到>=4顆衛星的訊號。
有人問,求解3D座標只要三顆衛星就夠了,為什麼要四顆呢?問題就在於接收機(手機)的時鐘和衛星的時鐘是存在時間差的,我們需要解算出這兩個時鐘的真正時間差,否則便無法算出傳播時間,也無法根據傳播時間來反算傳播距離,最終便無法定位。也就是說,我們要解的未知數,不是三個,而是四個。
有人問,既然衛星訊號在衛星定位成功後,每秒都會定位一次,這足以說明訊號傳播是沒有障礙的,那麼為什麼要花這麼長的時間來搜星?這是個好問題,不過這個問題很複雜,一言蔽之就是最主要的時間用在了“等待電文”上,所謂電文就是衛星用來迴圈播報當前位置的訊號(這裡澄清下,衛星並不是如我們想的這樣,每秒播報一次當前的位置,而是時刻傳送連續迴圈的訊號,要不然也不會有接收機能實現每秒幾十次GPS定位了),這個訊號播報週期為30秒,從而GPS的冷啟動一般來說,至少要30秒才能完成。
有人問,為什麼在汽車的導航上看到GPS的軌跡運動非常連續平滑,而手機上卻是每秒跳一次,手機能否每秒定位n多次?這個要分兩方面說,第一這個肯定是可以做到的,因為GPS衛星發射的訊號是連續的,他不是每秒廣播一個衛星位置,而是傳輸一個軌道引數,基於這個資訊,就可以重構衛星的完整飛行軌跡,從而只要接收方願意,它可以做到每秒解算幾十次位置;第二從目前來看手機GPS模組因為成本和收益的折衷,設計成每秒定位一次,基本也是夠用的。當然,作為一個完美主義的手機app開發者,你如果真的反感每秒跳動的位置,也可以基於每秒一次的位置,用濾波來進行平滑推算,使得視覺效果非常平滑,這樣看上去也就能以假亂真了。

中國的北斗是怎麼回事?

先丟擲一個常見的問題,既然說GPS總共24顆星,那麼按道理地球某個半球最多也就能接收到12顆衛星(比如東半球的接收機,不可能接收到正在西半球天空中的衛星發射過來的訊號),但是看看GPS軟體的截圖(IOS沒有,Android可以用GPS Test之類的)就會發現,可見衛星遠大於10顆,這是為什麼?

上圖中,可見22顆衛星,鎖定使用了20顆衛星,左面的國旗揭露了奧祕,是的,現在手機的所謂GPS接收模組中,很多都擁有多種衛星的接收能力,實際可用的衛星主要是三種:GPS、格洛納斯、北斗。多個衛星系統共同定位,產生比單一GPS更好的定位效果。
如何確定你的手機支援哪些衛星呢?作為一個使用者,可以直接下載GPS軟體來看國旗的顏色來大致瞭解,作為一個開發者,可以獲取GPS的衛星偽隨機碼作為編號,具體可參看Android中關於GPSStatus類的描述。
之所以多套衛星定位系統存在的原因,要從部署衛星定位系統的初衷說起。一個國家部署衛星定位系統,主要目的是為了在作戰中,能精確定位,便於精確排程進行打擊。當然在平年代(比如說當代中國),這種衛星系統更普遍地出現在民用領域,如車載導航儀等。
那麼就會有人問,既然這樣,為什麼要另起爐灶,部署那麼多套呢?比如中國為什麼不沿用GPS,而要花大量人力做一套北斗系統呢?原因就是GPS衛星的部署者(美國軍方)是可以對訊號設定干擾的,一旦干擾產生,普通的接收機便無法正確定位,而美國由於知道具體的干擾加密策略,它可以無損解密,依然正常定位。從技術角度說,形成GPS壟斷難度並不大(當然這樣也確實非常損人品),這樣的後果卻是很不可想象的——首先對中國主權構成很大的威脅,其次各行各業的正常生產也都會受到極大的影響。因此,一個有實力的國家,都應該有一套屬於自己的衛星導航系統。
自從2000年中國發射了第一個北斗導航衛星至今,已經有17顆衛星在天空中默默地提供定位服務,目前北斗只能在亞太地區提供區域性的定位能力,當所有35顆衛星都發射完畢後,就可以提供全球範圍的定位服務,屆時北斗系統的定位能力便可正式比肩GPS。

關於GPS搜星的速度討論

剛才說到GPS定位慢,這個確實不假。接下來我們細緻的討論下,為什麼慢,以及在手機裡是如何解決這個問題的。
搜星時間長,主要是兩個因素構成的:第一是GPS訊號的解調,可以認為需要用類似窮舉的方式解出來真正的資訊;第二是GPS衛星傳送30秒一次的迴圈電文,這個迴圈電文已經包含了這段時間每一瞬間的衛星位置,一般總得一個迴圈完成後,才能收集到足夠可以推算裝置位置的資訊。對於冷啟動來說,後者是免不了的,前者則取決於接收機軟硬體的優劣,這就是所謂GPS在沒有任何知識的情況下啟動至少要持續30秒的原因。
但實際上,有時候開啟地圖軟體,都是看到瞬間定位,而有時候則可能幾分鐘乃至幾十分鐘都無法定位成功,這又是為什麼?

你看到地圖app定位成功,不一定都是GPS定位

首先,wifi定位已經可以做到很不錯的精度,甚至在室內可以做到5M,這個精度已經不比GPS差了,在室外,wifi定位也可以做到20M量級,也就是比GPS稍稍差一些,在高樓林立的區域,wifi定位的精度會比GPS更好。
其次,在新版Android和市面上可見的IOS系統上,刻意遮蔽了“GPS是否定位成功”這麼一個資訊,表現為一旦使用定位,位置圖示即展現,並且不閃爍(老Android系統,會有閃爍來表達GPS沒有定位成功),以至於使用者無法知道到底這個定位結果是誰產生的。
我們之前的討論說起過,wifi定位,是可以瞬間完成的,所以這一切產生了“GPS”定位很快的錯覺。

衛星分佈狀態不一定允許快速定位


如果你在一個朝北的視窗,開始搜星,那麼衛星分佈很可能是這樣的,你會注意到,可見衛星都在樓的北側(南側的訊號都被樓本身給遮擋了),因此這些衛星的排列區域就非常有限,極端的情況下,衛星既少,訊號又弱,又是線性排列,GPS接收機就很難解算出一個高質量的位置,遠不如那些在空曠區域的定位速度快。
另外也要說明一點,有人會問,為什麼當時可見的有5顆乃至更多的衛星依然不能定位?這也是衛星分佈情況導致的,如果衛星訊號強度很弱(用專業術語就是信噪比很弱,這個在Android系統裡是可以得到的),或者儘管衛星很多,但是分佈形態不夠分散,那也會讓接收機很為難,如果沒有十足的把握,接收機是不會認為定位成功的。給出個幾百米誤差的定位結果(不過實際上手機GPS也經常幹出這種事情),豈不是自砸招牌嗎?

A-GPS等加速搜星措施的應用

我們經常聽說A-GPS這個概念,因為A-GPS需要網路運營商的參與,所以這個概念容易和網路定位混淆,其實A-GPS不是基站定位,基站定位只是其中的一個步驟,A-GPS最終的精度和普通定位精度是一樣的。只不過A-GPS可以從運營商這裡做粗略定位後,將其傳送給A-GPS伺服器下載當時的衛星資訊,以至於不用等待漫長的衛星軌道資訊廣播完畢後,才能知道衛星的位置。這樣即使是冷啟動,也能根據從網路傳回來(而不是從衛星廣播傳過來)的衛星引數來迅速參與位置計算。在使用者看來,搜星時間自然就大大縮短了。
但是這些加速措施,有時候並不好使,比如你在網上搜索gps.conf為關鍵字,有鋪天蓋地的帖子,大意就是root後改這個檔案,裡面有a-gps伺服器的配置,改後即“秒定”。這類帖子多,足以說明搜星慢是個很大的痛點,但仔細一看就會發現,搞a-gps幾乎沒有一個公認的辦法可以通殺。這又是為什麼?
問題在於三點,第一,A-GPS首先要運營商支援,使之至少可以按照標準協議,提供一個粗略定位結果,但運營商是否積極地支援呢?這個問題,留給讀者讀調研,你去看看中國運營商的主頁吧。
第二,A-GPS需要網路流量可用,可以連到a-gps定位伺服器上。這個基本沒問題。
第三,A-GPS的伺服器需要是可用,建議你看看gps.conf裡寫的a-gps伺服器到底是啥,是不是谷歌的伺服器呢?如果是的話,那麼a-gps在國內不可用也就可以理解了。
這就是一個系統的依賴太多導致不work的典型例子,於是乎,手機廠商自然對此是很不滿意的。隨著高通晶片的大面積鋪開,其主導的xtra輔助定位系統開始迅速流行,這個機制繞開了基站運營商,而是直接基於網路流量(3g、4g、wifi)從晶片廠商這裡得到衛星資訊。比如在搭載高通最近這些年方案的手機上(典型例子是三星Galaxy S5),利用xtra方案,確實可以實現冷啟動秒定,非常震撼。
出現這個後來者居上的局面,也是可以理解的,GPS能迅速定位,是手機和晶片的重要賣點(相比之下使用者不會因為運營商不支援A-GPS就放棄運營商),所以手機和晶片廠商自然就會全力以赴的想辦法解決這個問題。

GPS的痛點與機會:精度

如果要論GPS的問題,比較公認的是三個:第一是初始定位慢,但這個問題現在已經也好很多了,在輔助定位如xtra可用的機器上,GPS即使冷啟動也是很快的,第二是室內沒法用,但GPS原理就是那樣,你要指望在室內可用是不現實的,何況室內的wifi定位精度也不錯,所以這個問題也還可以忍受。第三是GPS在室外某些區域的精度比較差,尤其是高樓區域,有時候可能有幾百米的誤差,這就很讓人頭疼了。

GPS誤差產生的原因

GPS的誤差,通俗的說主要由兩種誤差造成,第一種是電離層和接收裝置的誤差,不過,這個誤差相對日產應用來說還不是那麼致命,因為在空曠區域下,用手機進行GPS定位,這樣的誤差基本都在10米以內。要改善這個誤差,需要改進手機的天線和晶片,比如雙頻差分GPS接收機,其精度就比普通手機GPS精度要高,結合北斗的衛星,可以做到一米以內,是不是非常厲害呢?不過話說回來,精度在5米之類的,也是不錯的,所以手機廠商解決這個問題的動力並不是太強。第二種誤差是遮擋、多徑效應產生的誤差,這個誤差才是真正致命的,可以達到幾百米,甚至上公里。
下圖是在上海陸家嘴金融貿易區某高樓下繞著高樓行走的真實軌跡(黃色)和GPS軌跡(綠色)的對比,是否讓你感到觸目驚心?

下圖是上海延安路高架下在靜安區的真實軌跡(黃色)和GPS軌跡(綠色)對比。

我相信你看到軌跡的第一反應,是不可思議,GPS怎麼會有這麼大的誤差呢?原因就是GPS接收機的測距機制導致的。下圖大致說明了這個問題:

圖中右面有個高樓,接收機(手機)收到的某衛星的訊號,實際由兩個分支構成,一部分是直射,一部分是發射到牆上再反射回來的衛星,GPS可能會被這樣的訊號所欺騙,甚至以為右面那部分訊號才是直射過來的訊號,於是就導致了它計算訊號傳播時間就錯了,最終定位發生很大偏差。

GPS能知道自己算錯了嗎?

GPS能知道自己算錯了嗎?

如果你是個開發者,就會知道,各種手機系統幾乎都提供對GPS定位獲取誤差的API介面,那麼GPS能知道自己算錯了嗎?它又是如何計算其誤差的呢?
答案很複雜,一句話沒法把這個問題說清楚,得分四種場景:

GPS定位實際誤差小,GPS認為自己誤差小:天空無遮擋,衛星分佈均勻,每顆衛星信噪比都很好,GPS選擇了形狀最飽滿、信噪比最高的幾顆衛星加以定位,因此其對定位誤差很有信心。

GPS定位實際誤差小,GPS認為自己誤差大:典型的是在較高的公共汽車和火車車廂裡,這種情形訊號強度很弱,但各顆衛星同等減弱,所以實際定位效果還可以,GPS卻認為這個信噪比不靠譜,對此無信心,因此給出很大的誤差半徑。
GPS定位實際誤差大,GPS認為自己誤差小:這是個嚴重誤判,主要出現在高樓區域(最典型的如CBD),這些區域其實訊號遮擋並不明顯,衛星數並不少,有時候還會非常多,但某些衛星通過光滑表面(玻璃高樓)反射到接收機,GPS接收機被欺騙,誤以為這個衛星發射過來的訊號是“單一直射”過來的,從而採納了這顆衛星的傳播時間用來定位,當多顆衛星存在這種情形,而且總衛星數非常多時,衛星分佈也非常飽滿,則GPS接收機就會樂觀過度,悲劇就此發生。
GPS定位實際誤差大,GPS認為自己誤差大:主要出現在明確遮擋的區域(最典型的如高架下),某些的訊號強度變得很差,從而接收機便不太信任這顆衛星。但身不由己,能用的衛星數太少,GPS接收機不得不用它來定位,所以衛星降低了對位置準確程度的預期,給出一個很大的半徑。

如何改善高樓區域的GPS定位精度?

筆者先給出結論,純粹靠端,並且把接收機當成黑盒,是無法做到的。
近年,學術界研究這玩意的Paper並不少,大致思路是兩類:
第一個思路,真是在端上做,但不把接收機當成黑盒,而深入修改定位邏輯,顯然開發者是做不了這個事情的。最多也只是極少數對驅動精通的人能做,app開發者是做不了的——試問Android和IOS開放了GPS接收機內部解算邏輯了嗎?沒有。其實這和radio內部是黑盒一樣的,你見過哪個開發者聲稱能改善手機拍照效能、改善音訊播放音質、改善訊號質量嗎?OS根本沒把基本功能的實現邏輯開放出來,怎麼改善?說能改善的都是耍流氓。
第二個思路,有可能能在手機上做,但paper一般基於樓的輪廓建立反射模型,舉個例子,附近不是有個樓嗎?這個樓多高,樓的地面輪廓是什麼,我們都知道了,然後就根據衛星的細節情況(如方位、仰角、信噪比、是否參與定位)來猜測某些衛星發射到手機的訊號,是不是會受到干擾,如果兩者連線穿過了樓,那麼我們就有理由認為,這個衛星訊號的傳播距離可能比實際的要長,從而我們就把定位結果朝這個衛星的位置做一些修正。
就第二個思路,要想做好也是很困難的,因為這個思路從原理上說,有很多想當然的前提。比如,當時使用者真實的位置並不知道,所以判斷是否有反射也就無從談起,只能將其作為隱變數來迭代求解。其他的坑也很多,如樓的資料從哪裡搞來?誰要說可以去人肉採集的,那我想先問一個問題,先不說樓高度如何測量,你在人肉測繪樓輪廓的時候,是不是也用GPS了?那你是如何保證當時樓輪廓的測量結果是準確的呢?
不過,判斷GPS是否真正的飄,這個比確定裝置在GPS漂移時的真正位置,還是要容易一些的。首先GPS本身就給個半徑出來,這個半徑雖然不準,但也可以作為參考。其次GPS還有大量的衛星分佈細節資訊,是足以結合雲端的統計結果來判斷是否漂移的。只要能識別出GPS定位的真正誤差,其意義就已經很大了,如在導航中,就會避免誤偏航,在定位中,就可以用WIFI定位結果來替代GPS,做到真正的雙向融合。不過,這個工作對開發者的模式識別功底,還是挺考驗的。