我收到一个带有纬度和经度的回调,我怎样才能最好地计算“当前速度”和其他派生值?
Posted
技术标签:
【中文标题】我收到一个带有纬度和经度的回调,我怎样才能最好地计算“当前速度”和其他派生值?【英文标题】:I'm getting a callback with latitude and longitude, how can I best calculate "current speed", and other derived values? 【发布时间】:2010-01-22 13:53:32 【问题描述】:(我认为这个问题与平台无关,但我碰巧正在为 Nexus One 编写代码)。
关于“当前速度”:我大约每秒都会收到一个回调,告诉我当前的纬度和经度是多少。我可以计算当前位置和上一个位置之间的距离,所以我可以跟踪累积距离和累积时间。有了这个,我可以说出整个行程的平均速度。
但是如何计算当前速度?我怀疑我需要使用最近的 N 个样本,对吧?我是否以正确的方式思考这个问题? N 有什么好的经验法则?多少个样本,或者返回多少秒?
关于“停止时间”:如果我只是站着不动,我仍然可以得到稍微不同的经纬度报告给我,对吧?所以,决定我没有真正移动意味着说“之前的 X 位置都在 Y 米之内”,对吗?我是否以正确的方式思考这个问题? X 和 Y 有什么好的经验法则?
即使是关于“距离”:我是否会因为我在偷工减料而轻描淡写?是否有算法或经验法则来确定我何时“转向”并且我应该添加一点软糖?
编辑:我道歉:我为浪费人们的时间和善意而感到难过,但遗憾的是,该设备 IS 给了我速度。我认为这不是因为在模拟器中它不是,而是在真实设备上它是。谢谢大家。我还需要编写一些经验法则代码,但速度是最大的挑战。
编辑:我收回道歉。在我最初的问题中,我写道距离也是一个派生值。如果我只使用原始 GPS 数据,我会因为不准确而夸大距离。我可能会走直线,但原始 GPS 纬度/经度会摇晃,所以如果我通过测量点之间的距离来计算总距离,我会夸大其词。以下是与此问题相关的一些链接。
Smooth GPS datahttp://www.cs.unc.edu/~welch/kalman/Levy1997/index.htmlHow to intelligently degrade or smooth GIS data (simplifying polygons)?How to 'smooth' data and calculate line gradient?
【问题讨论】:
如果您从设备获取此数据,尤其是使用 Sirf 芯片组的设备,那么速度可能会作为返回数据的一部分提供。 【参考方案1】:记住一个简短的位置历史,回溯几秒钟。 5 秒应该会给你一个相当准确的结果,并且更新得相当快......
// delay is the time difference between the 2 samples you have
delay = 5; // 5 second delay
// figure out how far along x and y we have moved since last time
dx = newx - oldx;
dy = newy - oldy;
// distance travelled
distance = sqrt(dx*dx + dy*dy);
// find the speed. if the positions were measured in metres and the time in seconds
// this will be the average speed in metres per second, over the last 5 seconds
speed = distance / delay;
您可以在样本之间等待的时间越长(例如,如果您保留最后 30 个位置样本并使用 30 秒延迟),您的答案就会越稳定(即,噪音越小),但速度越慢它将对速度的任何变化做出反应。
为什么你需要添加这个延迟的东西?好吧,您手机中的 GPS 单元可能不是很准确。如果你站着不动,它每秒返回的位置可能会摇摆不定。这种摇晃的噪音会让你看起来像是在房间里随意冲刺,并可能导致你报告一个中等高速,即使你根本没有移动。当您静止不动时,我列出的解决方案不会真正有帮助,因为 30 秒前的结果与 1 秒前的位置一样错误。您真正需要做的是平均一段时间内的位置,然后将其与稍早时间的平均位置进行比较。比如……
取 10 个位置样本并取平均值。这是位置 1。 再取 10 个样本并取平均值。这是位置 2。 将这两个位置与上面的代码一起使用即可获得速度。
同样,您可以采集的样本越多,您的位置就会变得越准确和稳定,但这会降低您的速度测量的响应速度。
【讨论】:
我的问题实际上只是大约 5 秒。你只是编造的,还是来自 GPS 不精确的实际现场经验?你怎么知道 4 或 6 不是更好的答案? 我已经更新了一点,试图让它更清晰。基本上,你可以做的样本越多,你的答案就越稳定,但它对速度变化的反应就越慢。您需要应用程序的准确度和响应速度取决于您自己。它还取决于您行驶的速度以及来自设备的位置噪声的大小。如果您的设备精确到 +-2 米,那么在步行速度下会产生大量噪音,但在飞机速度下可能没有问题。有太多“取决于”,无法在不了解更多信息的情况下给您一个很好的猜测。 您在答案中添加了更多文本,但现在还有另一个神奇的数字“10”。你怎么知道“9”不是更好的数字? 正如我所说,哪个幻数最适合您取决于应用程序、设备精度等。如果您想变得更聪明,您可以根据从设备。如果设备为您提供非常稳定的位置数据,您可以减少样本数量。如果它变得更糟,您可能需要增加它。毕竟信号质量各不相同。【参考方案2】:您的方法并没有真正错误,而是天真。这些任务有一个巨大的数学基础——毫不奇怪,称为过滤器。您可以获得比“平均最后 N 个值”更好的结果。
首先,卡尔曼滤波器易于实施和调整,通常足以胜任实际任务。
另外,不要尝试平滑或平均 GPS 信号 - GPS 接收器会自行处理。而是根据车辆(或人)的预期加速度进行过滤。
最后,如果你能得到这些信息,可以从频移计算瞬时速度。
【讨论】:
【参考方案3】:关于当前速度:大多数 gps 设备会自行向您发送此信息
【讨论】:
因为一些程序员计算出来的。今天,我就是那个程序员。原始数据只是纬度/经度和时间戳。 不一定。我的 GPS 设备在发现位置变化之前就注意到速度变化(尤其是在快速加速时)。我认为它是直接通过信号的多普勒失真来衡量的。 如果您确定纬度/经度,我的意思是绝对确定,那么可以。您可以与他们一起计算并报告。看看你正在编程的设备是否有加速度计不会有什么坏处:) 我为浪费人们的时间和善意而感到难过,但可悲的是,设备IS 给了我速度。我认为这不是因为在模拟器中它不是,而是在真实设备上它是。 速度确实是独立于位置计算的。通过测量接收器从可见卫星接收到的信号中的多普勒频移来确定报告定位时的瞬时速度。如果您知道卫星向接收器移动的速度(根据轨道方程),则可以在假设接收器静止的情况下计算预期的多普勒频移。预期多普勒和测量多普勒之间的差异允许您计算接收器速度。而且这个计算出来的速度通常是相当准确的。【参考方案4】:关于“偷工减料”,您始终可以近似曲线(使用样条曲线或真正的矫枉过正 - 回归),否则我认为您走在正确的轨道上。
关于有多少样本并静止不动,而不是取一个常数N,我会看样本的偏差。
【讨论】:
【参考方案5】:当前速度是Position(now) 和Position(previous) 之间的差,因此要获得当前速度,您只需比较当前位置和最后位置即可。
但是:由于这很容易受到时间/位置跟踪中的小错误的影响,因此它不可靠,因此您必须对最后一个位置进行平均。多少取决于用例,时间范围越长,速度“当前”越少,但越精确。
【讨论】:
@dbemerlin - 我的整个问题是关于你答案的“但是”部分。 ... 这取决于用例:要显示行驶时的速度,时间范围应约为 5 秒,要在地图上显示运输中卡车的速度(跟踪),它可以是一分钟或更长时间......以上是关于我收到一个带有纬度和经度的回调,我怎样才能最好地计算“当前速度”和其他派生值?的主要内容,如果未能解决你的问题,请参考以下文章