我正在做一个实验计划。我在汽车仪表板上安装了一个带有支架的智能手机,在行程中我从一个应用程序中读取了惯性传感器的一些值。
我准确地读到了每次登记的加速度计数据时间(固定间隔),以秒为单位。
所以现在我想要从垂直加速度传递到垂直位移,为此我应该进行双重积分。
我尝试过Euler方法。从最初的条件开始:
v0=0.v0=0
这是零时刻的初始速度。
x0=0.x0=0
这是零时的初始位置。
定义,
deltaT=registrationinterval.deltaT=registrationinterval
(在我的情况下是0,04s)
然后对于每次注册,我做:
vi=vi−1+ayi∗deltaT.vi=vi−1+ayi∗deltaT
xi=xi−1+vi∗deltaT.xi=xi−1+vi∗deltaT
其中i
代表当前和i-1
先例。
但是我获得的图表并不是很逼真,实际上速度和位移都只会增长,而我必须得到的效果是垂直位移与加速度图形相似。< / p>
鉴于应用此程序,我也是一个很高的错误,图表可能只是在增长,我没有看到任何类型的垂直振荡?
我也看过卡尔曼滤波器可以提前应用来清理信号,可能是一个解决方案吗?或者我应该改变整合方法并从Runge Kutta切换到Euler? (最后一点,我对如何设置它没有任何想法)。
或者有人知道可以帮助我的算法?
如果有帮助的话,这里注册了example个数据:
答案 0 :(得分:0)
Euler和Runge Kutta都是数值积分器。一个可能比另一个更精确,这取决于您整合的方程式类型,但两者都应给出相同的定量结果。如果一个人给你一个不断增加的速度而另一个没有,那么你就有一个错误。
我认为这更像是一个物理问题,而不是一个编程问题。
根据数据,看起来垂直加速度计数据包括由于重力引起的加速度,在地球表面约为9.8 m / s ^ 2。当然,你的车是由道路支撑的,所以它实际上并没有加速下来。
您使用的方程式假设没有其他力量在起作用,因此它们正确地表明汽车的速度和位置会不断增长(就像您放下汽车一样)从直升机)。但是还有其他的力量在起作用(推动轮胎的道路),所以你必须找到一种模拟这些力量的方法。
您可以做的一件事是将前几次测量平均值作为基线(接近9.8 m / s ^ 2),然后从后续读数中减去该值。当汽车在山上上下移动时,传感器值会随着基线的变化而变化,这些差异就是你所关心的。
这是一个很好的初步近似值。但是当你上山或下山时,手机不再相对于引力场水平,因此部分重力将反映在水平传感器中。为了获得准确的结果,您需要考虑到这一点。