目标:理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角;掌握Eigen库的矩阵、几何模块的使用方法。
1、旋转矩阵
-
刚体运动:两个坐标系之间的运动由一个旋转加上一个平移组成,这种运动成为刚体运动。
-
欧式变换:由旋转和平移组成。
-
向量运算
-
向量内积:
-
向量外积:
-
外积的结果是一个向量,方向垂直于a,b两个向量,大小为|a||b|sin<a,b>,是两个向量张成的四边形的有向面积。对外积计算,我们引入^符号,把a写成一个矩阵,事实上是一个反对称矩阵。
-
可以将^记成一个反对称符号,这样把两个向量外积a×b写成矩阵与向量的乘法a^b,把它变成了线性运算。该符号是一个一一映射,意味着任意向量都对应着唯一个反对称矩阵。
-
对于任意反对称矩阵,我们也能找到唯一与之对应的向量,把这个运算用符号表示。
-
-
-
旋转矩阵:刻画了旋转前后同一个向量的坐标变换关系,也叫方向弦矩阵。事实上,是一个行列式为1的正交矩阵。
-
特殊正交群:
-
向量a在两个坐标系下的坐标为a1,a2,它们之间的关系应该是:(代表把坐标系2的向量变换到坐标系1中,对应的是坐标系1原点指向坐标系2原点的向量。)
-
变换矩阵与齐次坐标
-
齐次坐标:在三维向量末尾添加1,将其变成四维向量,成为齐次坐标。
-
变换矩阵:对于四维向量,可以将旋转和平移写在一个矩阵里,使整个关系变成线性关系。
-
-
特殊欧式群:
-
矩阵相关知识
-
反对称矩阵A满足
-
正交矩阵即逆为自身转置的矩阵。
-
正定矩阵:A是n阶方阵,若对任何非零向量x,都有,就称A为正定矩阵。
-
半正定矩阵:设A是实对称矩阵,如果对任意的实非零列向量x有,就称A为半正定矩阵。
-
特征值与特征向量:给定方阵A,若存在一个非零向量v和一个标量,使。其中是矩阵A的特征值,而v是对应特征值的特征向量。特征值表示了在特征向量上的伸缩倍数,特征向量表示了在变换中保持方向不变的向量。
-
2、实践:Eigen
3、旋转向量和欧拉角
-
任意旋转都可以用一个旋转轴和一个旋转角来刻画。
-
旋转向量:我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角,这种向量成为旋转向量。可以描述这个旋转。
-
旋转向量到旋转矩阵的转换过程由罗德里格斯公式表名,转换结果:
-
旋转向量也有奇异性,发生在转角超过2π而产生周期性时。
-
-
欧拉角:使用3个分离的转角,把一个旋转分解成3次绕不同轴的旋转。
-
欧拉角一种常用的方式:偏航-俯仰-翻滚(yaw-pitch-roll)。
-
绕物体的Z轴旋转,得到偏航角yaw;
-
绕旋转之后的Y轴旋转,得到俯仰角pitch;
-
绕旋转之后的X轴旋转,得到翻滚角roll
-
-
万向锁问题(在俯仰角为±90°时,第一次旋转和第三次旋转将使用同一个轴,使得系统丢失了一个自由度,这被称为奇异性问题。)
-
4、四元数
-
旋转矩阵用9个量描述3自由度的旋转,具有冗余性;欧拉角和选择向量是紧凑的,但是有奇异性。四元数是一种扩展的复数,它是紧凑且没有奇异性,但不够直观且运算复杂。
-
二维情况下,旋转可以用单位复数来描述:(复平面的向量旋转)
-
三维,可以由单位四元数描述:,i,j,k是四元数的三个虚部,满足以下关系式:
-
也可以用一个标量和一个向量表达四元数:
-
若一个四元数的虚部为0,则成为实四元数;反之,若它的实部为0,则成为虚四元数。
-
四元数运算
-
两个四元数乘积的模即模的乘积。
-
四元数的共轭是把虚部取成相反数。四元数共轭与其本身相乘,会得到一个实四元数,其实部为模长的平方。
-
四元数和自己的逆的乘积为实四元数1.
-
-
四元数标识旋转
-
空间三维点:,用一个虚四元数描述:
-
旋转后的点p':,也可以:(不明白为什么?)
-
四元数到旋转向量的转换公式:
-
5、其他变化:相似、仿射、射影变换
变换名称 | 矩阵形式 | 自由度 | 不变性质 |
欧式变换 | 6 | 长度、夹角、体积 | |
相似变换 | 7 | 体积比 | |
仿射变换 | 12 | 平行性、体积比 | |
射影变换 | 15 | 接触平面的相交和相切 |
-
三维相似变换的几何叫相似变换群,记作Sim(3)
-
仿射变换,只要求A是可逆矩阵,不必是正交矩阵
6、安装第三方库报错
- Pangolin在cmake时报“Could NOT find GLEW”错误-CSDN博客
- slambook2 ,Pangolin 下载最新版本安装时,报错:Could NOT find OpenGL (missing: EGL),实际上已经安装过了,最终未能直接解决该问题。通过下载slambook代码库中的Pangolin.tar包安装成功。
- visualizeGeometry运行报错,参考以下解决在运行Pangolin时提示错误:Pangolin X11: Unable to retrieve framebuffer options_what(): pangolin x11: unable to retrieve framebuff-CSDN博客