Path: blob/master/experiments/quaternion.py
1700 views
# -*- coding: utf-8 -*-1"""2Created on Thu Jan 29 18:36:36 201534@author: rlabbe5"""67import numpy as np8from math import sin, cos, atan2, asin910'''11psi = yaw12phi = roll13theta = pitch14'''151617def e2q(vector):1819roll = vector[0]20pitch = vector[1]21heading = vector[2]22sinhdg = sin(heading/2)23coshdg = cos(heading/2)2425sinroll = sin(roll/2)26cosroll = cos(roll/2)2728sinpitch = sin(pitch/2)29cospitch = cos(pitch/2)3031q0 = cosroll*cospitch*coshdg + sinroll*sinpitch*sinhdg32q1 = sinroll*cospitch*coshdg - cosroll*sinpitch*sinhdg33q2 = cosroll*sinpitch*coshdg + sinroll*cospitch*sinhdg34q3 = cosroll*cospitch*sinhdg - sinroll*sinpitch*coshdg3536return np.array([q0, q1, q2, q3])373839def q2e(q):40roll = atan2(2*(q[0]*q[1] + q[2]*q[3]), 1 - 2*(q[1]**2 + q[2]**2))41pitch = asin(2*(q[0]*q[2] - q[3]*q[1]))42hdg = atan2(2*(q[0]*q[3] + q[1]*q[2]), 1-2*(q[2]**2 + q[3]**2))4344return np.array([roll, pitch, hdg])454647def e2d(e):48return np.degrees(e)49def e2r(e):50return np.radians(e)5152def add(q1,q2):53return np.multiply(q1,q2)54555657def add2(q1, q2):58Q1 = q1[0]*q2[0] - q1[1]*q2[1] - q1[2]*q2[2] - q1[3]*q2[3]59Q2 = q1[0]*q2[1] + q1[1]*q2[0] + q1[2]*q2[3] - q1[3]*q2[2]60Q3 = q1[0]*q2[2] + q1[2]*q2[0] + q1[3]*q2[1] - q1[1]*q2[3]61Q4 = q1[0]*q2[3] + q1[3]*q2[0] + q1[1]*q2[2] - q1[2]*q2[1]6263return np.array([Q1, Q2, Q3, Q4])646566e = e2r([10, 0, 0])67q = e2q(e)68print(q)69print(e2d(q2e(q)))70q2 = add2(q,q)71print(q2)72e2 = q2e(q2)73print(e2d(e2))74757677