求解 ODE、旋转、角速度、欧拉角

计算科学 scipy 一体化
2021-12-17 05:20:59

我正在实现一个需要根据已知角速度旋转和对象的模拟(为简单起见假设为常数)。我遵循了下面给出的想法,pg。32)

https://graphics.stanford.edu/courses/cs448b-00-winter/papers/phys_model.pdf

对象的方向将保存在矩阵中R, 角速度ω,一个向量。

书上说我可以计算R˙通过采用斜对称形式ω并乘以每列R. 这一切都很好,但是我如何将它与数字积分器接口,例如scipy.odeint首先,这个软件需要平面向量,我是否将每个向量展平ω~Ri在哪里Ri是个i第列和ω~是斜对称矩阵ω?

1个回答

下面的代码似乎工作。作为示例使用了这个圆环形状并整合了一个基本的旋转方程,

from scipy.integrate import odeint
from stl import mesh

def skew(a):
   return np.array([[0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]])

your_mesh = mesh.Mesh.from_file('torus.stl')
prop = your_mesh.get_mass_properties()
R0 = np.eye(3,3)
omega = np.array([0.0,1.0,0.0])
skew_omega = skew(omega)
   
def rhs(u,t):   
   R1x,R1y,R1z,R2x,R2y,R2z,R3x,R3y,R3z = u
   R = np.array([R1x,R1y,R1z,R2x,R2y,R2z,R3x,R3y,R3z])
   R = R.reshape((3,3)).T
   res = np.dot(skew_omega, R)
   return list(res.T.flatten())

STEPS = 20
t=np.linspace(0.0, 3.0, STEPS)
R0 = np.eye(3,3)
u0 = R0.flatten()
u1=odeint(rhs,list(u0),t)