「Android」GPS卫星星历与历书

GPS卫星星历与历书

1、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状态,在监听的回调中计算卫星数量,代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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时,移除监听:

    1
    mService.removeGpsStatusListener(mGpsStatusCallback);
  • 卫星状态改变时,首先获取GpsStatus,通过如下方式处理:

    1,通过GpsStatus获取到卫星对象(GpsSatellite)列表,包含了当前能搜到的所有卫星;

    2,GpsSatellite对象中有mUsedInFix字段标记其是否是参与定位校准。遍历上述列表,统计已校准的卫星数fixedSatellites,发布消息,通知卫星数量改变;

    3,基于3卫星定位的最低要求,判断fixedSatellites是否是3颗以上,如果不是,那么认为当前定位失败。

    大致代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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」GPS卫星星历与历书
https://www.tohmm.cn/20200411/A-Android-GPS定位-星历与历书/
作者
H.mm
发布于
2020年4月11日
许可协议