为了帮助人们了解我问的是我所问的问题,我选择了完整的引用。我希望这会清除它。卡尔曼,最小二乘或
我正在收集1秒速率的GPS数据(纬度/经度)。了解到这些数据可能不是100%准确的,并且偶尔有(1个或更多)数据点远离标记,那么删除异常值点以确定相当准确的过程将是最合适的方法,并且车辆的速度?这种车辆可以在一小时0-60英里的任何地方行驶,通常是直线行驶,但也可能容易出现突然转弯(加权值?)。
我对这种困惑表示歉意,并且因为不理解已经发布的建议而感到抱歉。
为了帮助人们了解我问的是我所问的问题,我选择了完整的引用。我希望这会清除它。卡尔曼,最小二乘或
我正在收集1秒速率的GPS数据(纬度/经度)。了解到这些数据可能不是100%准确的,并且偶尔有(1个或更多)数据点远离标记,那么删除异常值点以确定相当准确的过程将是最合适的方法,并且车辆的速度?这种车辆可以在一小时0-60英里的任何地方行驶,通常是直线行驶,但也可能容易出现突然转弯(加权值?)。
我对这种困惑表示歉意,并且因为不理解已经发布的建议而感到抱歉。
标准算法adjacent_difference
将产生一系列迭代器中每个元素之间的差异。所以如果有5个元素,它会产生4个差异。
这些都是我们将要使用的标准库:
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <numeric>
我不知道你的GPS类会是什么样子。我会以为这是一维:
class Position
{
public:
Position() :
m_position(0)
{
}
Position(int position) :
m_position(position)
{
}
Position operator-(const Position& other) const
{
return Position(m_position - other.m_position);
}
operator int() const
{
return m_position;
}
private:
int m_position;
};
Position abs_sum(const Position& lhs, const Position& rhs)
{
return Position(abs(int(lhs)) + abs(int(rhs)));
}
将其组合在一起:
int main()
{
using namespace std; // for brevity - don't really do this in your code
vector<Position> positions;
positions.push_back(Position(13));
positions.push_back(Position(23));
positions.push_back(Position(17));
positions.push_back(Position(19));
vector<Position> displacements;
adjacent_difference(positions.begin(), positions.end(),
back_inserter(displacements));
cout << "Displacements: ";
copy(displacements.begin(), displacements.end(),
ostream_iterator<int>(cout, ", "));
cout << endl;
int distance = accumulate(displacements.begin(), displacements.end(),
0, abs_sum);
cout << "Total: " << distance << endl;
return 0;
}
输出:
Displacements: 13, 10, -6, 2,
Total: 31
基于我对问题的重新说明,您是否觉得这仍然适用? – Jason 2012-04-11 16:18:15
@Jason我认为你要求的是完全不同的东西。抱歉! – 2012-04-11 20:03:47
问题似乎是形成不良的,因为你不有足够的数据。所以,你的GPS正在收集位置,这些基本上是一堆坐标。你问的是“他们是否正确”和“如何使它更精确”。显然,我们需要更多的数据来做到这一点。
在机器人技术中,典型的“其他数据”是来自其他传感器(例如IMU-惯性测量单元,实际上是加速度计)或测距法(对电机的命令)的数据。从这两者中,机器人知道它正在“直行”,任何左右分支都可以纠正。或者,他们使用计算机视觉算法跟踪“地标”(如树木或角落),这也提供了有关机器人运动的良好信息。你没有这些。
你有什么,是汽车的物理模型。你知道,在60英里/小时的时候,汽车不可能转弯90度(这就是为什么这个问题似乎并不适合你,因为你自然知道汽车应该如何表现)。这个限制并不像额外的传感器信息那么好,但它应该做。您可以使用非线性最小二乘或卡尔曼滤波器。
我不是卡尔曼滤波器的忠实粉丝,所以我不会告诉你如何实现它。
使用NLS,您可以将汽车的位置作为图表(不要与图表混淆)。汽车的每个位置都是顶点。每两个相邻的顶点(对应于“前一个和当前位置”)通过“汽车运动规律”约束(边缘)链接。每个顶点也具有GPS位置约束,这是一元边缘。
这种图由稀疏矩阵表示。它是雅可比矩阵(或Hessian矩阵),其中值对应于顶点相对于给定系统状态(所有顶点的位置)处的约束的导出。在每一步中,矩阵大小都会增加,因为下一个位置被添加。为了保持解决方案的低复杂度,您可以删除旧的职位,只保留最后的N个步骤。在每个步骤中,您需要评估物理约束(计算速度和旋转速度并查看它是否合理),并计算雅可比行动/ Hessians和一个误差向量(来自GPS修正的当前向量位置差异/从物理约束运动)。然后你解出这个系统(dx = Jacobians/errors),产生向量dx,它是顶点位置的差异。您只需将它添加到顶点并且您在那里。这基本上是高斯 - 牛顿算法。
这不是一件容易实现的事情。有些库可以高效地解决这些图形问题,如SLAM++,iSAM,或g2o。麻烦的是,这些都不会为你开箱即用,因为物理合理性约束没有在那里实现(GPS约束也不是,但只是减法)。你将不得不实现你自己的顶点/边缘类型。
我建议你使用更简单的东西。只需对GPS告诉你的不同点进行计算,计算窗口化中值,并查看最后一次测量是否离中位数太远。如果它太过分了(你将不得不试验并查看哪个阈值起作用),请不要使用该测量值进行速度/航向计算(但仍保留它以计算中位数)。这应该是相当准确的,适合你的目的。
如果您将测量数据作为文本文件上传,并且您在纬度方向上驾驶经纬度/时间戳,我们可以看到编写代码来处理该数据。
“最佳”在哪方面?你需要高精度/小噪声,小偏差或别名,快速响应...?它可以是多么昂贵? – leftaroundabout 2012-04-10 18:19:42
最适合我的输入和所需的输出。 – Jason 2012-04-10 18:21:52
我不希望它计算昂贵。至于精确度,我很难说。它不一定非常精确。也就是说,速度应该精确到几英里,并且航向精确到1度。除此之外,我不知道。这对我来说显然是未知的领域。 – Jason 2012-04-10 18:44:33