2020-10-13 四元数用法(不讲原理,只讲计算规则)
本文不讲四元数的定义,直接讲例子和代码。对象:刚体姿态坐标系:本体坐标系 BBB,参考坐标系 RRR,惯性坐标系 III涉及四元数:q=[q0qv]\boldsymbol q = \left[\begin{array}{l}q_0\\\boldsymbol q_v\end{array}\right]q=[q0qv]表示R→BR \rightarrow BR→B的四元数,q′=[q0′qv′]
本文不讲四元数的定义,直接讲操作实例和代码。
对象:刚体姿态
坐标系定义:
- 本体坐标系 B B B,
- 参考坐标系 R R R,
- 惯性坐标系 I I I
涉及四元数定义:
q = [ q 0 q v ] \boldsymbol q = \left[\begin{array}{l} q_0\\ \boldsymbol q_v \end{array}\right] q=[q0qv]表示 R → B R \rightarrow B R→B的四元数(也就是 B B B 相对于 R R R),
q ′ = [ q 0 ′ q v ′ ] \boldsymbol q'= \left[\begin{array}{l} q'_0\\ \boldsymbol q'_v \end{array}\right] q′=[q0′qv′]表示 I → R I \rightarrow R I→R的四元数(也就是 R R R 相对于 I I I),
q ′ ′ = [ q 0 ′ ′ q v ′ ′ ] \boldsymbol q''= \left[\begin{array}{l} q''_0\\ \boldsymbol q''_v \end{array}\right] q′′=[q0′′qv′′]表示 I → B I \rightarrow B I→B的四元数(也就是 B B B 相对于 I I I)。
定义:
q \boldsymbol q q 的逆表示为 q ˉ = [ q 0 − q v ] \bar \boldsymbol q = \left[\begin{array}{r} q_0\\ -\boldsymbol q_v \end{array}\right] qˉ=[q0−qv]
四元数乘法(从左向右):
【 I → B I \rightarrow B I→B的四元数】 = 【 I → R I \rightarrow R I→R的四元数】 ⊗ \otimes ⊗ 【 R → B R \rightarrow B R→B的四元数】
q ′ ′ = q ′ ⊗ q = [ q 0 ′ ∗ q 0 − q v ′ ⋅ q v q 0 ′ ∗ q v + q 0 ∗ q v ′ + q v ′ × q v ] \boldsymbol q''=\boldsymbol q' \otimes \boldsymbol q = \left[\begin{array}{l} q'_0*q_0- \boldsymbol q'_v \cdot \boldsymbol q_v\\ q'_0*\boldsymbol q_v+q_0*\boldsymbol q'_v+\boldsymbol q'_v \times \boldsymbol q_v \end{array}\right] q′′=q′⊗q=[q0′∗q0−qv′⋅qvq0′∗qv+q0∗qv′+qv′×qv]
【 R → B R \rightarrow B R→B的四元数】 = 【 R → I R \rightarrow I R→I的四元数】 ⊗ \otimes ⊗ 【 I → B I \rightarrow B I→B的四元数】
q = q ˉ ′ ⊗ q ′ ′ = [ q 0 ′ ∗ q 0 ′ ′ + q v ′ ⋅ q v ′ ′ q 0 ′ ∗ q v ′ ′ − q 0 ′ ′ ∗ q v ′ − q v ′ × q v ′ ′ ] \boldsymbol q=\bar \boldsymbol q' \otimes \boldsymbol q'' = \left[\begin{array}{l} q'_0*q''_0+ \boldsymbol q'_v \cdot \boldsymbol q''_v\\ q'_0*\boldsymbol q''_v - q''_0*\boldsymbol q'_v-\boldsymbol q'_v \times \boldsymbol q''_v \end{array}\right] q=qˉ′⊗q′′=[q0′∗q0′′+qv′⋅qv′′q0′∗qv′′−q0′′∗qv′−qv′×qv′′]
相应四元数旋转矩阵(从右向左):
【 I → B I \rightarrow B I→B的旋转矩阵】 = 【 R → B R \rightarrow B R→B的旋转矩阵】 × \times × 【 I → R I \rightarrow R I→R的旋转矩阵】
A ( q ′ ′ ) = A ( q ) A ( q ′ ) \boldsymbol{A}(\boldsymbol q'')=\boldsymbol{A}(\boldsymbol q)\boldsymbol{A}(\boldsymbol q') A(q′′)=A(q)A(q′)
其中
A ( q ) = ( q 0 2 − q v T q v ) I + 2 q v q v T − 2 q 0 [ q v × ] = [ 2 ( q 0 2 + q 1 2 ) − 1 2 ( q 1 q 2 + q 0 q 3 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 1 q 2 − q 0 q 3 ) 2 ( q 0 2 + q 2 2 ) − 1 2 ( q 2 q 3 + q 0 q 1 ) 2 ( q 1 q 3 + q 0 q 2 ) 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 0 2 + q 3 2 ) − 1 ] \begin{array}{l} \boldsymbol{A}(\boldsymbol{q})=\left(q_{0}^{2}-\boldsymbol{q}_{v}^{\mathrm{T}}\boldsymbol{q}_{v} \right) \boldsymbol{I}+2 \boldsymbol{q}_{v} \boldsymbol{q}_{v}^{\mathrm{T}}-2 q_{0}\left[\boldsymbol{q}_{v} \times\right] \\ ={\left[\begin{array}{lll} 2\left(q_{0}^{2}+q_{1}^{2}\right)-1 & 2\left(q_{1} q_{2}+q_{0} q_{3}\right) & 2\left(q_{1} q_{3}-q_{0} q_{2}\right) \\ 2\left(q_{1} q_{2}-q_{0} q_{3}\right) & 2\left(q_{0}^{2}+q_{2}^{2}\right)-1 & 2\left(q_{2} q_{3}+q_{0} q_{1}\right) \\ 2\left(q_{1} q_{3}+q_{0} q_{2}\right) & 2\left(q_{2} q_{3}-q_{0} q_{1}\right) & 2\left(q_{0}^{2}+q_{3}^{2}\right)-1 \end{array}\right]} \end{array} A(q)=(q02−qvTqv)I+2qvqvT−2q0[qv×]=⎣⎡2(q02+q12)−12(q1q2−q0q3)2(q1q3+q0q2)2(q1q2+q0q3)2(q02+q22)−12(q2q3−q0q1)2(q1q3−q0q2)2(q2q3+q0q1)2(q02+q32)−1⎦⎤
或者
A ( q ) = I − 2 q 0 [ q v × ] + 2 [ q v × ] [ q v × ] \boldsymbol{A}(\boldsymbol{q})=\boldsymbol{I}-2q_{0}\left[\boldsymbol{q}_{v} \times\right] +2\left[\boldsymbol{q}_{v} \times\right] \left[\boldsymbol{q}_{v} \times\right] A(q)=I−2q0[qv×]+2[qv×][qv×]
和
[ q v × ] = [ 0 − q 3 q 2 q 3 0 − q 1 − q 2 q 1 0 ] \begin{array}{r} {\left[\boldsymbol{q}_{v} \times\right]=\left[\begin{array}{ccc} 0 & -q_{3} & q_{2} \\ q_{3} & 0 & -q_{1} \\ -q_{2} & q_{1} & 0 \end{array}\right]} \end{array} [qv×]=⎣⎡0q3−q2−q30q1q2−q10⎦⎤
Matlab代码
function L = TransMatrix(quat)
quat_0=quat(1);quat_1=quat(2);quat_2=quat(3);quat_3=quat(4);
L = [2*(quat_0^2+quat_1^2)-1 2*(quat_1*quat_2+quat_0*quat_3) 2*(quat_1*quat_3-quat_0*quat_2); ...
2*(quat_1*quat_2-quat_0*quat_3) 2*(quat_0^2+quat_2^2)-1 2*(quat_2*quat_3+quat_0*quat_1); ...
2*(quat_1*quat_3+quat_0*quat_2) 2*(quat_2*quat_3-quat_0*quat_1) 2*(quat_0^2+quat_3^2)-1];
end
四元数的一些性质:
-
q v q v T − q v T q v I = [ q v × ] [ q v × ] \boldsymbol{q}_{v} \boldsymbol{q}_{v}^{\mathrm{T}}- \boldsymbol{q}_{v}^{\mathrm{T}}\boldsymbol{q}_{v}\boldsymbol{I}= \left[\boldsymbol{q}_{v} \times\right]\left[\boldsymbol{q}_{v} \times\right] qvqvT−qvTqvI=[qv×][qv×]
-
旋转矩阵 A ( q ) \boldsymbol{A}(\boldsymbol{q}) A(q)的特征值是: 2 q 0 2 − 1 − 2 q 0 ( q 0 2 − 1 ) 1 2 2 q_0^2-1-2q_0\left(q_0^2-1\right)^{\frac{1}{2}} 2q02−1−2q0(q02−1)21, 2 q 0 2 − 1 + 2 q 0 ( q 0 2 − 1 ) 1 2 2 q_0^2-1+2q_0\left(q_0^2-1\right)^{\frac{1}{2}} 2q02−1+2q0(q02−1)21,和 1 1 1.
-
对于 q = [ q 0 q v ] \boldsymbol q = \left[\begin{array}{l} q_0\\ \boldsymbol q_v \end{array}\right] q=[q0qv],当 q 0 = 0 q_0=0 q0=0时,则有 q v T q v = 1 \boldsymbol q^T_v\boldsymbol q_v=1 qvTqv=1,也可以推出 q v q v T − q v × q v × = I \boldsymbol q_v\boldsymbol q^T_v-\boldsymbol q^{\times}_v\boldsymbol q^{\times}_v=\boldsymbol{I} qvqvT−qv×qv×=I
-
[ q 0 q v ] \left[\begin{array}{r} q_0\\ \boldsymbol q_v \end{array}\right] [q0qv]和 [ − q 0 − q v ] \left[\begin{array}{r} -q_0\\ -\boldsymbol q_v \end{array}\right] [−q0−qv]表示同样的姿态, [ − q 0 q v ] \left[\begin{array}{r} -q_0\\ \boldsymbol q_v \end{array}\right] [−q0qv]和 [ q 0 − q v ] \left[\begin{array}{r} q_0\\ -\boldsymbol q_v \end{array}\right] [q0−qv]表示同样的姿态。
-
四元数的代数性质: q a T ( q b ⊗ q c ) = q c T ( q b ∗ ⊗ q a ) = q b T ( q a ⊗ q c ∗ ) \boldsymbol q^T_a(\boldsymbol q_b \otimes \boldsymbol q_c)=\boldsymbol q^T_c(\boldsymbol q^*_b \otimes \boldsymbol q_a)=\boldsymbol q^T_b(\boldsymbol q_a \otimes \boldsymbol q^*_c) qaT(qb⊗qc)=qcT(qb∗⊗qa)=qbT(qa⊗qc∗)

