Android GPS 更新频率
Android GPS update frequency
我正在编写单圈计时应用程序,但 运行 遇到了 GPS 更新频率问题。当速度超过 75km/h (21m/s) 时,我的代码停止工作。我的问题是如何以更快的速度请求更新?我需要它以高达 300 公里/小时(83 米/秒)的速度工作,并且希望该应用程序每行驶几米就获得更新,这意味着它需要在 300 公里/小时时每 0.025 秒更新一次。下面是我的代码,我尝试了一个替代代码来获取时间戳但得到了相同的结果,我相信这是 GPS 更新频率问题而不是代码问题。我想以 300 公里/小时的速度每隔几米更新一次,以防 phone 通过切线的接近半径。
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),但 phones 操作系统似乎将数据剔除到较低的频率,这是故意的吗?
不要混淆无线电频率值 (1.1-1.6GHz) 和您获得位置更新的频率 (1Hz)。
你看到设备列表了吗:Get GPS position on a precise time interval?尽管它已有几年历史,但我怀疑任何设备上的 GPS 报告速度是否会更快(可能是由于 battery/noise/use 案例设计)。即使机载设备以 10Hz 或 20Hz 的频率报告,也只有 100ms 或 50ms,这仍然比您要求的 25ms 慢。请记住,如果 CPU 正在与 GPS 通信并计算位置 - 它正在消耗电池,这是移动设备上的限制因素。
如果您想要一致的亚秒级 GPS 值更新,您需要使用外部设备。
消费类设备以 1hz 的速率更新 GPS 位置,因此每秒一个位置。
更高的速率,例如 10 / s 没有多大意义。
位置不会变得更好,更有可能变得更糟,但这是理论上的讨论,因为消费类 GPS 芯片通常不会提供高于 1 或 2 赫兹的速率。
所以只需更改您的应用程序设计即可。
特别是在高速下,在两个位置之间进行插值是省事的。
请记住,位置至少有 3-5 米的圆周误差。
因此,您的单圈计时应用程序可能会额外输出一个计时准确度值。
100km/h 时的 5m 误差导致计时精度为 0.18s。
您可以使用 location.getHoricontalAccuracy()
(或类似名称)
获得估计的位置误差
我正在编写单圈计时应用程序,但 运行 遇到了 GPS 更新频率问题。当速度超过 75km/h (21m/s) 时,我的代码停止工作。我的问题是如何以更快的速度请求更新?我需要它以高达 300 公里/小时(83 米/秒)的速度工作,并且希望该应用程序每行驶几米就获得更新,这意味着它需要在 300 公里/小时时每 0.025 秒更新一次。下面是我的代码,我尝试了一个替代代码来获取时间戳但得到了相同的结果,我相信这是 GPS 更新频率问题而不是代码问题。我想以 300 公里/小时的速度每隔几米更新一次,以防 phone 通过切线的接近半径。
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),但 phones 操作系统似乎将数据剔除到较低的频率,这是故意的吗?
不要混淆无线电频率值 (1.1-1.6GHz) 和您获得位置更新的频率 (1Hz)。
你看到设备列表了吗:Get GPS position on a precise time interval?尽管它已有几年历史,但我怀疑任何设备上的 GPS 报告速度是否会更快(可能是由于 battery/noise/use 案例设计)。即使机载设备以 10Hz 或 20Hz 的频率报告,也只有 100ms 或 50ms,这仍然比您要求的 25ms 慢。请记住,如果 CPU 正在与 GPS 通信并计算位置 - 它正在消耗电池,这是移动设备上的限制因素。
如果您想要一致的亚秒级 GPS 值更新,您需要使用外部设备。
消费类设备以 1hz 的速率更新 GPS 位置,因此每秒一个位置。
更高的速率,例如 10 / s 没有多大意义。
位置不会变得更好,更有可能变得更糟,但这是理论上的讨论,因为消费类 GPS 芯片通常不会提供高于 1 或 2 赫兹的速率。
所以只需更改您的应用程序设计即可。 特别是在高速下,在两个位置之间进行插值是省事的。
请记住,位置至少有 3-5 米的圆周误差。
因此,您的单圈计时应用程序可能会额外输出一个计时准确度值。
100km/h 时的 5m 误差导致计时精度为 0.18s。
您可以使用 location.getHoricontalAccuracy()
(或类似名称)