【视觉SLAM十四讲】学习笔记-第三讲

其他章节:
    第二讲:初识SLAM

三维空间刚体运动

        本讲介绍视觉SLAM的基本问题之一:一个刚体在三维空间中的运动是如何描述的。

旋转矩阵

        为了用数学语言描述物体的坐标,引入点和向量:在一个确定的坐标系下,也就是一个线性空间的基为 ( e 1 , e 2 , e 3 ) (e_1,e_2,e_3) (e1,e2,e3),那么向量 a a a的坐标为:
a = [ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = a 1 e 1 + a 2 e 2 + a 3 e 3 a=[e_1,e_2,e_3]\begin{bmatrix}a_1 \\ a_2 \\ a_3 \end{bmatrix} = a_1e_1 + a_2e_2 + a_3e_3 a=[e1,e2,e3] a1a2a3 =a1e1+a2e2+a3e3
        描述两个坐标系之间的旋转后平移的关系,统称为坐标系之间的变换关系。而欧式变换指的是:同一个向量在各个坐标系下的长度和夹角都不会发生变化。
        设某个单位正交基 ( e 1 , e 2 , e 3 ) (e_1,e_2,e_3) (e1,e2,e3)经过一次选择变成了 ( e 1 ′ , e 2 ′ , e 3 ′ ) (e_1',e_2',e_3') (e1,e2,e3)
,对于同一个向量 a a a在两个坐标系下的坐标为 [ a 1 , a 2 , a 3 ] T [a_1,a_2,a_3]^T [a1,a2,a3]T [ a 1 ′ , a 2 ′ , a 3 ′ ] T [a_1',a_2',a_3']^T [a1,a2,a3]T。根据坐标的定义:
在这里插入图片描述
        同时左乘 e T e^T eT,得到了矩阵 R R R,也就是旋转矩阵。
在这里插入图片描述
        根据旋转矩阵的性质,可定义旋转矩阵的集合,也就是特殊正交群:
S O ( n ) = { R ∈ R n ∗ n ∣ R R T = I , d e t ( R ) = 1 } SO(n)=\{R \in \Reals^{n\ast n} | RR^T = I, det(R) = 1\} SO(n)={RRnnRRT=I,det(R)=1}

关于旋转矩阵是正交矩阵的证明,可以看:证明:旋转矩阵是正交矩阵

        在欧氏变换中,除了旋转之外还有平移。那么世界坐标系中的向量 a a a经过一次旋转( R R R)和一次平移( t t t)后,得到了 a ′ a' a,即: a ′ = R A + t a'=RA+t a=RA+t。其中, t t t称为平移向量。
        由于多次变换会导致形式越来越复杂, 因此,引入齐次坐标和变换矩阵重写式,这样的话就把旋转和平移写在同一个矩阵里了。其中, T T T称为变换矩阵,记 a ~ = [ a 1 ] \widetilde{a} = {a \brack 1} a =[1a]
在这里插入图片描述

旋转向量与欧拉角

        虽然已经有旋转矩阵,但是有表达冗余和正交矩阵的约束的缺点,因此,引入轴角来刻画。首先,旋转向量:使用一个向量,其方向与旋转轴一致,而长度等于旋转角。
        转换关系由罗德里格斯公式表明:
在这里插入图片描述
        转角 θ = a r c c o s ( t r ( R ) − 1 2 ) \theta=arccos(\frac{tr(R)-1}{2}) θ=arccos(2tr(R)1);旋转轴 R n = n Rn=n Rn=n

        欧拉角是吧一个旋转分解成三次绕不同轴的旋转,比较常见的使用“偏航-俯仰-滚转(yaw-pitch-roll)”来描述

四元数

        四元数是一种扩展的复数,有三个虚部,可以表达三维空间中的旋转: q = q 0 + q 1 i + q 2 j + q 3 k q=q_0+q_1i+q_2j+q_3k q=q0+q1i+q2j+q3k,有时候也用一个标量和一个向量来表达: q = [ s , v ] , s = q 0 ∈ R , v = [ q 1 , q 2 , q 3 ] T ∈ R 3 q=[s,v], s=q_0 \in R, v=[q_1,q_2,q_3]^T \in R^3 q=[s,v],s=q0R,v=[q1,q2,q3]TR3
        虚部之间的关系:
在这里插入图片描述

小结表格来源:高翔视觉slam十四讲书籍习题(第三讲)

在这里插入图片描述

实践

Eigen

        编程部分参考书,里面每个部分都有很详细的解释,CMakeLists的写法可以参考官方代码仓库:

cmake_minimum_required( VERSION 2.8 )
project( useEigen )

set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-O3" )

# 添加Eigen头文件
include_directories( "/usr/include/eigen3" )

add_executable( eigenMatrix eigenMatrix.cpp )

        使用cmake .生成Makefile,再用make编译。
在这里插入图片描述
        运行结果如下,为了便于理解,多加了一些解释性的输出:
在这里插入图片描述

Eigen几何模块

        运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值