本文主要是介绍视觉SLAM14精讲——三维空间刚体运动1.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
第一份工作是一家比较大的机器人企业,被迫在AI视觉的基础上自学SLAM。一开始接触的就是vslam14讲,现在想把一些心得和基础知识分享一下。但是目前网络上有关视觉SLAM14讲挺多了,所以本系列不会重复书本中已经有的基本内容,也不一定按顺序发表。想要体现的还是一些更深层的理解和书本意外的一些知识。
三位空间刚体运动
前两章的内容都是一些基础背景知识以及专业名词解释,因此我选择从第三章开始。第三章可以说是整本书,甚至整个3D计算视觉的基石。其中包含大量的数学内容,并需要非常好的空间想像能力。因此对这一章必须要有非常深的理解,才会有助于看懂后面的章节。
特殊正交群与特殊欧式群
旋转矩阵的理解
刚接触旋转向量的人可能会十分不适应这种表示方式,因为一般人直觉上更喜欢使用欧拉角来表示三维旋转,这种比较直观的方式。但是不得不承认,旋转矩阵在数学计算,尤其是编程方面是非常方便的(直接照公式敲的程度)。因此,深入了解旋转向量是非常重要的。
在十四讲中,对于旋转矩阵的推导非常干净利落。通过两组空间坐标的正交基,对等效坐标建立等式解出旋转矩阵的定义。如果我们只对空间坐标系的坐标轴进行旋转,则会有如下公式
R x ( β ) = [ 1 0 0 0 c o s β s i n β 0 − s i n β c o s β ] R_x(\beta) = \left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & cos\beta & sin\beta\\ 0 & -sin\beta & cos\beta \end{array} \right] Rx(β)= 1000cosβ−sinβ0sinβcosβ
R y ( β ) = [ c o s β 0 − s i n β 0 1 0 s i n β 0 c o s β ] R_y(\beta) = \left[ \begin{array}{ccc} cos\beta & 0 & -sin\beta\\ 0 & 1 & 0\\ sin\beta & 0 & cos\beta \end{array} \right] Ry(β)= cosβ0sinβ010−sinβ0cosβ
R z ( β ) = [ c o s β s i n β 0 − s i n β c o s β 0 0 0 1 ] R_z(\beta) = \left[ \begin{array}{ccc} cos\beta & sin\beta & 0\\ -sin\beta & cos\beta & 0\\ 0& 0 & 1 \end{array} \right] Rz(β)= cosβ−sinβ0sinβcosβ0001
观察上述公式有两个结论。
- 第一,我们可以通过欧拉角配合上述公式来构造我们所需要的旋转矩阵。构造旋转矩阵的时候需要注意旋转的先后顺序(群的性质,不满足交换律)。
- 其次,旋转某个轴的时候,另外两个轴并不是孤立的,而是会受到影响的。比如我们将一个右手表示的三维坐标周的y轴旋转90度(正数为逆时针),会发现此时z轴替换了原来x轴的位置,而此时x轴正指向下方。
因此,上述公式有着非常重要的意义,建议背下来。别怕,很好记。
旋转哪个轴,该位置就为1,划掉该位置的行和列(均为0)。对角线是cos,副对角线是sin。除了y轴旋转,负号都在左下角。
[ x 0 0 0 y 0 0 0 z ] \left[ \begin{array}{ccc} x & 0 & 0 \\ 0 & y & 0 \\ 0 & 0 & z \end{array} \right] x000y000z
旋转矩阵求逆在工程中的应用
特殊正交群的一个非常重要的性质就是R的转置和R的逆是等价的。 然而在实际变成过程中我们会经常会按照思维惯性来求取旋转矩阵的逆:
#python
R_inv = np.linalg.inv(R)#C++
##OPENCV
cv::Mat R_inv = R.inv();
##EIGEN
Eigen::Matrix3d R_inv = R.inverse()
但是求逆的算法多数情况下求取的是近似值,并且计算过程复杂。多数库的求逆算法并不会假设矩阵的正交性,因此会使用普通的求逆算法来对矩阵进行运算。那么既然有着特殊正交群的前提条件,就应该使用转置替代求逆操作。这样做的好处不止于使用方便,求取的结果是精确值而非近似值,并且在效率上优于直接求逆的方法。
#python
R_inv = R.T#C++
##OPENCV
cv::Mat R_inv = R.t();
##EIGEN
Eigen::Matrix3d R_inv = R.transpose();
这篇关于视觉SLAM14精讲——三维空间刚体运动1.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!