检测GpsSatellite.getAzimuth()和getElevation()中的伪值

时间:2014-01-12 22:35:07

标签: android

我是SatStat和Android应用程序的作者,其中包括在天空图中显示可见的GPS卫星。

在某些情况下,应用程序将以方位角和高度为零(或几乎为零)显示所有可见卫星,表明Android API正在返回虚假值。

如何过滤掉这些值并仅显示好的值?

示例截图位于https://f.cloud.github.com/assets/16572/1146040/ebc2e032-1e40-11e3-8232-905c1d9c8505.png(截图来自应用程序的旧版本,但错误仍然相同)。

相关代码(简化)是:

public class MainActivity implements GpsStatus.Listener {
    // [...]

    public void onGpsStatusChanged (int event) {
        GpsStatus status = mLocationManager.getGpsStatus(null);
        Iterable<GpsSatellite> sats = status.getSatellites();
        gpsStatusView.showSats(sats);
    }
}

只要方位角和高程都接近零,showSats()方法就会生成logcat事件。

我在GPS启动后没有数据连接时再次遇到这种情况,表明该问题可能是由于GPS接收到信号的卫星丢失或不完整的轨道数据引起的。然而,另一次我遇到这个问题只是刷新AGPS数据(使用SatStat 1.7,它在请求更新之前检查网络连接),因此我应该有时间有效的AGPS数据。

在这两种情况下,logcat都有很多这样的条目:

12-27 22:34:37.761 D/GpsStatusView( 1403): Satellite 12, snr=33.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.761 D/GpsStatusView( 1403): Satellite 15, snr=35.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.765 D/GpsStatusView( 1403): Satellite 17, snr=29.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.765 D/GpsStatusView( 1403): Satellite 26, snr=33.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false

有四颗卫星,全部方位角为零度,海拔高度为1度,没有历书,没有星历,也未用于修复。 (在上面链接的屏幕截图中,API会在视图中报告两个卫星并且都在修复中使用,这本身就很奇怪。)

所以我可以排除我的应用程序中的绘图错误 - 似乎Android API正在返回方位角和高程的伪造信息。显然,当卫星的轨道数据不可用时会发生这种情况。但是,我不知道在这种情况下Android是否使用固定的方位角/仰角组合,以及是否可以假设这些值在各设备之间保持一致。

关于如何检测方位角和仰角是否可靠的任何想法?有些错误是可以接受的,但我想过滤掉完整的虚假值。我放弃的想法:

  • 丢弃方位角和海拔高度恰好为零的卫星 - 由于虚假值接近于零但未精确为零(在上述情况下,报告的海拔高度为1°),此失败。
  • 检查hasAlmanac()hasEphemeris() - 即使在修复中使用过的sats(也可能在我的设备上)都设置为false,尽管有效数据仍留有空天图
  • 检查具有完全相同的方位角和仰角的两颗卫星 - 虽然我相信这样的星座是伪造数据的确定标志,如果只有一颗卫星在视野中,或者如果只有一颗卫星报告虚假,它将会失败数据,或每个卫星有不同的虚假数据。

0 个答案:

没有答案