【问题标题】:Android GPS update frequencyAndroid GPS 更新频率
【发布时间】:2015-07-21 03:43:53
【问题描述】:

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

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),但手机操作系统似乎将数据剔除到更低频率,这是故意的吗?

【问题讨论】:

    标签: java android gps


    【解决方案1】:

    不要将射频值 (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 hz 的速率。

      因此,只需更改您的应用程序设计即可。 尤其是在高速时,可以节省在两个位置之间进行插值。

      请记住,该位置至少有 3-5m 的圆形误差。 因此,您的单圈计时应用程序可能会额外输出一个计时精度值。 100km/h 的 5m 误差导致计时精度为 0.18s。 您可以使用location.getHoricontalAccuracy()(或类似名称)获得估计的位置误差

      【讨论】:

      • 感谢您的回复。我通过计算上次位置更新、速度和加速度的时间位移来解决了这个问题。已测试该应用程序,现在运行良好。
      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多