我无法根据 GPS 位置数据计算出合适的速度。我将 Xamarin Forms 与 Xamarin Essensials 结合使用。这允许跨平台位置数据。
收集数据的方法是轮询方法,但我认为这应该不是问题。
我尝试了几种基于纬度/经度值计算距离的例程,它们都给出了相同的结果,所以我也不认为这是问题所在。
我确实会等到我的准确度值至少达到 10 米,而且大部分时间我都会得到 5 米的准确度。
这是我使用的距离计算:
public static double GetDistance(Location point1, Location point2)
{
double Lat = (point2.Latitude - point1.Latitude) * (Math.PI / 180);
double Lon = (point2.Longitude - point1.Longitude) * (Math.PI / 180);
double a = Math.Sin(Lat / 2) * Math.Sin(Lat / 2) + Math.Cos(point1.Latitude * (Math.PI / 180)) * Math.Cos(point2.Latitude * (Math.PI / 180)) * Math.Sin(Lon / 2) * Math.Sin(Lon / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
double distance = 6376500.0 * c;
return distance;
}
即使我似乎获得了良好的数据,结果速度也与我实际看到的不太接近。我带着 2 部 iPhone 走路。一种是使用应用商店中的 GPS 测速应用。它通常显示在 1 到 3 MPH 之间。
我的应用大部分时间都显示 0,然后它会突然显示 14 或 23 或 2 或 6。它似乎到处弹跳。
这是我计算一切的代码:
private static Location _previousLatLng;
private static double _previousSpeed;
private static List<double> _speedList;
public static double Speed(Location newLatLng, out double distance, out double time)
{
if (_speedList == null)
_speedList = new List<double>();
distance = time = 0;
if (_previousLatLng == null)
{
_previousLatLng = newLatLng;
return 0;
}
distance = GetDistance(_previousLatLng, newLatLng);
time = (newLatLng.Timestamp - _previousLatLng.Timestamp).TotalSeconds;
_previousLatLng = newLatLng;
if (time == 0)
return _previousSpeed;
_previousSpeed = (distance / time) * 2.237;
_previousSpeed = Math.Round(_previousSpeed, 0);
if (_speedList.Count > 0)
{
double average = _speedList.Average();
if (Math.Abs(_previousSpeed - average) < (1 + (average * 0.1)))
{
_speedList.Add(_previousSpeed);
if (_speedList.Count > 10)
_speedList.RemoveAt(0);
_previousSpeed = _speedList.Average();
}
}
else
_speedList.Add(_previousSpeed);
return _previousSpeed;
}
我是这样称呼它的:
double distance = 0;
double time = 0;
GPSSpeed = GPSCalculator.Speed(location, out distance, out time);
if (distance > 0 && time > 0)
{
GPSDistance = distance;
GPSTime = time;
}
我每 100 毫秒对 GPS 进行一次采样。此日志期间的精度为 5 米。以下是一些示例输出:
2021-07-15 15:34:50.463 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.136128
2021-07-15 15:34:50.601 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1361792
2021-07-15 15:34:50.742 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1387264
2021-07-15 15:34:50.875 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1400576
2021-07-15 15:34:51.010 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1335552
2021-07-15 15:34:51.138 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1347328
2021-07-15 15:34:51.273 - Lat: 41.2457532357433 Long: -111.993074229977 Distance: 0 Time: 0.1299456
2021-07-15 15:34:51.408 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0.376758239904982 Time: 0.1328512
2021-07-15 15:34:51.540 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.1338624
2021-07-15 15:34:51.676 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.132416
2021-07-15 15:34:51.812 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.1365504
2021-07-15 15:34:51.955 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.137024
2021-07-15 15:34:52.091 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.1411072
2021-07-15 15:34:52.226 - Lat: 41.2457509409894 Long: -111.993070919767 Distance: 0 Time: 0.1378688
2021-07-15 15:34:52.360 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0.424198851848374 Time: 0.1342592
2021-07-15 15:34:52.493 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.1322496
2021-07-15 15:34:52.626 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.1343616
2021-07-15 15:34:52.762 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.1336576
2021-07-15 15:34:52.900 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.135488
2021-07-15 15:34:53.041 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.1389952
2021-07-15 15:34:53.194 - Lat: 41.245753890792 Long: -111.993067709261 Distance: 0 Time: 0.1406464
2021-07-15 15:34:53.333 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 2.0479365347566 Time: 0.1507456
2021-07-15 15:34:53.473 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1399808
2021-07-15 15:34:53.606 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1386496
2021-07-15 15:34:53.747 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1359488
2021-07-15 15:34:53.890 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1401984
2021-07-15 15:34:54.029 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1431424
2021-07-15 15:34:54.181 - Lat: 41.2457695635164 Long: -111.993054884293 Distance: 0 Time: 0.1388544
2021-07-15 15:34:54.322 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 1.59705971256388 Time: 0.1511936
2021-07-15 15:34:54.459 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.1403776
2021-07-15 15:34:54.591 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.138624
2021-07-15 15:34:54.730 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.1316736
2021-07-15 15:34:54.862 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.1392768
2021-07-15 15:34:54.988 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.1318784
2021-07-15 15:34:55.120 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.125952
2021-07-15 15:34:55.252 - Lat: 41.24578381369 Long: -111.993052633481 Distance: 0 Time: 0.1322368
2021-07-15 15:34:55.388 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 1.34866912642065 Time: 0.1321984
2021-07-15 15:34:55.528 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.13408
2021-07-15 15:34:55.668 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.1410688
2021-07-15 15:34:55.807 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.1406848
2021-07-15 15:34:55.949 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.1387136
2021-07-15 15:34:56.094 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.1421824
2021-07-15 15:34:56.223 - Lat: 41.2457951287642 Long: -111.993058403988 Distance: 0 Time: 0.1446272
2021-07-15 15:34:56.352 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0.712615929386394 Time: 0.1293952
2021-07-15 15:34:56.483 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.1277312
2021-07-15 15:34:56.624 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.132096
2021-07-15 15:34:56.749 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.1411456
2021-07-15 15:34:56.890 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.125696
2021-07-15 15:34:57.029 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.1403648
2021-07-15 15:34:57.176 - Lat: 41.2458014067289 Long: -111.993060079922 Distance: 0 Time: 0.1395328
2021-07-15 15:34:57.315 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0.956168757912261 Time: 0.1456512
2021-07-15 15:34:57.453 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.1388032
2021-07-15 15:34:57.594 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.1382784
2021-07-15 15:34:57.736 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.1413888
2021-07-15 15:34:57.878 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.1421824
2021-07-15 15:34:58.018 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.1420544
2021-07-15 15:34:58.159 - Lat: 41.2458099550849 Long: -111.993061225149 Distance: 0 Time: 0.139712
2021-07-15 15:34:58.300 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 1.41356902824941 Time: 0.141568
2021-07-15 15:34:58.435 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.1401216
2021-07-15 15:34:58.574 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.135104
2021-07-15 15:34:58.709 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.1399552
2021-07-15 15:34:58.845 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.134848
2021-07-15 15:34:58.985 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.1358976
2021-07-15 15:34:59.118 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.139968
2021-07-15 15:34:59.246 - Lat: 41.2458224263884 Long: -111.993064427178 Distance: 0 Time: 0.1331072
2021-07-15 15:34:59.374 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 1.88885597475969 Time: 0.1271296
2021-07-15 15:34:59.499 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.126144
2021-07-15 15:34:59.626 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.126784
2021-07-15 15:34:59.757 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.1273856
2021-07-15 15:34:59.874 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.1304704
2021-07-15 15:35:00.007 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.118464
2021-07-15 15:35:00.140 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.132032
2021-07-15 15:35:00.271 - Lat: 41.2458378412934 Long: -111.993073872658 Distance: 0 Time: 0.1307136
2021-07-15 15:35:00.406 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 1.96044097014122 Time: 0.133568
2021-07-15 15:35:00.544 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.1325568
2021-07-15 15:35:00.680 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.1394944
2021-07-15 15:35:00.809 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.1365504
2021-07-15 15:35:00.946 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.129536
2021-07-15 15:35:01.085 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.1375616
2021-07-15 15:35:01.220 - Lat: 41.2458531355872 Long: -111.993085496848 Distance: 0 Time: 0.1389056
2021-07-15 15:35:01.353 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 1.19738920232849 Time: 0.1346304
2021-07-15 15:35:01.487 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.131648
2021-07-15 15:35:01.629 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.134976
2021-07-15 15:35:01.775 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.1415936
2021-07-15 15:35:01.914 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.1453184
2021-07-15 15:35:02.049 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.14016
2021-07-15 15:35:02.187 - Lat: 41.2458613614931 Long: -111.99309472014 Distance: 0 Time: 0.1355392
2021-07-15 15:35:02.328 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 2.24900513250483 Time: 0.1378432
2021-07-15 15:35:02.464 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.13984
2021-07-15 15:35:02.606 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.1362688
2021-07-15 15:35:02.744 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.1428608
2021-07-15 15:35:02.887 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.137984
2021-07-15 15:35:03.029 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.1431936
2021-07-15 15:35:03.179 - Lat: 41.2458776258745 Long: -111.993110671499 Distance: 0 Time: 0.1422336
2021-07-15 15:35:03.315 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 1.43860780807483 Time: 0.1496576
2021-07-15 15:35:03.447 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.134144
2021-07-15 15:35:03.587 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.1331328
2021-07-15 15:35:03.731 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.1406464
2021-07-15 15:35:03.872 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.1434624
2021-07-15 15:35:04.013 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.1412864
2021-07-15 15:35:04.159 - Lat: 41.2458905069283 Long: -111.993112112671 Distance: 0 Time: 0.1410432
2021-07-15 15:35:04.301 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 3.12619120355082 Time: 0.146048
2021-07-15 15:35:04.441 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1410048
2021-07-15 15:35:04.579 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1405952
2021-07-15 15:35:04.725 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1391104
2021-07-15 15:35:04.864 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.144832
2021-07-15 15:35:05.006 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1392384
2021-07-15 15:35:05.139 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1428992
2021-07-15 15:35:05.271 - Lat: 41.2459160810984 Long: -111.993127567139 Distance: 0 Time: 0.1326208
答案 0 :(得分:0)
因为 GPS 经常“反弹”,计算连续位置样本之间的速度不可靠,
改为使用内置解决方案:
Xamarin.Essentials Location.Speed Property。
如果该值仍然“反弹”超过令人满意的程度,则对值序列应用一些“平滑”。
一个简单的平滑是:
smoothedSpeed[i] = k*speed[i-1] + k*speed[i+1] + (1-2*k)*speed[i];
其中 k
通常是介于 0
和 0.333
之间的值。 0
是“无平滑”,0.333
是“最大平滑”。如果不确定,请从 0.1
开始。这将在某种程度上平滑跳跃,而不会过度改变所看到的最大速度。记录样本数据,并将其绘制在几个不同的 k
处:0
、0.05
、0.1
、0.2
、0.333
。这是一个权衡:决定你喜欢哪个。
如果您需要即时答案,因此示例 [i+1]
尚不可用,那么您能做的最好的事情是:
smoothedSpeed[i] = k*speed[i-1] + (1-k)*speed[i];
也可以在较小数量的样本 [i-2]
等中进行平滑处理。对第二个样本使用乘数 k2
,即不超过 k
的一半 - 您想要更多远距离样本的影响很小。
无论如何,sum of "weights"
必须始终恰好为 1
,以免意外提高或降低平均速度。下面,k2+k+(1-k-k2)
= 1
。
.. = k2*speed[i-2] + k*speed[i-1] + (1-k-k2)*speed[i];
如果您已过滤或内插的样本,则此方法效果最佳,因此它们会定期出现。也就是说,连续样本之间的时间(您正在求平均值)应该相同,