2015-07-21 508 views
4

我正在写圈计时应用程序,但遇到了GPS更新频率问题。在速度大于75km/h(21m/s)时,我的代码停止工作。我的问题是如何以更快的速度请求更新?我需要它以高达300km/h(83m/s)的速度工作,并希望应用程序每行驶几米就能获得更新,这意味着它需要每0.025秒@ 300km/h更新一次。下面是我的代码,我尝试了一个替代代码来获取时间戳,但得到了相同的结果,我相信这是一个GPS更新频率问题,而不是代码问题。我希望每隔300米每小时更新一次,以防电话通过切线上的接近半径。Android GPS更新频率

int prox = 30;  // Proximity Switch To Finish Line = 30 meters 
int speedGov = 0; // Speed In Kmh 

public void OnProviderDisabled(string provider) 
{ 
} 

public void OnProviderEnabled(string provider) 
{ 
} 

public void OnStatusChanged(string provider, Availability status, Bundle extras) 
{ 
} 

protected override void OnResume() 
{ 
    this.InitializeLocationManager(); 
    base.OnResume(); 
    _locationManager.RequestLocationUpdates(_locationProvider, 0, 0, this); 
} 

void InitializeLocationManager() 
{ 
    _locationManager = (LocationManager)GetSystemService(LocationService); 
    Criteria criteriaForLocationService = new Criteria 
    { 
     Accuracy = Accuracy.Fine 
    }; 
    IList<string> acceptableLocationProviders =  _locationManager.GetProviders(criteriaForLocationService, true); 
    if (acceptableLocationProviders.Any()) 
    { 
     _locationProvider = acceptableLocationProviders.First(); 
    } 
    else 
    { 
     _locationProvider = String.Empty; 
    } 
} 

public void OnLocationChanged(Location location) 
{ 
    _currentLocation = location; 
    if (_currentLocation == null) 
    { 
    } 
    else 
    { 
     d2fl = Convert.ToInt32(_currentLocation.DistanceTo(fl)); 
     speedGov = Convert.ToInt32(_currentLocation.Speed * 3.6); 
    } 
} 

int A = 0;  // 1st Distance to Finish Line 
int B = 1000000; // 2nd Distance to Finish Line 

// Get Time Stamp 
while (true) 
{ 
    A = d2fl; 
    if (A > B && d2fl < prox && speedGov > 2) // Travelling away from Finish Line & Within 30m proximity to Finish Line & Going faster than 2km/h 
    { 
     // Time stamp for when phone first starts travelling away from Finish Line 
     string hours = DateTime.Now.ToString("HH"); 
     string minutes = DateTime.Now.ToString("mm"); 
     string seconds = DateTime.Now.ToString("ss"); 
     string milliseconds = DateTime.Now.ToString("fff"); 
     lapFinishTimeStamp = (Convert.ToDecimal(hours) * 3600) + (Convert.ToDecimal(minutes) * 60) + Convert.ToDecimal(seconds) + (Convert.ToDecimal(milliseconds)/1000); 
     A = 0; 
     B = 1000000; 
     break; 
    } 
    B = A; 
} 

// Alternate Get Time Stamp - worked the same as above "Get Time Stamp" 
while (true) 
{ 
    int A = d2fl; 
    Thread.Sleep(5); 
    int B = d2fl; 
    if (A < B && d2fl < prox && speedGov > 2) 
    { 
     string hours = DateTime.Now.ToString("HH"); 
     string minutes = DateTime.Now.ToString("mm"); 
     string seconds = DateTime.Now.ToString("ss"); 
     string milliseconds = DateTime.Now.ToString("fff"); 
     lapFinishTimeStamp = (Convert.ToDecimal(hours) * 3600) +  (Convert.ToDecimal(minutes) * 60) + Convert.ToDecimal(seconds) + (Convert.ToDecimal(milliseconds)/1000); 
     A = 0; 
     B = 0; 
     break; 
     } 
    A = 0; 
    B = 0; 
} 

读过这个论坛上一些其他的anwsers但几年的历史。这个应用程序将需要在Galaxy S4上工作。

另外我对GPS频率有点困惑,从我读过的GPS频率以相当高的速度工作(硬件约为1.6 GHz),但手机操作系统似乎将数据剔除为频率较低,这是故意的吗?

回答

2

不要混淆射频频率值(1.1-1.6GHz)与你将获得位置更新频率(1Hz)的频率。

您看过设备列表:Get GPS position on a precise time interval?尽管它几年前,我怀疑任何设备上的GPS都会报告更快(可能是由于电池/噪音/用例设计)。即使车载设备以10Hz或20Hz报告,仅为100ms或50ms,仍然比25ms的要求慢。请记住,如果CPU正在与GPS通话并计算位置 - 它正在吃电池,这是移动设备上的限制因素。

如果您想要一致的亚秒级GPS值更新,您需要使用外部设备。

2

消费类设备以1hz的速率更新gps位置,因此每秒钟只有一个位置。
例如10/s的较高比率没有多大意义。
职位不会变得更好,他们更可能变得更糟,但是这是一个理论上的讨论,因为消费者的GPS芯片通常不会提供比1或2赫兹更高的速率。

所以只要改变你的应用程序设计。 特别是在高速度下,它可以保存在两个位置之间插入。

请记住,该位置有一个至少3-5米的圆形误差。 因此,您的膝部时间应用程序,migght插件输出一个timingAccuracy值。 在100km/h时5m误差导致0.18s的定时精度。 您可以通过location.getHoricontalAccuracy()(或相似的名字)得到估计的位置误差

+0

感谢您的答复。我通过计算上次位置更新的时间位移,速度和加速度来解决问题。已经测试了应用程序,现在它运行得非常好。 – Kringle