简介
我们来看一个简单的例子。
绕y轴旋转\(30^o\),三种表示。
- 矩阵 : \(R_y(30^o)=\begin{bmatrix}\cos 30^o & 0 & -\sin 30^o \\0 & 1 & 0 \\\sin 30^o & 0 & \cos 30^o \end{bmatrix}\)
- 欧拉角 :
- \(Heading(Yaw/y)\) =30
- \(pitch(x)\) =0
- \(bank(Roll/z)\) =0
- 四元数 : [0.9659 (0 0.2588 0)]
我们先要了解这三种旋转方式的优缺点:
任务/性质 | 旋转矩阵 | 欧拉角 | 欧拉角 |
---|---|---|---|
在坐标系间(物体和惯性)旋转点 | 能 | 不能(必须转换到矩阵) | 不能(必须转化到矩阵) |
连接或增量旋转 | 能,但经常比四元数慢,小心矩阵蠕变的情况 | 不能 | 能,比矩阵快 |
插值 | 基本上不能 | 能,但可能遭遇万向锁或其他问题 | Slerp,提供了平滑插值 |
易用程度 | 难 | 易 | 难 |
在内存或文件存储 | 9个数 | 3个数 | 4个数 |
对给定方位的表达方式是否唯一 | 是 | 不是,对同一方位有无数多种方法 | 不是,有两种方法,他们互相为互 |
可能导致非法 | 矩阵蠕变 | 任意三个数能构成合法的欧拉角 | 可能会出现误差累计,从而产生非法的四元数 |
矩阵
平面二维旋转
如下图,XY坐标系中,向量OP旋转β角度到了OP'的位置:
根据三角函数关系,可以列出向量OP与OP'的坐标表示形式:
\(\begin{cases} & x = |OP|*\cos \alpha\\ & y=|OP|*sin \alpha \end{cases}\)
\(\begin{cases} & x^\prime = |OP|*\cos (\alpha+\beta) \\ & y^\prime=|OP|*sin (\alpha+\beta) \end{cases}\)
对比上面个两个式子,将第2个式子展开:
\(\begin{cases} & x^\prime = |OP|*\cos (\alpha+\beta) =|OP|*(\cos\alpha*\cos\beta-\sin\alpha*\sin\beta)=x*\cos\beta-y*\sin\beta \\ & y^\prime=|OP|*sin (\alpha+\beta) =|OP|*(\cos\alpha*\sin\beta+\sin\alpha*\cos\beta)=x*\sin\beta+y*\cos\beta \end{cases}\)
用矩阵形式重新表示为:
\(\begin{bmatrix}x^\prime \\y\prime \end{bmatrix}= \begin{bmatrix}\cos\beta & -\sin\beta\\ \sin\beta & \cos\beta\end{bmatrix}* \begin{bmatrix}x \\ y \end{bmatrix}\)
这就是二维旋转的基本形式,中间的矩阵即二维旋转的旋转矩阵,坐标中的某一向量左乘该矩阵后,即得到这个向量旋转β角后的坐标。
三维旋转
三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,只考虑绕X、Y、Z轴的旋转。
绕Z轴
参照上面的图,添加一个Z轴,则上面的二维旋转实际上就是绕Z轴的三维旋转
照搬上面的推导公式,并添加Z坐标的变换关系(实际是没有变),然后改写成矩阵形式,红色方框即为绕Z轴的旋转矩阵。
\(\begin{cases} x^\prime=x*\cos\beta-y*\sin\beta \\y^\prime=x*\sin\beta+y*\cos\beta \\z^\prime=z \end{cases}\)
\(\begin{bmatrix} x^\prime \\y^\prime \\z^\prime \end{bmatrix}= \begin{bmatrix} \cos\beta & -\sin\beta & 0 \\ \sin\beta & \cos\beta & 0 \\0 & 0 & 0 \end{bmatrix}* \begin{bmatrix} x \\y \\z \end{bmatrix}\)
绕Y轴
绕Y轴旋转同理,这里直接改变坐标轴的符号表示,注意坐标顺序要符合右手系,我这里用颜色区分了不同的轴。最终的矩阵形式要进一步改写成XYZ的顺序。红色方框即为绕Y轴的旋转矩阵。
\(\begin{cases} x^\prime=z*\sin\beta+x*\cos\beta \\y^\prime=y \\z^\prime=z*\cos\beta-x*\sin\beta \end{cases}\)
\(\begin{bmatrix} x^\prime \\y^\prime \\z^\prime \end{bmatrix}= \begin{bmatrix} \cos\beta & 0 & \sin\beta \\ 0 & 1 & 0 \\-\sin\beta & 0 & \cos\beta \end{bmatrix}* \begin{bmatrix} x \\y \\z \end{bmatrix}\)
绕X轴
参照绕Y轴的推导,可以得到绕X轴的结果。红色方框即为绕X轴的旋转矩阵。
\(\begin{cases} x^\prime=x \\y^\prime=y*\cos\beta-z*\sin\beta \\z^\prime=y*\sin\beta+z*\cos\beta \end{cases}\)
\(\begin{bmatrix} x^\prime \\y^\prime \\z^\prime \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\beta & -\sin\beta \\ 0 & \sin\beta & \cos\beta \end{bmatrix}* \begin{bmatrix} x \\y \\z \end{bmatrix}\)
绕任意方向旋转
平凡的我们是不需要知道的。
欧拉角
四元数
四元数记法
\(q=\left[ w , v \right]\) 其中\(v\)向量表示。
\(q=\left[ w , (x, y ,z) \right]\) 其中\(x,y,z\)都是复数。
\(q=[\cos{\theta/2} ,(\sin{\theta/2})n_x,(\sin{\theta/2})n_y,(\sin{\theta/2})n_z]\) 其中\(n\)表示任意向量
复数
在介绍四元数与 3D 旋转之间的关系之前,我们先来讨论一下复数(Complex
Number)的一些性质以及它与 2D 旋转之间的关系.四元数的很多性质在很
多层面上都与复数非常类似,所以理解复数的一些性质会对理解四元数非常
有帮助.
复数表示形式:\(z=a+bi\)
我们可以用向量来表示这个复数:\(\begin{bmatrix}a \\ b \end{bmatrix}\)
在平面上我们表示为:R𝑒 代表它的实部,纵坐标 𝐼𝑚 代表它的虚部:
两个复数\(z_1=a+bi,z_2=c+di\)相乘:
\(z_1z_2=(a+bi)(c+di)=ac+adi+bci+bdi^2\)
因为\(i^2=-1\)这可以进一步简化为:
\(z_1z_2=ac-bd+adi+bci=ac-bd+(bc+ad)i\)
如果仔细观察你就能发现,复数相乘的结果其实也是一个矩阵与向量相乘的
结果,也就是说:
\(z_1z_2=ac-bd+(bc+ad)i=\begin{bmatrix}a & -b \\b & a \end{bmatrix}=\begin{bmatrix}c \\ d \end{bmatrix}\)
右侧\(\begin{bmatrix}c \\ d \end{bmatrix}\)是用向量的形式来表示的 \(z_2\)。
左侧\(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\)则是\(z_1\)的矩阵。
我们可以发现,复数相乘这个运算,其实是与这个\(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\)矩阵所代表的变换是等价的。
复数与复数的相乘也可以表示为矩阵的相乘:
\(z_1z_2=\begin{bmatrix}a & -b \\b & a \end{bmatrix}\begin{bmatrix}c & -d \\d & c \end{bmatrix}= \begin{bmatrix}ac-bd & -(bc+ad) \\bc+ad & ac-bd \end{bmatrix}\)
除此之外,我们来看一下一些特殊复数的矩阵形式:
\(I=\begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix}=1\) (a=1,b=0)
\(i=\begin{bmatrix}0 & -1 \\ 1 & 0 \end{bmatrix}\) (a=0,b=1)
如果我们尝试对它进行平方,可以发现:
\(i^2=i*i=\begin{bmatrix}0 & -1 \\ 1 & 0 \end{bmatrix}\begin{bmatrix}0 & -1 \\ 1 & 0 \end{bmatrix}=\begin{bmatrix}-1 & 0 \\ 0 & -1 \end{bmatrix}=-I=-1\)
复数的模长与共轭:
在进行下一步的讨论之前,我们先定义一下复数的模长(Magnitude).如
果 \(𝑧 = 𝑎 + 𝑏𝑖\),那么它的模长为:
\(||z||=\sqrt{a^2+b^2}\)
接下来,我们定义复数的共轭(Conjugate).如果 \(𝑧 = 𝑎 + 𝑏𝑖\),那么它的共
轭:
\(\overline{z}=a-bi\)
复数相乘与 2D 旋转
现在,我们回到之前的话题,既然与复数的相乘代表着\(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\)矩阵所作出的变换,那这种变换代表着什么呢?
实际上,如果我们对这个矩阵进行一些变形,这个问题就很容易解决了
\(\begin{bmatrix}a & -b \\b & a \end{bmatrix}=\sqrt{a^2+b^2}\begin{bmatrix} \frac{a}{\sqrt{a^2+b^2}} & \frac{-b}{\sqrt{a^2+b^2}} \\ \frac{b}{\sqrt{a^2+b^2}} & \frac{a}{\sqrt{a^2+b^2}} \end{bmatrix}\)
我们将矩阵中每一个元素都除以了模长\(||z||=\sqrt{a^2+b^2}\)并将这一项提到了矩阵外面.经过这一变换,我们只需要观察一下复平面就能够解答之前的问题了:
在此省略一万字,更多学习请点击下面链接!!
......