Vec ( b ∗ ⊗ a ) = − Vec ( a ∗ ⊗ b ) \text{Vec}(\mathbf{b}^{*} \otimes \mathbf{a})=-\text{Vec}(\mathbf{a}^{*} \otimes \mathbf{b}) Vec(b∗⊗a)=−Vec(a∗⊗b) -
for any x ∈ R 3 , A ∈ R 3 × 3 , and R ∈ S O (3) \text { for any } \boldsymbol{x} \in \mathbf{R}^{3}, \boldsymbol{A} \in \mathbf{R}^{3 \times 3} \text {, and } \boldsymbol{R} \in \mathrm{SO} \text { (3) } for any x∈R3,A∈R3×3, and R∈SO (3)
tr ( A ( x ) ∧ ) = 1 2 tr [ ( x ) ∧ ( A − A T ) ] = − x T ( A − A T ) ∨ ( x ) ∧ A + A T ( x ) ∧ = [ ( tr ( A ) I 3 − A ) x ] ∧ R ( x ) ∧ R T = ( R x ) ∧ \begin{aligned} &\operatorname{tr}\left(\boldsymbol{A}(\boldsymbol{x})^{\wedge}\right)=\frac{1}{2} \operatorname{tr}\left[(\boldsymbol{x})^{\wedge}\left(\boldsymbol{A}-\boldsymbol{A}^{\mathrm{T}}\right)\right]=-\boldsymbol{x}^{\mathrm{T}}\left(\boldsymbol{A}-\boldsymbol{A}^{\mathrm{T}}\right)^{\vee} \\ &(\boldsymbol{x})^{\wedge} \boldsymbol{A}+\boldsymbol{A}^{\mathrm{T}}(\boldsymbol{x})^{\wedge}=\left[\left(\operatorname{tr}(\boldsymbol{A}) \boldsymbol{I}_{3}-\boldsymbol{A}\right) \boldsymbol{x}\right]^{\wedge} \\ &\boldsymbol{R}(\boldsymbol{x})^{\wedge} \boldsymbol{R}^{\mathrm{T}}=(\boldsymbol{R} \boldsymbol{x})^{\wedge} \end{aligned} tr(A(x)∧)=21tr[(x)∧(A−AT)]=−xT(A−AT)∨(x)∧A+AT(x)∧=[(tr(A)I3−A)x]∧R(x)∧RT=(Rx)∧
∧ ^{\wedge} ∧也就是上面的叉乘算子, ∨ ^{\vee} ∨是其逆算子
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)