使用 CLLocationManager 时查找速度的问题

Posted

技术标签:

【中文标题】使用 CLLocationManager 时查找速度的问题【英文标题】:Issue in finding the speed when using CLLocationManager 【发布时间】:2011-06-07 11:04:39 【问题描述】:

我正在 iPhone 中开发一个速度计应用程序。我使用 CLLocationManager(基于 GPS)来测量车辆的速度。但我没有得到准确的速度。我已经尝试了各种 *** 讨论中给出的所有过滤方法。但我没有得到任何改善。有时,速度会达到更大的值(>400kmph)。

我不知道出了什么问题。请建议我任何代码以获得准确的速度。

提前致谢,

我已经关注了下面提到的堆栈溢出讨论

Measuring velocity via iPhone SDK

Optimizing CLLocationManager/CoreLocation to retrieve data points faster on the iPhone

CLLocation speed

Why is my CLLocation speed so inaccurate?

我目前已经实现了以下代码:

//locationManager declaration in ViewDidLoad

locManager=[[CLLocationManager alloc]init];
locManager.delegate =self;
[locManager startUpdatingLocation];           


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

    NSTimeInterval locationAge = abs([newLocation.timestamp timeIntervalSinceNow]);

    if (locationAge > 5.0) return;
    if (newLocation.speed < 0 || newLocation.horizontalAccuracy < 0) return;
    if ((newLocation.horizontalAccuracy < (oldLocation.horizontalAccuracy - 10.0)) || (newLocation.horizontalAccuracy < 50.0)|| (newLocation.horizontalAccuracy <= 150.0))
    
        if(oldLocation != nil)
        
            CLLocationDistance distanceChange = [newLocation distanceFromLocation:oldLocation];

            NSTimeInterval sinceLastUpdate = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp];


            double calculatedSpeed;
            calculatedSpeed = (distanceChange / sinceLastUpdate)*3.6;   // to convert the speed into kmph.

               
    


【问题讨论】:

请提供引用的 *** 讨论的链接,因此没有人会浪费您的时间来解决您已经放弃的不可接受的解决方案。另外,请发布您现在使用的代码。 嗨杰里米,现在我已经添加了我使用的代码。请查看它。 【参考方案1】:

即使您不喜欢内置的速度功能,也可以轻松滚动。

速度是随时间变化的距离,对吧?

如果你有两个CLLocations,你可以这样做:

CLLocationDistance distance = [aLocation distanceFromLocation:bLocation];

distance 现在是这两点之间距离的浮点数,以米为单位。这两个CLLocations 也有timestamp 属性,对吧?包含 NSDate 对象。嗯……

NSTimeInterval timediff = [aDate timeIntervalSinceDate:bDate];

timediff 是以秒为单位的差异。

因此,您在这些点之间的平均速度(以米/秒为单位)是 distance 超过 timediff。您现在可以像获取位置更新的频率一样准确地计算瞬时速度。

我想这就是你得到的 CLLocation 对象的speed 属性所发生的一切。但是,嘿,你想更接近数学,那就继续吧。

从那里,您可以转换为您喜欢的任何单位。一英里有1609.344米。一小时有3600秒。

现在:这与任何纯基于 GPS 的速度计算一样存在缺陷,因为您无法获得位置更新的完美间隔刻度,有时它们会出错。如果您丢失 GPS 信号并且设备退回到蜂窝塔三角测量,它可能会让您远离某处的道路,并且看起来您就像绑在火箭包上一样在那边快。

【讨论】:

嗨,丹,正如你提到的,我已经尝试使用我自己的代码来计算速度。我的问题是我得到的速度是近似的,但速度有很大的偏差,即使车辆是静止的。是否有任何过滤技术可用于避免车辆静止时的偏转.. 嗯,是的,我的意思是你可以在进入的过程中检查你的 CLLocations。你可以丢弃那些突然低于你所看到的准确度的位置。您可以丢弃导致不可能的速度或不可能的 delta-v 的位置(我的意思是,您可能不太可能突然从 40 英里/小时提高到 400 英里/小时,是吗?)。

以上是关于使用 CLLocationManager 时查找速度的问题的主要内容,如果未能解决你的问题,请参考以下文章

当 iphone 在后台时使用 CLLocationManager 将位置发送到服务器

应用程序再次激活时 CLLocationManager 的奇怪行为

使用 kCLLocationAccuracyBestForNavigation 时来自 CLLocationManager 的速度和路线错误

应用在后台时启动 CLLocationManager 位置更新

CLLocationManager 从后台状态返回时冻结我的应用程序?

飞行模式开启时 CLLocationManager 是如何获取位置的