Olaphsen

Untitled

Apr 16th, 2023
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.94 KB | Source Code | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.spatial.transform import Rotation
  4.  
  5. gyroMeasError = np.radians(3 / 3600)
  6. beta = np.sqrt(3. / 4.) * gyroMeasError
  7.  
  8. nu_1 = np.radians(0 * 1 / 3600)
  9. nu_2 = np.radians(0 * 1 / 3600)
  10. nu_3 = np.radians(0 * 1 / 3600)
  11. df1 = 1e-2
  12. df2 = 0 * 1e-2
  13. df3 = 0 * 1e-2
  14.  
  15. phi = np.radians(55.8)
  16. u_0 = 7.292115e-5
  17. uE, uN, uU = 0, np.cos(phi) * u_0, np.sin(phi) * u_0
  18.  
  19. deltat = 0.004
  20.  
  21. directory = '/home/andrei/CLionProjects/imitators/cmake-build-release/tt3axis.imu'
  22.  
  23.  
  24. def quat_mult(a, b):
  25.     q0 = a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3]
  26.     q1 = a[0]*b[1] + b[0]*a[1] + a[2]*b[3] - a[3]*b[2]
  27.     q2 = a[0]*b[2] + b[0]*a[2] + a[3]*b[1] - a[1]*b[3]
  28.     q3 = a[0]*b[3] + b[0]*a[3] + a[1]*b[2] - a[2]*b[1]
  29.     return np.array([q0, q1, q2, q3], dtype=np.float64)
  30.  
  31.  
  32. def inverse_quat(q):
  33.     return [q[0], *[-i for i in q[1:]]]
  34.  
  35.  
  36. def deltaq(q1, q0):
  37.     q0_inv = inverse_quat(q0)
  38.     return quat_mult(q1, q0_inv)
  39.  
  40.  
  41. def get_all_data(path):
  42.     data_1 = np.loadtxt(path, skiprows=1)
  43.     w_1, w_2, w_3 = data_1[:, 0], data_1[:, 1], data_1[:, 2]
  44.     f_1, f_2, f_3 = data_1[:, 3], data_1[:, 4], data_1[:, 5]
  45.     q0, q1, q2, q3 = data_1[:, 6], data_1[:, 7], data_1[:, 8], data_1[:, 9]
  46.     return w_1, w_2, w_3, f_1, f_2, f_3, q0, q1, q2, q3
  47.  
  48.  
  49. data_file = get_all_data(directory)
  50. nu = np.array([nu_1, nu_2, nu_3])
  51. df = np.array([df1, df2, df3])
  52. w_init = np.radians(data_file[0:3]).T.tolist()
  53. f_init = (data_file[3:6] + df[:, np.newaxis]).T.tolist()
  54. w = np.radians(data_file[:3]) + nu[:, np.newaxis]
  55. f = data_file[3:6] + df[:, np.newaxis]
  56. q_data = data_file[6:]
  57. w1, w2, w3 = w[0], w[1], w[2]
  58. f1, f2, f3 = f[0], f[1], f[2]
  59. q0_data, q1_data, q2_data, q3_data = q_data[0], q_data[1], q_data[2], q_data[3]
  60.  
  61. def initial_alignment(f_init, w_init):
  62.     f_z = np.mean(f_init[:30*250], axis=0)
  63.     w_z = np.mean(w_init[:30*250], axis=0)
  64.     L_xz = np.array([np.cross(w_z, f_z) / np.linalg.norm(np.cross(w_z, f_z)),
  65.                      np.cross(f_z, np.cross(w_z, f_z)) / np.linalg.norm(np.cross(f_z, np.cross(w_z, f_z))),
  66.                      f_z / np.linalg.norm(f_z)])
  67.  
  68.     r = Rotation.from_matrix(L_xz)
  69.     r_ = r.as_quat()[[3, 0, 1, 2]]
  70.     return L_xz, r_
  71.  
  72.  
  73. L_xz, r_ = initial_alignment(f_init, w_init)
  74. qmy_0, qmy_1, qmy_2, qmy_3 = r_
  75.  
  76.  
  77. def f_data_initial():
  78.     g0_ = np.sqrt(np.mean(f_init[:30*250], axis=0)[0] ** 2 +
  79.                   np.mean(f_init[:30*250], axis=0)[1] ** 2 +
  80.                   np.mean(f_init[:30*250], axis=0)[2] ** 2)
  81.     return g0_
  82.  
  83. g0 = f_data_initial()
  84.  
  85. def rotation_imu():
  86.     f = []
  87.     q0, q1, q2, q3 = [], [], [], []
  88.     for m in range(len(data_file[0])):
  89.         f.append(FilterUpdate_My(w1[m], w2[m], w3[m], f1[m], f2[m], f3[m]))
  90.         q0.append(float(f[m][0]))
  91.         q1.append(float(f[m][1]))
  92.         q2.append(float(f[m][2]))
  93.         q3.append(float(f[m][3]))
  94.     return q0, q1, q2, q3
  95.  
  96.  
  97. # our filter
  98. def FilterUpdate_My(w_x, w_y, w_z, a_x, a_y, a_z):
  99.     global qmy_0, qmy_1, qmy_2, qmy_3
  100.  
  101.     a = np.array([a_x, a_y, a_z])
  102.     norm = np.linalg.norm(a)
  103.     a /= norm
  104.  
  105.     dp0, dp1, dp2, dp3 = quat_mult([qmy_0 / 2, qmy_1 / 2, qmy_2 / 2, qmy_3 / 2], [0, w_x, w_y, w_z])
  106.     p = qmy_0 + dp0 * deltat / 2, qmy_1 + dp1 * deltat / 2, qmy_2 + dp2 * deltat / 2, qmy_3 + dp3 * deltat / 2,
  107.  
  108.     u = np.cross([a_x, a_y, a_z], quat_mult(quat_mult(inverse_quat(p), [0, 0, 0, g0]), p)[1:])
  109.     norm_u = np.linalg.norm(u)
  110.     if norm_u > 0:
  111.         u_1, u_2, u_3 = (-2 * beta * u[:3]) / norm_u
  112.     else:
  113.         u_0, u_1, u_2, u_3 = 0, 0, 0, 0
  114.     qq_omega_0, qq_omega_1, qq_omega_2, qq_omega_3 = quat_mult([0.5 * qmy_0, 0.5 * qmy_1, 0.5 * qmy_2, 0.5 * qmy_3],
  115.                                                                [0, w_x - u_1, w_y - u_2, w_z - u_3])
  116.  
  117.     qmy_0 += qq_omega_0 * deltat
  118.     qmy_1 += qq_omega_1 * deltat
  119.     qmy_2 += qq_omega_2 * deltat
  120.     qmy_3 += qq_omega_3 * deltat
  121.  
  122.     norm = np.linalg.norm([qmy_0, qmy_1, qmy_2, qmy_3])
  123.     qmy_0 /= norm
  124.     qmy_1 /= norm
  125.     qmy_2 /= norm
  126.     qmy_3 /= norm
  127.     return [qmy_0, qmy_1, qmy_2, qmy_3]
  128.  
  129.  
  130. if __name__ == '__main__':
  131.     A = [0, 0, 0]
  132.     nu_x = []
  133.     g_new = []
  134.     E_aa_g = []
  135.     qq = []
  136.     t = []
  137.     up, norm_ = [], []
  138.     om_u = []
  139.     q_df, q_f, q_f_cross = [], [], []
  140.     q0_my, q1_my, q2_my, q3_my = rotation_imu()
  141.     T = np.arange(0, len(q0_data), 1) * deltat
  142.  
  143.     dq = np.array(deltaq([q0_my, q1_my, q2_my, q3_my], [q0_data, q1_data, q2_data, q3_data]))
  144.     dq[:, dq[0] < 0] *= -1
  145.  
  146.     x_E, x_N, x_U = np.empty(250 * 210), np.empty(250 * 210), np.empty(250 * 210)
  147.     v_E, v_N, v_U = np.empty(250 * 210), np.empty(250 * 210), np.empty(250 * 210)
  148.     a_E, a_N, a_U = np.empty(250 * 210), np.empty(250 * 210), np.empty(250 * 210)
  149.     x_E[0], x_N[0], x_U[0] = 0, 0, 0
  150.     v_E[0], v_N[0], v_U[0] = 0, 0, 0
  151.     a_E[0], a_N[0], a_U[0] = dq[1][0] * 2, dq[2][0] * 2, dq[3][0] * 2
  152.  
  153.  
  154.     for i in range(len(T) - 1):
  155.         E_aa_g.append([0,
  156.                        A[0] - np.cross(A, [a_E[i], a_N[i], a_U[i]])[0] + g0 * a_N[i],
  157.                        A[1] - np.cross(A, [a_E[i], a_N[i], a_U[i]])[1] - g0 * a_E[i],
  158.                        A[2] - np.cross(A, [a_E[i], a_N[i], a_U[i]])[2] + g0])
  159.         qq.append(quat_mult(quat_mult(inverse_quat([q0_my[i], q1_my[i], q2_my[i], q3_my[i]]), E_aa_g[i]),
  160.                             [q0_my[i], q1_my[i], q2_my[i], q3_my[i]])[1:] + df)
  161.         g_new.append(quat_mult(quat_mult(inverse_quat([q0_my[i], q1_my[i], q2_my[i], q3_my[i]]), [0, 0, 0, g0]),
  162.                                [q0_my[i], q1_my[i], q2_my[i], q3_my[i]])[1:])
  163.         up.append(np.cross(qq[i], g_new[i]))
  164.         norm_.append(np.linalg.norm(up[i]))
  165.         om_u.append(-2 * beta * up[i] / norm_[i])
  166.  
  167.         nu_x.append(quat_mult(quat_mult([q0_my[i], q1_my[i], q2_my[i], q3_my[i]],
  168.                                         [0, nu_1 - om_u[i][0], nu_2 - om_u[i][1], nu_3 - om_u[i][2]]),
  169.                               inverse_quat([q0_my[i], q1_my[i], q2_my[i], q3_my[i]])))
  170.  
  171.         q_df.append(quat_mult(quat_mult([q0_my[i], q1_my[i], q2_my[i], q3_my[i]],
  172.                                         [0, df1, df2, df3]),
  173.                               inverse_quat([q0_my[i], q1_my[i], q2_my[i], q3_my[i]])))
  174.         q_f.append(quat_mult(quat_mult([q0_my[i], q1_my[i], q2_my[i], q3_my[i]],
  175.                                         [0, f1[i], f2[i], f3[i]]),
  176.                               inverse_quat([q0_my[i], q1_my[i], q2_my[i], q3_my[i]])))
  177.        
  178.         x_E[i + 1] = x_E[i] + v_E[i] * deltat
  179.         x_N[i + 1] = x_N[i] + v_N[i] * deltat
  180.         x_U[i + 1] = x_U[i] + v_U[i] * deltat
  181.         v_E[i + 1] = v_E[i] + (q_f[:][i][1] - q_df[:][i][1]) * deltat
  182.         v_N[i + 1] = v_N[i] + (q_f[:][i][2] - q_df[:][i][1]) * deltat
  183.         v_U[i + 1] = v_U[i] + (q_f[:][i][3] - q_df[:][i][1]) * deltat
  184.         a_E[i + 1] = a_E[i] + (uE + nu_x[:][i][1]) * deltat
  185.         a_N[i + 1] = a_N[i] + (uN + nu_x[:][i][2]) * deltat
  186.         a_U[i + 1] = a_U[i] + (uU + nu_x[:][i][3]) * deltat
Advertisement
Add Comment
Please, Sign In to add comment