0

我正在做一个实验程序。我有一个固定在汽车仪表板上的智能手机,在旅行期间,我从应用程序中读取了惯性传感器的一些值。

准确地说,我读到了每个注册的加速度计数据时间(以固定间隔),以秒为单位。

所以现在我想从垂直加速度传递到垂直位移,为此我应该做一个双重积分。

我尝试了欧拉方法。从初始条件如:

v0=0.v0=0这是零时间的初始速度。

x0=0.x0=0这是零时间的初始位置。

定义,

deltaT=registrationinterval.deltaT=registrationinterval(在我的情况下为 0.04 秒)

然后对于每个注册,我都会:

vi=vi−1+ayi∗deltaT.vi=vi−1+ayi∗deltaT

xi=xi−1+vi∗deltaT.xi=xi−1+vi∗deltaT

其中i代表当前和i-1先例。

但是我得到的图表不是很真实,实际上速度和位移都只是增长,而我必须得到的效果是垂直位移出来的东西类似于加速度图。

鉴于应用此程序,我的错误也很高,有可能图形只是在增长,而我没有看到任何类型的垂直振荡?

我还阅读了卡尔曼滤波器可以提前应用来清理信号,这可能是一个解决方案吗?

或者我应该改变积分方法并从龙格库塔切换到欧拉?(然而,最后一个,我一点也不知道如何设置)。

或者有人知道可以帮助我的算法吗?

这里有一个注册数据的例子,如果有帮助的话:

4

1 回答 1

0

Euler 和 Runge Kutta 都是数值积分器。一个可能比另一个更精确,具体取决于您要积分的方程类型,但两者都应该给出相同的定量结果。如果一个给你一个不断增加的速度而另一个没有,那么你就有一个错误。

我认为这更像是一个物理问题而不是编程问题。

从数据来看,垂直加速度计的数据中似乎包含了重力加速度,在地球表面约为 9.8 m/s^2。当然,你的车是靠道路支撑的,所以它实际上并没有加速。

您使用的方程式假设没有其他力在起作用,因此它们正确地表明汽车的速度和位置将不断增长(就像您从直升机上掉下汽车一样)。但是还有其他力量在起作用(道路向上推轮胎),所以你必须找到一种方法来模拟这些力量。

您可以做的一件事是将前几次测量值平均作为基线(应该接近 9.8 m/s^2),然后从后续读数中减去该值。随着汽车在山坡上上下移动,传感器值会相对于基线发生变化,而这些差异正是您所关心的。

这是一个很好的第一个近似值。但是当你上山或下山时,手机相对于重力场不再是水平的,所以部分重力会反映在水平传感器上。为了获得精确的结果,您需要考虑到这一点。

于 2016-12-31T17:18:59.630 回答