从 iOS 位置数据计算 GPS 速度

时间:2021-07-15 21:41:25

标签: performance xamarin.forms gps

我无法根据 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

1 个答案:

答案 0 :(得分:0)

因为 GPS 经常“反弹”,计算连续位置样本之间的速度不可靠

改为使用内置解决方案:

Xamarin.Essentials Location.Speed Property


如果该值仍然“反弹”超过令人满意的程度,则对值序列应用一些“平滑”。

一个简单的平滑是:

smoothedSpeed[i] = k*speed[i-1] + k*speed[i+1] + (1-2*k)*speed[i];

其中 k 通常是介于 00.333 之间的值。 0 是“无平滑”,0.333 是“最大平滑”。如果不确定,请从 0.1 开始。这将在某种程度上平滑跳跃,而不会过度改变所看到的最大速度。记录样本数据,并将其绘制在几个不同的 k 处:00.050.10.20.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];

如果您已过滤或内插的样本,则此方法效果最佳,因此它们会定期出现。也就是说,连续样本之间的时间(您正在求平均值)应该相同,