四元数转欧拉角
四元数转欧拉角
参考文章:四元数和欧拉角的相互转换
四元数转欧拉角的奇异值问题
在四元数转欧拉角时遇到奇异值问题,可参考四元数和欧拉角的相互转换,在文章里面说明了。
那么将Z-Y-X欧拉角(或RPY角:绕固定坐标系的X-Y-Z依次旋转α,β,γ角)转换为四元数:
q = [ c o s γ 2 0 0 s i n γ 2 ] [ c o s β 2 0 s i n β 2 0 ] [ c o s α 2 s i n α 2 0 0 ] = [ c o s α 2 c o s β 2 c o s γ 2 + s i n α 2 s i n β 2 s i n γ 2 s i n α 2 c o s β 2 c o s γ 2 + c o s α 2 s i n β 2 s i n γ 2 c o s α 2 s i n β 2 c o s γ 2 + s i n α 2 c o s β 2 s i n γ 2 c o s α 2 c o s β 2 s i n γ 2 + s i n α 2 s i n β 2 c o s γ 2 ] q = \left[ \begin{matrix} cos\frac{\gamma}{2} \\ 0 \\ 0 \\ sin\frac{\gamma}{2} \end{matrix} \right] \left[ \begin{matrix} cos\frac{\beta}{2} \\ 0 \\ sin\frac{\beta}{2} \\ 0 \end{matrix} \right] \left[ \begin{matrix} cos\frac{\alpha}{2} \\ sin\frac{\alpha}{2} \\ 0 \\ 0 \end{matrix} \right] = \left[ \begin{matrix} cos\frac{\alpha}{2} cos\frac{\beta}{2} cos\frac{\gamma}{2} + sin\frac{\alpha}{2} sin\frac{\beta}{2} sin\frac{\gamma}{2} \\ sin\frac{\alpha}{2} cos\frac{\beta}{2} cos\frac{\gamma}{2} + cos\frac{\alpha}{2} sin\frac{\beta}{2} sin\frac{\gamma}{2} \\ cos\frac{\alpha}{2} sin\frac{\beta}{2} cos\frac{\gamma}{2} + sin\frac{\alpha}{2} cos\frac{\beta}{2} sin\frac{\gamma}{2} \\ cos\frac{\alpha}{2} cos\frac{\beta}{2} sin\frac{\gamma}{2} + sin\frac{\alpha}{2} sin\frac{\beta}{2} cos\frac{\gamma}{2} \end{matrix} \right] q=⎣ ⎡cos2γ00sin2γ⎦ ⎤⎣ ⎡cos2β0sin2β0⎦ ⎤⎣ ⎡cos2αsin2α00⎦ ⎤=⎣ ⎡cos2αcos2βcos2γ+sin2αsin2βsin2γsin2αcos2βcos2γ+cos2αsin2βsin2γcos2αsin2βcos2γ+sin2αcos2βsin2γcos2αcos2βsin2γ+sin2αsin2βcos2γ⎦ ⎤
根据上面的公式可以求出逆解,即由四元数 q = ( q 0 , q 1 , q 2 , q 3 ) q=(q_0,q_1,q_2,q_3) q=(q0,q1,q2,q3)或 q = ( w , x , y , z ) q=(w,x,y,z) q=(w,x,y,z)。到欧拉角的转换为:
[ α β γ ] = [ a r c t a n 2 ( q 0 q 1 + q 2 q 3 ) 1 − 2 ( q 1 2 + q 2 2 ) a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) a r c t a n 2 ( q 0 q 3 + q 1 q 2 ) 1 − 2 ( q 2 2 + q 3 2 ) ] \left[ \begin{matrix} \alpha \\ \beta \\ \gamma \end{matrix} \right] = \left[ \begin{matrix} arctan \frac{2(q_0 q_1 + q_2 q_3)}{1-2(q_1^2 + q_2^2)} \\ arcsin (2(q_0 q_2 - q_1 q_3)) \\ arctan \frac{2(q_0 q_3 + q_1 q_2)}{1-2(q_2^2 + q_3^2)} \end{matrix} \right] ⎣
⎡αβγ⎦
⎤=⎣
⎡arctan1−2(q12+q22)2(q0q1+q2q3)arcsin(2(q0q2−q1q3))arctan1−2(q22+q32)2(q0q3+q1q2)⎦
⎤
由于arctan
和arcsin
的取值范围在 − π 2 \frac{-\pi}{2} 2−π和 π 2 \frac{\pi}{2} 2π之间,只有180°,而绕某个轴旋转时范围是360°,因此要使用atan2
函数代替arctan
函数:
[ α β γ ] = [ a t a n 2 ( 2 ( q 0 q 1 + q 2 q 3 ) , 1 − 2 ( q 1 2 + q 2 2 ) ) a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) a t a n 2 ( 2 ( q 0 q 3 + q 1 q 2 ) , 1 − 2 ( q 2 2 + q 3 2 ) ) ] \left[ \begin{matrix} \alpha \\ \beta \\ \gamma \end{matrix} \right] = \left[ \begin{matrix} atan2(2(q_0 q_1 + q_2 q_3),1-2(q_1^2 + q_2^2)) \\ arcsin (2(q_0 q_2 - q_1 q_3)) \\ atan2 (2(q_0 q_3 + q_1 q_2), 1-2(q_2^2 + q_3^2)) \end{matrix} \right] ⎣
⎡αβγ⎦
⎤=⎣
⎡atan2(2(q0q1+q2q3),1−2(q12+q22))arcsin(2(q0q2−q1q3))atan2(2(q0q3+q1q2),1−2(q22+q32))⎦
⎤
对于tan(θ) = y / x :
θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2];
θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。
- 当 (x, y) 在第一象限, 0 < θ < PI/2
- 当 (x, y) 在第二象限 PI/2 < θ≤PI
- 当 (x, y) 在第三象限, -PI < θ < -PI/2
- 当 (x, y) 在第四象限, -PI/2 < θ < 0