SLAM三维刚体运动(Eigen)
1、旋转矩阵
2、实践Eigen
1 | Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); //初始化为零 |
1 | -0.997497 0.617481 -0.299417 |
3、旋转向量和欧拉角
欧拉角–人机交互,方便人的理解;
计算时较少应用;
转换关系:
- 旋转向量(轴角)–》旋转矩阵:罗德里格斯公式Rodriguez‘s Formula
$$
R = cos\theta I + (1-cos \theta )nn^T + sin\theta n^{\hat{}} \tag{3.14}
$$
“^” 是向量到反对称的转换符(见3.3)
- 旋转矩阵-》旋转向量(轴角)
转角θ有:
$$
tr(R) = \cos\theta tr(I) + (1-\cos\theta)tr(nn^T) + \sin\theta tr(\hat{n}) \
= 3 \cos\theta + (1-\cos\theta ) \
= 1 + 2\cos(\theta)
\tag{3.15}
$$
因此
$$
\theta = arccos( \frac{tr(R)-1}{2}) \tag{3.16}
$$
转轴n:由于旋转轴上的向量在旋转后不发生改变,说明
$$
Rn=n
$$
因此,转轴n是矩阵R特征值1对应的特征向量;求解+归一化,就得到了旋转轴;
4、四元数
复数基础
《Visualizing Quaternions》,四元数可视化
大多数技术博客来说,写的已经非常全面详尽。但是对于复数和四元数的关联,四元数的指数对数运算,还有一些四元数的理解显然由于篇幅原因没有说的太清晰,个人觉得这部分参考上面推荐的书就行了,该文章最核心的部分在于对旋转的描述,通过实例,极为清晰地介绍了四元数怎么去旋转一个三维向量。下面给出文章的链接。
英文原版:Understanding Quaternions 中文翻译:理解四元数
《Quaternions For Computer Graphics》这本书对于四元数如何应用于旋转,从原理到实践都说的非常详细,正好弥补第一本书籍的不足。
四元数相比其他形式的优点:
- 解决万向节死锁(Gimbal Lock)问题
- 仅需存储4个浮点数,相比矩阵更加轻量
- 四元数无论是求逆、串联等操作,相比矩阵更加高效
主流应用:缩放向量+旋转四元数+平移向量
复数:
$$
z=a+bi \
(a, b 是任意实数) \
i^2 = -1 \
|z| = \sqrt{a^2+b^2}
$$
所以,复数z的矩阵形式定义为:
$$
z =
\left[
\begin{matrix}
a & -b \
b & a
\end{matrix}
\right]
$$
复数代表的2D旋转
复平面,假设向量z与实轴夹角为$\theta$,则:
$$
\theta = atan2(b,a) \
cos(\theta) = a / \sqrt{a^2 + b^2 } \
sin(\theta) = b / \sqrt{a^2 + b^2 } \
$$
所以:
$$
z = a +bi =
\left[
\begin{matrix}
a & -b \
b & a
\end{matrix}
\right]
= \sqrt{a^2 + b^2}
\left[
\begin{matrix}
a/\sqrt{a^2 + b^2} & -b/\sqrt{a^2 + b^2} \
b/\sqrt{a^2 + b^2} & a/\sqrt{a^2 + b^2}
\end{matrix}
\right] \
= \sqrt{a^2 + b^2}
\left[
\begin{matrix}
cos(\theta) & -sin(\theta) \
sin(\theta) & cos(\theta)
\end{matrix}
\right]
$$
其代表的是一个旋转+缩放变换:
1、逆时针旋转 $\theta$ 度
2、缩放$\sqrt{a^2 + b^2}$
四元数
$$
q = q_0 + q_1i + q_2j + q_3k \tag{3.17}
$$
三个虚部的关系:
$$
i^2 = j^2 = k^2 = -1 \
ij = k, ji = -k \
jk = i, kj = -i \
ik = j, ki = -j \tag{3.18}
$$
标量+向量,表达四元数
$$
q = [s, v] , s = q_0 \in R, v = [q_1, q_2, q_3]^T \in \R^3
$$
假设旋转是绕单位向量$n=[n_x, n_y, n_z]^T$进行了角度θ的旋转,那么四元数形式为:
角轴–》四元数
$$
q = [ cos\frac{\theta}{2}, n_x sin\frac{\theta}{2},
n_y sin\frac{\theta}{2}, n_z sin\frac{\theta}{2}, ]^T \tag{3.19}
$$
四元数-》角轴
$$
\theta = 2arccos(q_0) \
[n_x, n_y, n_z]^T = \frac{[q1, q2, q3]^T}{\sin( \frac{\theta}{2})}
\tag{3.20}
$$
运算
加减
乘法
共轭 $ q^*_a = s_a - x_ai - y_aj - z_ak = [s_a, -v_a]$
模长 $ ||q_a||= \sqrt{s_a^2 + x_a^2 + y_a^2 + z_a^2 } $
逆 $ q^{-1} = q^* / || q||^2$
数乘 $ kq = [ks, kv]$
点乘 $q_a \sdot q_b = s_a s_b + x_a x_b i+ y_a y_b j + z_a z_b k $
四元数表示旋转
三维空间点,用一个虚四元数表示
$$
p = [0, x, y, z ] = [0, v]
$$
四元数q表示旋转(参照3.19)
$$
q = [\cos(\frac{\theta}{2} ), n \sin(\frac{\theta}{2})]
$$
旋转后:
$$
p^{‘} = q p q^{-1}
$$
四元数与角轴的关系
5、*相似、仿射、射影变换
6、Eigen几何模块
7、可视化
世界坐标系(一旦确定,就永远固定)
相机坐标系
设某点在世界坐标系中坐标为$p_w$ ,在相机坐标系下为 $p_c$那么:
$$
p_c = T_{cw}p_w
\
p_w = T_{cw}^{-1}p_c \tag{3.40, 3.41}
$$
$p_c$ 取零向量,也就是相机坐标系的原点,那么,此时$p_w$就是相机原点在世界坐标系下的坐标:
$$
p_w = T_{wc}0 = t_{wc} \tag{3.42}
$$
这个正是T_wc的平移部分,因此可以从T_wc中直接看到相机在何处,这也是我们说T_wc更为直观的原因。
8、总结
1、
2、验证3.34(四元数旋转某个点后,结果是一个虚四元数,所以仍然对应一个三维空间点)
3、总结转换关系
—> | 旋转矩阵 | 轴角 | 欧拉角 | 四元数 |
---|---|---|---|---|
旋转矩阵 | - | 3.15 | ||
轴角 | 3.14 | - | \ | 3.19 |
欧拉角 | \ | - | ||
四元数 | 3.20 | - |
那么下文我们都采用ZXY顺规来推导公式!采用列主向量(column major)!(但是注意DirectXMath API生成的矩阵其实是行主向量(row major)的)
欧拉角–》旋转矩阵
$$
\begin{aligned}
R(\alpha, \beta, \gamma) &= R_y(\alpha)R_x(\alpha)R_z(\alpha) \
&= \left[\begin{matrix} cos\alpha & 0 & sin\alpha \ 0 & 1 & 0 \ -sin\alpha & 0 & cos\alpha \end{matrix} \right]
\left[\begin{matrix} 1 & 0 & 0 \ 0 & cos\beta & -sin\beta \ 0 & sin\beta & cos\beta \ \end{matrix}\right]
\left[\begin{matrix} cos\gamma & -sin\gamma & 0 \ sin\gamma & cos\gamma & 0 \ 0 & 0 & 1 \ \end{matrix}\right]
\
&= \left[\begin{matrix} c_1 & 0 & s_1 \ 0 & 1 & 0 \ -s_1 & 0 & c_1 \ \end{matrix}\right]
\left[\begin{matrix} 1 & 0 & 0 \ 0 & c_2 & -s_2 \ 0 & s_2 & c_2 \ \end{matrix}\right]
\left[\begin{matrix} c_3 & -s_3 & 0 \ s_3 & c_3 & 0\ 0 & 0 & 1 \ \end{matrix}\right]
\
&= \left[\begin{matrix} c_1 & s_1 s_2& s_1 c_2 \ 0 & c_2 & -s_2 \ -s_1 & c_1s_2 & c_1c_2\ \end{matrix}\right]
\left[\begin{matrix} c_3 & -s_3 & 0 \ s_3 & c_3 & 0\ 0 & 0 & 1 \end{matrix}\right]
\
&= \left[\begin{matrix} c_1 c_3 + s_1 s_2 s_3 & c_3s_1s_2 - c_1s_3& c_2s_1 \ c_2s_3 & c_2c_3& -s_2 \ 1 & s_1 s_3+c_1 c_3 s_2 & c_1 c_2 \ \end{matrix}\right]
\end{aligned}
\tag{100}
$$
其中:
$$
c1 = cos(\alpha)=cos(Y_{yaw}), s1 = sin\alpha = sin(Y_{yaw}) \
c2 = cos(\beta)=cos(X_{pitch}), s2 = sin\beta= sin(X_{pitch}) \
c3 = cos(\gamma)=cos(Z_{roll}), s3 = sin\gamma= sin(Z_{roll})
\tag{101}
$$
旋转矩阵–》欧拉角