四元數法求姿態角,九軸

2021-09-24 15:37:51 字數 2667 閱讀 3073

#第一版

import math

kp = 2.0 # 比例增益控制加速度計/磁強計的收斂速度

ki = 0.005 # 積分增益控制陀螺偏差的收斂速度

halft = 0.01 # 取樣週期的一半

def update_imu(ax, ay, az, gx, gy, gz, mx, my, mz):

global q0, q1, q2, q3

global exint, eyint, ezint

# 感測器框架相對於輔助框架的四元數(初始化四元數的值)

q0 = 1

q1 = 0

q2 = 0

q3 = 0

# 由ki縮放的積分誤差項(初始化)

exint = 0

eyint = 0

ezint = 0

q0q0 = q0*q0

q0q1 = q0*q1

q0q2 = q0*q2

q0q3 = q0*q3

q1q1 = q1*q1

q1q2 = q1*q2

q1q3 = q1*q3

q2q2 = q2*q2

q2q3 = q2*q3

q3q3 = q3*q3

# 測量正常化

norm = math.sqrt(ax * ax + ay * ay + az * az)

# 單元化

ax = ax / norm

ay = ay / norm

az = az / norm

norm = math.sqrt(mx * mx + my * my + mz * mz)

mx = mx / norm

my = my / norm

mz = mz / norm

hx = 2 * mx * (0.5 - q2q2 - q3q3) + 2 * my * (q1q2 - q0q3) + 2 * mz * (q1q3 + q0q2)

hy = 2 * mx * (q1q2 + q0q3) + 2 * my * (0.5 - q1q1 - q3q3) + 2 * mz * (q2q3 - q0q1)

hz = 2 * mx * (q1q3 - q0q2) + 2 * my * (q2q3 + q0q1) + 2 * mz * (0.5 - q1q1 - q2q2)

bx = math.sqrt((hx * hx) + (hy * hy))

bz = hz

# 估計方向的重力

vx = 2 * (q1q3 - q0q2)

vy = 2 * (q0q1 + q2q3)

vz = q0q0 - q1q1 - q2q2 + q3q3

wx = 2 * bx * (0.5 - q2q2 - q3q3) + 2 * bz * (q1q3 - q0q2)

wy = 2 * bx * (q1q2 - q0q3) + 2 * bz * (q0q1 + q2q3)

wz = 2 * bx * (q0q2 + q1q3) + 2 * bz * (0.5 - q1q1 - q2q2)

# 錯誤的領域和方向感測器測量參考方向之間的交叉乘積的總和

ex = (ay * vz - az * vy) + (my * wz - mz * wy)

ey = (az * vx - ax * vz) + (mz * wx - mx * wz)

ez = (ax * vy - ay * vx) + (mx * wy - my * wx)

# 積分誤差比例積分增益

exint += ex * ki*1/50

eyint += ey * ki*1/50

ezint += ez * ki*1/50

# 調整後的陀螺儀測量

gx += kp * ex + exint

gy += kp * ey + eyint

gz += kp * ez + ezint

# 整合四元數

q0 = q0 + (-q1 * gx - q2 * gy - q3 * gz) * halft

q1 = q1 + (q0 * gx + q2 * gz - q3 * gy) * halft

q2 = q2 + (q0 * gy - q1 * gz + q3 * gx) * halft

q3 = q3 + (q0 * gz + q1 * gy - q2 * gx) * halft

# 正常化四元數

norm = math.sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3)

q0 /= norm

q1 /= norm

q2 /= norm

q3 /= norm

# 獲取尤拉角 pitch、roll、yaw

pitch = math.asin(-2 * q1 * q3 + 2 * q0 * q2) * 57.3

roll = math.atan((2 * q2 * q3 + 2 * q0 * q1)/(-2 * q1 * q1 - 2 * q2 * q2 + 1)) * 57.3

yaw = math.atan((2 * q1 * q2 + 2 * q0 * q3)/(q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3)) * 57.3

return pitch, roll, yaw

微型四軸飛行器(5)九軸姿態融合演算法A

所謂的九軸姿態融合就是將通過感測器獲得的3軸加速度 3軸角速度 3軸磁場資料,在相應的演算法處理後能夠得到飛行器的姿態資訊 尤拉角 輸入輸出如下圖 在慣性導航領域的尤拉角分別表示的是航向角 yaw 橫滾角 roll 俯仰角 pitch 我們擬建一空間直角座標系,在該座標系中,物體做出的任何姿態同樣也...

微型四軸飛行器(5)九軸姿態融合演算法B

飛行器在空中的執行姿態可以用平面和轉動來表示,為了方便使用向量表示,需要建立兩個空間直角座標系。設r表示單位向量在機體座標系下的三個軸的投影,b表示單位向量在地球座標系下的三個軸的投影。我們通常對飛行器的偏航 俯仰 橫滾了多少度的定義是參照地球座標系而下得出的,也就是我們只需要知道向量r相較於向量b...

對四元數解算姿態的理解

問題 為什麼不用尤拉角來表示旋轉而要引入四元數呢?前面介紹了什麼是尤拉角,而且尤拉角微分方程解算姿態關係簡單明瞭,概念直觀容易理解,那麼我們為什麼不用尤拉角來表示旋轉而要引入四元數呢?一方面是因為尤拉角微分方程中包含了大量的三角運算,這給實時解算帶 來了一定的困難。而且當俯仰角為90度時方程式會出現...