我已经为 Android 实现了 GPS 追踪器。到目前为止,它工作得很好,但我在计算轨道的正确高度差时遇到了问题。我想总结设备“爬升”和“下降”的所有仪表。我在后台服务中执行此操作,将当前位置对象与前一个位置对象进行比较,并将差异直接存储为数据库中的列。如果我在赛道完成后总结这一点,我得到的值大约是使用气压计的自行车速度计测量的 2.5 倍(1500m 对 650m)。
我知道 GPS 设备的测量高度不准确。有没有办法“标准化”测量的高度?例如,我是否应该忽略 2 米以下的所有高度变化?另一种可能性是使用额外的传感器,因为某些设备也有气压计。但这只会在某些设备上有所帮助。
感谢您对此问题的任何建议或提示!
编辑 28.05.2013:布莱斯的回答让我走上了正轨。我开始在网上搜索,发现了一个非常简单且易于实现的低通滤波器。我在 C++ 中做到了这一点
代表一个航路点的节点类:
class Node {
private:
double distance;
double altitude;
double altitudeup;
double altitudedown;
double latitude;
double longitude;
long timestamp;
public:
Node(double dist, double alti, double altiup, double altidown, double lat, double lon, long ts);
double getAltitude();
double getAltitudeup();
double getAltitudedown();
};
这是执行实际工作并计算总上升和下降值的函数:
void SimpleLowPass::applySLP()
{
double altiUp = 0;
double altiDown = 0;
double prevAlti = this->nodeList[0]->getAltitude();
double newAlti = prevAlti;
for (auto n : this->nodeList)
{
double cur = n->getAltitude();
// All the power of the filter is in the line
// newAlti += (cur - newAlti) / smoothing.
// This finds the difference between the new value and the current (smoothed)
// value, shrinks it based on the strength of the filter, and then adds it
// to the smoothed value. You can see that if smoothing is set to 1 then the
// smoothed value always becomes the next value. If the smoothing is set to
// 2 then the smoothed value moves halfway to each new point on each new
// frame. The larger the smoothing value, the less the smoothed line is
// perturbed by new changes.
newAlti += (cur - newAlti) / 20.0;
std::cout << "newAlti: " << newAlti << std::endl;
if (prevAlti > newAlti)
{
altiDown += prevAlti - newAlti;
}
if (newAlti > prevAlti)
{
altiUp += newAlti - prevAlti;
}
prevAlti = newAlti;
}
std::cout << "Alti UP total: " << altiUp << std::endl;
std::cout << "Alti DOWN total: " << altiDown << std::endl;
}
这是一个快速而肮脏的实现。但是平滑值为 20 时,我得到了很好的结果。我仍然需要录制更多曲目并比较结果。在我发现这个低通滤波器的网站上还有帧速率独立实现,我想玩一个移动平均实现。
感谢您的所有回答!