1.旋转矩阵
2.旋转向量和欧拉角
3.四元数
向量 是空间中存在的有方向有长度的一样东西,向量不等于坐标,不同坐标系下向量的坐标表示也不尽相同。只有确定了一个坐标系,我们才能说这个向量的坐标是多少。
向量的外积运算
外积可以表示旋转,利用右手法则,大拇指朝向就是旋转向量的方向,事实也是的方向。所以到的旋转就可以由大拇指朝向的向量来表示,也就是说,在这个坐标系下,旋转可以用三个实数来描述(这三个实数就是的坐标)
同一个向量在不同坐标系下有不同的坐标表示,但这都表示的是一个向量,这个向量是固有存在的。
式 (3.5) 中的为旋转矩阵,旋转矩阵 的特殊性质:
旋转矩阵是行列式为 1 的正交矩阵(旋转矩阵的逆为自身转置,逆矩阵代表一个相反的旋转)
旋转矩阵的集合称之为特殊正交群
之前的变换表达式,如果发生多次变换,(2次),这样使得计算过于麻烦,所以引入一个自由度,利用齐次坐标和变换矩阵重写(3.7)
式子中的 称为变换矩阵,这种矩阵又称为特殊欧式群(Special Euclidean Group):
,同理,T的逆矩阵也代表一个相反的变换。
有九个量,但旋转自由度是3,T有16个量,但欧式变换自由度是6。
于是我们寻找更简洁的替代品,用一个旋转轴和旋转角来描述旋转,旋转轴为,旋转角为,旋转向量为
从旋转向量到旋转矩阵,由一个罗德里格斯公式表明
由上式可以推出
同时,由于转轴在旋转后不发生改变,说明 ,所以是矩阵特征值=1时,对应的特征向量
用三个分离的转角来描述旋转。欧拉角描述时。应该指定,旋转的转轴顺序。
yaw偏航角(绕Z轴) pitch俯仰角(绕Y轴) roll翻滚角(绕X轴) ypr对应ZYX。
ZYX的万向锁发生在pitch为度时。(好像是第二个旋转轴的度旋转时发生)
欧拉角和旋转向量都具有奇异性,需要不带奇异性的三维向量描述方式。
四元数是一种扩展的复数。既是紧凑的,也没有奇异性,缺点在于计算稍微复杂,表示不够直观。
一个四元数拥有一个实部和三个虚部
或者是用 此时,s称为实部,称为虚部。s=0虚四元数,实四元数。
四元数是复数的扩展,和复数不同的是,复数中乘以一个i代表逆时针旋转90度,而四元数里还乘以一个i代表旋转180度,而,代表需要绕着轴绕两圈才能回到原来的位置。
旋转向量与四元数
假设某个旋转 绕轴,转了度,那么这个旋转的四元数形式为
(3.14)
由上也可以反算对应的旋转轴和夹角
直观来看,四元数好像关于是转了一半的感觉,对(3.14)式加上一个,(从绕着转了和,是同一个旋转)
我们会得到一个为的四元数,这说明,同一个旋转可以由互为相反数的一对四元数表示。同理,=0时,得到的是一个没有任何旋转的实四元数,
现有两个四元数 , 或用向量表示
1)加减
实部实部相加,虚部虚部相加
2)乘法
乘法是将的每一项与的每一项相乘,最后相加
3)共轭
实部不变 虚部为相反数
4)模
5)逆
6)数乘与点乘
类似复数表达旋转,复平面上有一点为,旋转为, 变换后的坐标,
这里的四元数也可以这样近似理解,, 但是此时表示旋转的四元数为 (根据3.14式,绕着轴转了角)
旋转后的点可以表示为这样的乘积
(右手系以上公式为准,下图有误,应是其转置)
对于下面那个式子,只要第一个式子得出之后,求出q0,1,2,3其实非常简单。
部分公式懒得打,截取自http://blog.csdn.net/youngpan1101/article/details/71086851
这里我是用
来证明的,是分别只绕三个轴旋转而得到的旋转矩阵,
其中
这个推导很简单,其实就是一个轴不动,所以把旋转投影到另外两个轴的平面即可,另外两轴同理。此处略。
罗德里格斯公式
参考wiki百科 https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
或百度百科
https://baike.baidu.com/item/%E7%BD%97%E5%BE%B7%E9%87%8C%E6%A0%BC%E6%97%8B%E8%BD%AC%E5%85%AC%E5%BC%8F
其实思路很简单,如果向量与向量平行,绕着旋转轴轴转动,等于没有进行旋转。也就是说向量中与轴平行的分量,其实没有发生变化,真正旋转的是与轴垂直的分量。所以最终目标
让我们逐步分析
1)得到
为单位向量,由投影可知,
2)得到
3)引入
(注意,最后的只是为了说明,其大小为,坐标是依据坐标系的不同而不同的,这个式子是建立在以为x轴,为y轴的右手系坐标下的,其余坐标系可利用旋转关系得到。)
4)求解 ,原理见图
带入,
5)解得
6)解得
当然这里并不一定可逆,但暂时也没有找到其他直观的简易的得到的解法
总之,得到了罗德里格斯旋转公式
这个也很简单,利用四元数的乘法公式带入即可,注意只需要关心实部,还有可以认为是单位四元数,则四元数的逆等于共轭,对于更一般的情况只需要共轭除以一个模得到逆即可。
此处略
前文已经很细节了
习题5 习题6 习题7
都比较简单 不复述了
*
q1.normalize(); //可以实现归一化
//可以实现从四元数到旋转矩阵
Tcw.prerotate(q1);
Tcw.pretranslate(t2);