视觉SLAM14精讲——三维空间刚体运动1.0

视觉SLAM14精讲

  1. 三维空间刚体运动1.0
  2. 三维空间刚体运动1.1
  3. 三维空间刚体运动1.2
  4. 李群与李代数2.1
  5. 相机与图像3.1

简介


第一份工作是一家比较大的机器人企业,被迫在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β010sinβ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();
  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值