Compare commits

...
2 Commits
Author SHA1 Message Date
jinchao 2aa0484d00 更新四元数和矩阵互转 2025-04-13 22:23:49 +08:00
jinchao fda18ef058 细节改进 2025-04-09 23:19:02 +09:00
+105 -11
View File
@@ -197,7 +197,7 @@ z_1z_2&=(a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)i
$$
#### 3.4.2 四元数定义
四元数([Quaternion](https://en.wikipedia.org/wiki/Quaternion))可以视为对复数的扩充。 四元数有1个实部,3个虚部,形式如下
四元数([Quaternion](https://en.wikipedia.org/wiki/Quaternion))可以视为对复数的扩充,有1个实部,3个虚部,形式如下
$$
q=s+xi+yj+zk
$$
@@ -231,14 +231,14 @@ q_1-q_2&=[s_1-s_2,\quad \vec{v_1}-\vec{v_2}]\\
q_1q_2&=[s_1s_2-\vec{v_1}\cdot\vec{v_2},\quad s_1\vec{v_2}+s_2\vec{v_1}+\vec{v_1}\times\vec{v_2}]
\end{aligned}
$$
四元数的乘法满足满足结合律,但不满足交换律
四元数的乘法满足结合律,但不满足交换律
$$
\begin{aligned}
(q_1q_2)q_3&=q_1(q_2q_3)\\
q_1q_2&\neq q_2q_1
\end{aligned}
$$
但如果$q_1,q_2$中的两个向量部分平行,由于$\vec{v_1}\times\vec{v_2}=0$,易证
但如果$q_1,q_2$中的向量部分平行,由于$\vec{v_1}\times\vec{v_2}=0$,易证
$$
q_1q_2=q_2q_1\quad(when\quad \vec{v_1}\parallel\vec{v_2})
\tag{3.4.3.1}
@@ -268,11 +268,18 @@ $$
q^{-1}=\frac{\overline{q}}{\|q\|^2}\tag{3.4.4.2}
$$
四元数的逆满足如下运算
$$\begin{aligned}
(q_1q_2)^{-1}&=q_2^{-1}q_1^{-1}\\
(q_1q_2\ldots q_n)^{-1}&=q_n^{-1}\ldots q_2^{-1}q_1^{-1}
\end{aligned}\tag{3.4.4.3}
$$
(q_1q_2)^{-1}=q_2^{-1}q_1^{-1}
易知,如果是单位四元数
$$
\overline{q_1q_2\ldots q_n}=\overline{q_n}\ldots \overline{q_2}\,\overline{q_1}\tag{3.4.4.4}
$$
#### 3.4.5 四元数与向量
如果一个四元数的实部为0,那么称之为纯四元数(Pure Quaternion),由于纯四元数仅有3个虚部,可以将一个3D向量转换为一个纯四元数。设$q_v=[0,\vec{v}]$,那么
如果一个四元数的实部为0,那么称之为纯四元数(Pure Quaternion),由于纯四元数仅有3个虚部,可以将一个3D向量转换为一个纯四元数。记$q_v=[0,\vec{v}]$,那么
$$\begin{aligned}
\lambda q_v&=[0, \lambda\vec{v}]\\
q_{u}\pm q_{v}&=[0, \vec{u}\pm\vec{v}]
@@ -305,7 +312,7 @@ $$\begin{aligned}
$$
R_n(\vec{\boldsymbol{v}}_2)=\vec{\boldsymbol{v}}_2\cos(\theta)+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin(\theta)\tag{3.4.6.1}
$$
设两个纯四元数$q_n, q_v$
设两个纯四元数$q_n, q_{v2}$
$$\begin{aligned}
q_n&=[0, \vec{n}]\\
q_{v2}&=[0, \vec{v_2}]
@@ -319,8 +326,7 @@ q_nq_{v2}&=[-\vec{n}\cdot\vec{v_2},\quad\vec{n}\times\vec{v_2}]\\
所以$q_nq_{v2}$是一个纯四元数
由于3.4.6.1中都是线性计算,将3.4.6.2和3.4.6.3代入其中,可以得到$R_n(\vec{\boldsymbol{v}}_2)$的四元数形式
$$\begin{aligned}
R_n(\vec{\boldsymbol{v}}_2)&=\vec{\boldsymbol{v}}_2\cos\theta+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin\theta\\
&= q_v\cos\theta+q_nq_{v2}\sin\theta\\
\quad[0, R_n(\vec{\boldsymbol{v}}_2)]&= q_{v2}\cos\theta+q_nq_{v2}\sin\theta\\
&=(\cos\theta+q_n\sin\theta)q_{v2}\\
&=[\cos\theta, \vec{n}\sin\theta]q_{v2}\\
&=q(\theta, \vec{n})q_{v2}
@@ -340,7 +346,7 @@ $$
将3.4.6.4带入3.3.2.4中,可以得到罗德里格旋转公式的四元数形式为
$$\begin{aligned}
R_n(\vec{\boldsymbol{v}})&=\vec{\boldsymbol{v}}_1+R_n(\vec{\boldsymbol{v}}_2)\\
&=q_{v1}+q(\theta, \vec{n})q_{v2}\\
\quad[0,R_n(\vec{\boldsymbol{v}})]&=q_{v1}+q(\theta, \vec{n})q_{v2}\\
&=p\overline{p}q_{v1}+ppq_{v2}
\end{aligned}\tag{3.4.6.6}
$$
@@ -354,7 +360,7 @@ q_{v2}\overline{p}&=[0, \vec{v_2}][\cos\frac{\theta}{2},-\vec{n}\sin\frac{\theta
\end{aligned}$$
带入3.4.6.6,可以得到
$$\begin{aligned}
R_n(\vec{\boldsymbol{v}})&=pq_{v1}\overline{p}+pq_{v2}\overline{p}\\
\quad[0,R_n(\vec{\boldsymbol{v}})]&=pq_{v1}\overline{p}+pq_{v2}\overline{p}\\
&=p(q_{v1}+q_{v2})\overline{p}\\
&=pq_v\overline{p}
\end{aligned}\tag{3.4.6.7}
@@ -362,4 +368,92 @@ $$
也就是说,对于向量$\vec{v}$,围绕单位向量$\vec{n}$旋转$\theta$,只需要构造四元数$[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}]$,可以利用下面的等式计算旋转后的向量$\vec{v'}$
$$
[0, \vec{v'}]=[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}][0,\vec{v}][\cos\frac{\theta}{2}, -\vec{n}\sin\frac{\theta}{2}]
$$
$$
#### 3.4.7 四元数组合
使用四元数表达旋转有一个好处就是可以实现组合、插值等计算,例如一个向量$v$经过两次旋转变化,用四元数表示分别是$q_1,q_2$,那么
$$\begin{aligned}
q'&=q_2(q_1q_v\overline{q_1})\overline{q_2}\\
&=(q_2q_1)q_v(\overline{q_1}\,\overline{q_2})\\
\end{aligned}$$
根据公式3.4.4.4,可知
$$
q'=(q_2q_1)q_v(\overline{q_2q_1})
$$
#### 3.4.7 四元数转换为旋转矩阵
两个四元数相乘,可以转换为同等效果的矩阵,设两个四元数
$$\begin{aligned}
p=a+bi+cj+dk\\
q=s+xi+yj+zk
\end{aligned}$$
那么
$$\begin{aligned}
pq=&(a+bi+cj+dk)(s+xi+yj+zk)\\
=&(as−bx−cy−dz)+ \\
&(bs+ax−dy+cz)i+\\
&(cs+dx+ay−bz)j+\\
&(ds−cx+by+az)k\\
\end{aligned}$$
可以将左乘四元数$p$视作左乘矩阵$L(p)$
$$
L(p)=\begin{bmatrix}
a&-b&-c&-d \\
b&a&−d&c \\
c&d&a&−b \\
d&−c&b&a \\
\end{bmatrix}
$$
而右乘四元数$p$视作左乘矩阵$R(q)$
$$
Q(q)=\begin{bmatrix}
a&−b&−c&−d \\
b&a&d&-c \\
c&-d&a&b \\
d&c&-b&a \\
\end{bmatrix}
$$
那么旋转一个向量$\vec{v}$对应的四元数$q_v$的过程可以写作
$$
pq_v\overline{p}=L(p)R(\overline{p})q_v
$$
或者
$$
pq_v\overline{p}=R(\overline{p})L(p)q_v
$$
容易证明,这两个结果是一样的,经计算
$$\begin{aligned}
L(p)R(\overline{p})q_v&=\begin{bmatrix}
a&-b&-c&-d \\
b&a&−d&c \\
c&d&a&−b \\
d&−c&b&a \\
\end{bmatrix}\begin{bmatrix}
a&b&c&d \\
-b&a&-d&c \\
-c&d&a&-b \\
-d&-c&b&a \\
\end{bmatrix}\begin{bmatrix}0\\v_x\\v_y\\v_z\end{bmatrix}\\
&=\begin{bmatrix}
1&0&0&0\\
0&1-2c^2-2d^2&2bc-2ad&2ac+2bd\\
0&2bc+2ad&1-2b^2-2d^2&2cd-2ab\\
0&2bd-2ac&2ab+2cd&1-2b^2-2c^2
\end{bmatrix}\begin{bmatrix}0\\v_x\\v_y\\v_z\end{bmatrix}
\end{aligned}
$$
忽略掉四元数中为0的实数部分,可以将一个旋转四元数转换为旋转矩阵
$$
v'=\begin{bmatrix}
1-2c^2-2d^2&2bc-2ad&2ac+2bd\\
2bc+2ad&1-2b^2-2d^2&2cd-2ab\\
2bd-2ac&2ab+2cd&1-2b^2-2c^2
\end{bmatrix}\begin{bmatrix}v_x\\v_y\\v_z\end{bmatrix}
$$
其中
$$\begin{aligned}
a&=\cos(\theta/2)\\
b&=\sin(\theta/2)n_x\\
c&=\sin(\theta/2)n_y\\
d&=\sin(\theta/2)n_z
\end{aligned}
$$