我想把物体坐标系中的二维加速度数据进行双重积分,得到世界坐标系中的二维位置。物体总是指向速度的方向(假设火车)。在
所以我试着用velocity verlet积分对加速度值进行数值积分,将每一步的方向改为世界坐标系中的先前速度,由velocity verlet算法提供:
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
def rotate(a, newXAxis):
r = newXAxis
normX = r / sqrt(np.dot(r.T,r))
normY = [-normX[1], normX[0]]
b = np.dot(np.array([normX, normY]).T, a)
return(b)
"""return true if v > 1 km/h or any speed given"""
def isMoving(deltaXPosition, deltaYPosition, deltaTime, fasterThankmh=1.0):
x = deltaXPosition
y = deltaYPosition
t = deltaTime
if t*t == 0.:
return False
if hasattr(x, "__len__"):
x = x[0]
if hasattr(y, "__len__"):
y = y[0]
if hasattr(t, "__len__"):
t = t[0]
speed = float(fasterThankmh)
return((x*x + y*y) / (t*t) > 0.077160*speed*speed)
def velocity_verlet_integration(Xacc, Yacc,
x0=0., y0=0.,
vx_0=0, vy_0=0,
forward=np.array([1.0, 0.0])):
vx = np.zeros(len(Xacc))
vy = np.zeros(len(Xacc))
x = np.zeros(len(Xacc))
y = np.zeros(len(Xacc))
x[0] = x0
y[0] = y0
vx[0] = vx_0
vy[0] = vy_0
for i in range(len(Xacc)-1):
dt = Xacc[i+1]-Xacc[i]
a = rotate(Yacc[i,:], forward)
x[i+1] = x[i] + vx[i]*dt + 1.0/2.0*a[0]*dt*dt
y[i+1] = y[i] + vy[i]*dt + 1.0/2.0*a[1]*dt*dt
if isMoving(x[i+1]-x[i], y[i+1]-y[i], dt):
forward = np.array([x[i+1]-x[i], y[i+1]-y[i]])
aNext = rotate(Yacc[i+1,:], forward)
vx[i+1] = vx[i] + dt*(a[0] + aNext[0])/2
vy[i+1] = vy[i] + dt*(a[1] + aNext[1])/2
return x, y
用一个简单的圆周运动测试:
^{pr2}$这会导致一个向外漂移,因为电流方向是基于最后的速度,这显然是一个错误的近似。在
谁能告诉我更好的解决办法吗?在
基于我的想法(在我问题的最后),我添加了一个糟糕的解决方案,所以我不会接受它作为答案。在
对于情节,加上这个:
^{pr2}$相关问题 更多 >
编程相关推荐