外积
原来高数学过,大小为|a||b|sin<a,b> ;它可以表示旋转,运用右手法则,
欧拉变换(旋转矩阵)
坐标系之间的欧拉变换,类似于机器人的tf变换,对于某一向量在不同坐标系之间的表示,由于不管怎么变换,向量在各个坐标系下的长度夹角都不会发生变化,只是由旋转和平移两部分组成,首先来考虑旋转,设(e1,e2,e3)经过一次旋转变成(e1’,e2’,e3’),如
左乘
R就是描述旋转本身,因此它又称为旋转矩阵
而事实上旋转矩阵又是一个行列式为1的正交矩阵,反之,行列式为1的正交矩阵也是一个旋转矩阵,把这个集合定义如下:
平移的话只需 a’ = Ra+t
齐次坐标
如果我们进行了两次旋转与平移就是
这看起来过于复杂,而运用其次坐标可以将矩阵乘法与加法合二唯一,就是将三维向量,变为四维向量的投影
这样上面的计算可转为
判断齐次不齐次让我们厌烦,我们就直接把它记为 b=Ta,默认为齐次对于T的结构,左上角为旋转矩阵,右侧为平移向量,左下角为0向量,右下角为1,为了方便,写Ta时是齐次,写Ra时是非齐次
旋转向量与欧拉角
旋转向量
因为旋转矩阵有九个量,但一次旋转只有三个自由度,因此表达方式太过冗余,有没有更紧凑方便的方法呢,其实任意旋转平移都可以运用一个旋转向量和平移向量可表达一次变换
例如,旋转可以用一个旋转轴和一个旋转角来刻画,像是前面所说的外积,他的向量就和旋转轴一致,长度等于sin旋转角,而一个真正的旋转向量方向是旋转轴,大小是旋转角。
但是如何将旋转向量转化为旋转矩阵呢,假如一个旋转轴为n,角度为 θ \theta θ那他的旋转向量就是 θ \theta θn,这里运用了罗德里格斯公式
^符号为向量到反对称的转换符(可以去看外积的第一个公式),反之我们也可以用旋转矩阵来进行旋转向量的转换,
其中tr( R )为矩阵R的迹,就是主对角线相加的和,而转轴n就是矩阵R特征值1对应的特征向量。
欧拉角
由于不管是旋转矩阵和旋转向量,虽然它们能描述旋转,但是都太不直观,我们看到其中之一都不能知道他是如何旋转,我们就把他分解成三个分离的转角,分别绕XYZ轴旋转,
对于欧拉角比较常用的就是 “偏航-俯仰-滚转” (yaw-pitch-roll)三个角度来描述旋转,假设一个刚体在我们前方,面向我们的方向为X轴,右侧为Y轴,上方为Z轴,这样ZYX转角相当于把任意旋转分解成以下三个转角,
-
绕物体的 Z 轴旋转,得到偏航角 yaw;
-
绕旋转之后的 Y 轴旋转,得到俯仰角 pitch;
-
绕旋转之后的 X 轴旋转,得到滚转角 roll。
但是欧拉角虽然很直观,但是也会出现一些奇怪的东西,(欧拉角的奇异性),比如万向锁,在特定情况会发现缺少一个自由度的情况,这只举一个简单例子,想要深入理解可以自行百度
所以我们一般在表达旋转时不会用来用到欧拉角四元数
四元数是一种不带奇异性的三维向量描述方式,向之前学过的复数,在复平面中,复数就是复平面的向量,复数乘法可表达为复向量的旋转,例如乘上一个 i 就如同负向量在复平面旋转90度,四元数就是类似与复数的代数,但是它是有三个虚部
例如一个四元数 q q q,就会表示为
q = q 0 + q 1 i + q 2 j + q 3 k q = q_0+ q_1i+q_2j+q_3k