(我认为这个问题与平台无关,但我碰巧编写了一个Nexus One)。
关于“当前速度”:我每秒都会收到一次回调,告诉我目前的纬度和经度是多少。我可以计算当前位置和之前位置之间的距离,这样我就可以跟踪累积距离和累积时间。有了这个,我可以说一下整个行程的平均速度。
但我如何计算当前的速度?我怀疑我需要使用最新的N个样本,对吧?我是否正确地思考这个问题?对于N来说,有什么好的经验法则?多少个样本,或者多少秒钟?
关于“停止时间”:如果我只是站着不动,我仍然可以得到略微不同的纬度和经度,对吧?因此,决定我不是真正感动的意思是说“以前的X地方都在彼此的Y米之内”,对吗?我是否正确地思考这个问题? X和Y有什么好的经验法则?
即使是“距离”:我是否会低估它,因为我真的在偷工减料?是否有算法或经验法则,用于确定我何时“转向”并且我应该添加一点点软糖?
编辑:我道歉:我对浪费人们的时间和善意感到不好,但遗憾的是,设备 IS 给了我速度。我认为这不是因为在模拟器中它不是,而是在真实的设备上。谢谢大家。我还需要编写一些经验法则代码,但速度是最大的挑战。
编辑:我收回道歉。在我最初的问题中,我写道距离也是一个派生值。如果我只使用原始GPS数据,由于不准确,我将夸大距离。我可能会走一条直线,但原始GPS纬度/长度会摇摆,所以如果我通过测量点之间的距离来计算总距离,我会夸大它。以下是与此问题相关的一些链接。 Smooth GPS data
http://www.cs.unc.edu/~welch/kalman/Levy1997/index.html
How to intelligently degrade or smooth GIS data (simplifying polygons)?
How to 'smooth' data and calculate line gradient?
答案 0 :(得分:3)
记住一个短暂的位置历史,可以追溯几秒钟。 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.
使用上面代码中的这两个位置来获得速度。
同样,您可以采取的样本越多,您的位置就越准确和稳定,但这会使您的速度测量反应性降低。
答案 1 :(得分:2)
你的方法并不是真的错,但天真。这些任务有一个巨大的数学基础 - 不出所料,称为过滤器。你可以比'平均最后N个值'好得多。
首先,卡尔曼滤波器易于实现和调整,通常足以完成实际任务。
此外,不要尝试平滑或平均GPS信号 - GPS接收器本身也是如此。相反,根据车辆(或人)的预期加速度进行过滤。
最后,如果你能得到那些信息,可以从频移计算出瞬时速度。
答案 2 :(得分:1)
关于“偷工减料”,你总是可以近似曲线(使用样条曲线或真正的过度杀伤 - 回归),否则我认为你走在正确的轨道上。
关于有多少样品和静止不动,而不是取常数N,我会看一下样品的偏差。
答案 3 :(得分:1)
关于当前速度:大多数gps设备会自行向您发送此信息
答案 4 :(得分:0)
当前速度是位置(现在)和位置(前一个)之间的差值,因此要获得当前速度,您只需要比较当前位置和最后位置。
但是:由于这很容易受到时间/位置跟踪中的小误差的影响,因此不可靠,因此您必须在最后一个位置进行平均。多少取决于用例,时间越长,“当前”速度越小,但速度越精确。