安卓GPS更新频率

7
我正在编写一个圈速计时应用,但遇到了GPS更新频率问题。当速度超过75公里/小时(21米/秒)时,我的代码停止工作。我的问题是如何请求更快速的更新?我需要它在高达300公里/小时(83米/秒)的速度下工作,并希望该应用程序每行驶几米就获得一次更新,这意味着它需要每0.025秒获得一次更新@ 300km/h。以下是我的代码,我尝试了另一种获取时间戳的代码,但结果相同,我相信这是一个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;
}

我在这个论坛上看了一些其他答案,但它们都是几年前的。这个应用程序需要在Galaxy S4及以上版本上工作。

另外,我对GPS频率有些困惑,从我读过的资料来看,GPS频率操作速度相当高(硬件大约为1.6 GHz),但手机操作系统似乎会将数据裁剪到较低的频率,这是故意的吗?

2个回答

4
消费者设备每秒更新一次gps位置,即每秒一个位置。 更高的速率(例如10 / s)没有太多意义。 位置可能不会变得更好,更有可能变得更差,但这是一次理论讨论,因为消费者GPS芯片通常不会提供比1或2赫兹更高的速率。
因此,请改变您的应用程序设计。 特别是在高速情况下,插值两个位置是安全的。
请记住,位置至少具有3-5m的圆形误差。 因此,您的圈速计时应用程序可能还会输出一个timingAccuracy值。 100公里/小时时,5m误差导致0.18s的定时精度。 您可以使用location.getHoricontalAccuracy()(或类似名称)来获取估计的位置误差。

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

4
不要将射频值(1.1-1.6GHz)与获取位置更新频率(1Hz)混淆。
你看过在精确时间间隔内获取GPS位置中的设备列表吗?即使它已经有几年了,我怀疑任何设备上的GPS都不会报告得更快(可能是由于电池噪声/使用案例设计等原因)。即使板载设备以10Hz或20Hz报告,这仍然比您所需的25ms慢,因为请记住,如果CPU正在与GPS通信和计算位置,则会消耗电池,这是移动设备的限制因素。
如果您希望获得一致的亚秒级GPS值更新,您需要使用外部设备。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接