GPS衛星星歷與歷書
GPS 衛星發送的導航信息是每秒50位的連續的數據流,在此我們稱之為導航電文,每顆衛星都同時向地面發送以下信息:
系統時間和時鍾校正值、自身精確的軌道數據(星歷,ephemeris) 其他衛星的近似軌道信息(歷書,almanac) 系統運行狀況。
1.GPS衛星星歷:
衛星軌道信息或某一時刻軌道參數及其變率或某一時刻衛星位置及其變化率。
分為預報星歷(又叫廣播星歷)和后處理星歷(精密星歷)。
——GPS廣播星歷:包括某一參考歷元的軌道及其攝動改正項參數。共有16個參數。用C/A碼傳送的星歷叫C/A碼星歷,精度為數十米。
——后處理星歷:用P碼傳送的星歷叫P碼星歷,叫做精密P碼星歷,精度為5米。用於軍事目的。大部分用戶得不到。一些國家某些部門根據各自跟蹤衛星的精密觀測資料來計算出的星歷。事后提供給用戶。
2.GPS衛星歷書:
GPS衛星的歷書(Almanac)包含在導航電文的第四和第五子楨中,可以看作是衛星星歷參數的簡化子集。其每12.5分鍾廣播一次,壽命為一周,可延長至6個月。GPS衛星歷書用於計算任意時刻天空中任意衛星的概略位置。其主要用途:
★ 使衛星的碼搜索有的放矢,避免“滿天搜星”
GPS信號是一個CDMA(碼分多址)信號,一般來說,GPS接收機對衛星信號的搜索是一個“滿天搜星”的過程,即要搜索天空中的所有衛星對應的偽隨機碼。如果預先知道任意時刻所有衛星的概略位置,接收機就可以只復現本時刻天空中存在衛星的偽隨機碼進行搜索。這樣可以使GPS接收機在搜索衛星時做到有的放矢,縮短捕獲衛星信號的時間。
★ 找到任意衛星的概略Doppler頻移,輔助頻域搜索
對CDMA信號的搜索過程是一個二維搜索過程,對GPS衛星信號的搜索也不例外。即不僅要對衛星進行碼搜索,還要通過頻域搜索確定該衛星的Doppler頻移。通過歷書計算出衛星的概略位置,就可以估算出衛星的概略Doppler頻移,快速捕獲衛星信號。
GPS接收機的啟動時間是衡量接收機性能好壞的重要參數之一,而衛星信號的快速捕獲,縮短接收機的啟動時間也是目前GNSS業界的熱點問題。
★ 歷書(Almanac)數據中各變量含義:
ID: 衛星的PRN號,范圍為1—31
Health: 衛星健康狀況,零為信號可用,非零為信號不可用
Eccentricity: 軌道偏心率
Time of Applicability(s): 歷書的基准時間
Orbital Inclination(rad): 軌道傾角
Rate of Right Ascen(r/s): 升交點赤經變化率
SQRT(A) (m 1/2): 軌道長半軸的平方根
Right Ascen at Week(rad): 升交點赤經
Argument of Perigee(rad): 近地點俯角
Mean Anom(rad): 平均近點角
Af0(s): 衛星時鍾校正參數(鍾差)
Af1(s/s): 衛星時鍾校正參數(鍾速)
week: GPS周數
3.歷書(Almanac)和星歷(Ephemeris)有什么區別
GPS接收機接收到廣播星歷(Broadcast Ephemeris)與歷書(Almanac)兩種導航信息。廣播星歷包含基本軌道參數及攝動改正量,由其確定的衛星位置精度高,可用於定位計算。歷書僅提供基本軌道參數,精度低,可用於接收機快速捕捉衛星和預報。
為了縮短衛星鎖定時間,GPS接收機要利用歷書、當地位置的時間來預報衛星運行狀態。歷書與星歷都是表示衛星運行的參數。
歷書包括全部衛星的大概位置,用於衛星預報;
利用歷書和當地的位置, 我們可以計算出衛星的方位和高度角,由此可以計算出當地能觀測到的衛星和持續時間,即衛星高度角大於5°的出現時間。
星歷只是當前接收機觀測到的衛星的精確位置,用於定位。
GPS衛星星歷參數包含在導航電文的第二和第三子幀中。從有效的星歷中,我們可解得衛星的較准確位置和速度,從而用於接收機定位和測速。GPS衛星歷書每30秒重復一次,有效期為以星歷參考時間為中心的4小時內。
Android校准GPS:
-
開始啟用內置gps時,通過
LocationManager.addGpsStatusListener()
api,監聽gps狀態,在監聽的回調中計算衛星數量,代碼:mGpsStatusCallback = new GpsStatus.Listener() { @Override public void onGpsStatusChanged(int event) { if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) { //衛星狀態改變 fetchCurGpsStatus(); } } }; mService = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); mService.addGpsStatusListener(mGpsStatusCallback);
-
注冊監聽永遠要記得在不再需要時解除監聽,當關閉內置gps時,移除監聽:
mService.removeGpsStatusListener(mGpsStatusCallback);
-
衛星狀態改變時,首先獲取
GpsStatus
,通過如下方式處理:1,通過
GpsStatus
獲取到衛星對象(GpsSatellite
)列表,包含了當前能搜到的所有衛星;2,
GpsSatellite
對象中有mUsedInFix
字段標記其是否是參與定位校准。遍歷上述列表,統計已校准的衛星數fixedSatellites
,發布消息,通知衛星數量改變;3,基於3衛星定位的最低要求,判斷fixedSatellites是否是3顆以上,如果不是,那么認為當前定位失敗。
大致代碼如下:
private void fetchCurGpsStatus() { GpsStatus mStatus = mService.getGpsStatus(null); //獲取衛星顆數的默認最大值 int maxSatellites = mStatus.getMaxSatellites(); //創建一個迭代器保存所有衛星 Iterator<GpsSatellite> iters = mStatus.getSatellites().iterator(); //衛星數 int count = 0; if (iters != null) { while (iters.hasNext() && count <= maxSatellites) { GpsSatellite s = iters.next(); if (s.usedInFix()) { count++; } } } if (count < 3) { //定位失敗 } else { //定位成功 } }
作者:Android澤光
鏈接:https://www.jianshu.com/p/6a1266e42cab
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。