第三讲 三维空间的刚体运动
三维刚体运动,由平移和旋转构成。平移简单,旋转就麻烦些了。这一章的重点就是描述旋转,设计核心概念为:旋转矩阵,变换矩阵,四元数以及欧拉角。
一、旋转矩阵
1、向量的内积、外积及其几何意义
(1)内积a.b = |a|*|b|*cos,结果是一个数值而非向量,几何上表示向量间的投影关系
(2)外积a x b = a^b,结果是一个垂直于a,b向量构成的平面的向量,大小为|a|*|b|*sin,很容易注意到,其大小是a与b围成的三角形的面积,所以我们也把这样的结果叫做有向面积。显然,根据外积的值能推断出a到b的旋转角度,所以我们也可以用外积表示向量的旋转。
2、坐标系间的欧式变换
欧拉变换公式:a' = Ra + t
a'----物体位姿相对新坐标系的位姿
R----旋转矩阵,它是欧拉变换的关键
a----物体相对原坐标系的位姿
t----物体的平移
3、旋转矩阵的性质:
(1)它是一个行列式为1的正交矩阵(与其转置矩阵相乘结果为单位矩阵),反之行列式为1的正交矩阵也一定是旋转矩阵
(2)特殊正交群:SO(n) = {R|R*R' = I,det(R) = 1},其中R为一个nxn矩阵,R'是其转置矩阵,det(R)为其行列式。SO(n)就是n维空间中旋转矩阵的集合,当然我们讨论最多的就是SO(3)。
(3)有了旋转矩阵,我们描述相机位姿时,可以直接聊矩阵了,而无需从基(坐标系)开始。体现在欧拉变换公式上,公式右边的R和t都是绝对量,只有输入值(向量a)是一个相对量。就是说,我们用R和t两个参数,就完整的描述了坐标变换关系。
4、变换矩阵:如果坐标系经过多次变换,那么对应的欧拉变换式就会变得越来越复杂,所以我们引入了变换矩阵。这是一个数学技巧,它将旋转和平移都放入同一个矩阵(变换矩阵)中,使得多次变换对应的欧拉变换式依然是齐次的:C=T2*B = T2*T1*A。
二、Eigen实践
本节讲eigen的用法。这里有一份代码比较注释比较详细,就不写那么多了。我就在这里留点简介吧
1、eigen是一个流行的矩阵工具库,有了它,我们在进行矩阵、向量的计算时,就方便得多
2、作为一个软件工具库,它有个特点就是,只有h文件而没有.a、.so等二进制文件,所以在CMakeLists.txt中,我们只需要引入eigen库的头文件目录(include_directories,但更好的方式还是find_package),而无须链接库文件。
3、在mac上的使用步骤:
(1)先执行locate eigen3查看是否安装,ubuntu也可执行此命令
(2)homebrew安装eigen
(3)CMakeLists.txt中添加include_directories("/usr/include/eigen3"),ubuntu中也是这个默认路径。不同人默认路径可能不同,用find_package最好。
三、旋转向量与欧拉角:
1、意义:利用向量外积的定义,方向表示旋转方向(右手定则),大小表示旋转角度大小。
2、旋转向量与旋转矩阵之间有一个换算关系,背下来。
3、欧拉角:偏航-俯仰-滚转,很容易理解
四、四元数:
1、意义:对照复数来理解,实际上乘以虚数部分,就是旋转;
2、四元数与旋转的对应关系,背下来;
3、四元数的运算法则,只能理解加记忆了;
4、四元数与旋转向量、旋转矩阵的对应关系;
五、实践:visualizeGeometry
这里遇到的麻烦主要是pangolin的导入
1、跟着github地址上的步骤编译
2、执行sudo make install指令,成功后在/usr/local/include中生成了pangolin目录,将该目录添加到header search paths中,要报错,没解决
3、果断将跟着github上的https://github.com/gaoxiang12/slambook/tree/master/ch3/visualizeGeometry方式,使用cmake编译,运行成功!!