【问题标题】:Get GPS position on a precise time interval在精确的时间间隔内获取 GPS 位置
【发布时间】:2013-03-25 21:45:06
【问题描述】:

我试图在不同的间隔范围内尽可能精确地获得 gps 位置,我几乎没有外部 gps,10hz、5hz 和 1hz

    LocationManager locationManager = (LocationManager) 
car.this.getSystemService(car.this.LOCATION_SERVICE);

    LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                    // Called when a new location is found

                }
                public void onStatusChanged(String provider, int status, Bundle extras) {}

                public void onProviderEnabled(String provider) {}

                public void onProviderDisabled(String provider) {}
            };

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
locationListener);

通过这种方式,我可以在匀速行驶时获得这样的日志更新

10hz GPS

81ms  new position
79ms  new position
88ms  new position
96ms  new position
196ms new positon
60ms  new positon
256ms new position
70ms  new position

5 hz GPS

187ms new...
189ms ..
275ms ..
140ms ..
180ms ..
220ms ..

所以我认为 onStatusChanged 最初比标称频率快,但随后饱和并导致大跳跃

如果我使用计时器,它工作得很好,我每 100 毫秒(200 或 1000)获得一次位置,但计时器每 10 秒关闭大约 100 毫秒

编辑:为了澄清,我想在每个精确(或接近)100ms、200ms 或 1000ms 时获得一个位置

**12-04-13 更新

在重做我的代码以使用 location.getTime() 后,这是结果,所有测试均在外部进行,以中/高速进行,并在 10 分钟内为每个设备进行记录

HTC Sensation Z710e 4.0.3 Internal GPS 1HZ

Average Accuracy: 12.1m       
Average intertval: 1186ms
Min: 98ms
Max: 2621ms


HTC Desire HD 4.0.4 Internal GPS 1HZ

Average Accuracy: 10.6m        
Average intertval: 1211ms
Min: 144ms
Max: 2588ms


ASUS Transformer TF101 4.0.4 Internal GPS 1HZ

Average Accuracy: 18.15m       
Average intertval: 1000MS
Min: 1000ms
Max: 1000ms


SAMSUNG NOTE II GT-N7100 4.1.2 Internal GPS 1HZ (Glonass)

Average Accuracy: 6.8m          
Average intertval: 1000MS
Min: 1000ms
Max: 1001ms


SAMSUNG, HTC OR ASUS  with external GPS 5HZ

Average Accuracy: 2.2m  
Average intertval: 200MS
Min: 200ms
Max: 200ms


SAMSUNG, HTC OR ASUS  with external GPS 10HZ (Glonass)

Average Accuracy: 1.6m    
Average intertval: 100MS
Min: 100ms
Max: 100ms

【问题讨论】:

  • API 让您能够指定在收到下一次更新之前必须经过的最短时间和最短距离。但是,它不能让您指定接收 GPS 更新的时间间隔。

标签: java android timer gps refresh


【解决方案1】:

收到位置时不要查看(系统)时间戳,查看位置本身的时间戳,如果通过 GPS 传递,则应该正好是 1000 毫秒(1/hz)。

Gps 接收器从不发送奇数毫秒,当使用 1hz 时,它们正好是 1000 毫秒。 使用 location.getTime(),看看你自己。

【讨论】:

  • 是的!我正在寻找 currentTimeMillis() 来知道经过的时间,这就是问题所在,非常感谢
  • 我通过外部 5 和 10 hz gps 获得精确间隔 (1s / hz),但是,对于内部 1hz gps,有时我得到 1s 精确间隔,有时我得到 0.6s 和 1.3s 之间的间隔,我无法检测到是哪个导致间隔不稳定,可能是准确度?
  • 如果它来自 GPS,它们不应改变、检查外部或将位置限制为仅 GPS。如果你仍然得到变化,那么 GPS 的实施在(那个)android 手机上做得不好。
  • 我正在使用 LocationManager.GPS_PROVIDER,所以只锁定到 gps,我在外面尝试过,大约 8 米的精度,我在 HTC DESIRE HD 和 HTC SENSATION 上都尝试过,两者都有疯狂/随机的间隔
  • 这听起来很糟糕,我一生中只听说过一个案例,这种偏差的时间戳。尝试与其他人核实,并在此处发布您的发现。
【解决方案2】:

在虚拟化的多线程应用程序中不存在精确的时间间隔。无论您是否使用计时器,当操作系统开始运行您的线程时,您都会收到通知。

【讨论】:

  • 你能扩展你的评论吗?
  • 您的操作系统正在运行一个线程,然后它切换到运行另一个线程。其中一个线程正在运行代码以检查时钟是否满足特定时间间隔。如果该计时器线程在您的应用程序运行的整个过程中都在运行,那么它将在时间过去后立即通知您。但事实并非如此。相反,操作系统不时运行计时器线程,每次运行时,它都会检查时钟,然后重新进入睡眠状态。您无法强制它在时间段过去的确切时刻运行。很可能另一个线程正在运行。
  • 我想说的是,你需要接受你只能如此接近理想的轮询间隔。
  • 那么做间隔的最好/准确的方法是什么?顺便说一句很好的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多