Skip to content

三维空间的位姿描述

介绍了四种姿态表示方式:旋转矩阵欧拉角轴角四元数,以及它们之间相互转换关系的推导

位置描述

对欧氏三维空间中世界坐标系 \(\{O\}\) 下一点 \(P\),可用 \(^OP=\begin{pmatrix}p_x\\p_y\\p_z\end{pmatrix}\),描述其位置

姿态描述

旋转矩阵 Rotation Matrices

对于物体坐标系 \(\{O\}\) 下三个主轴的单位矢量 \(\hat X_O\)\(\hat Y_O\)\(\hat Z_O\) 在世界坐标系 \(\{W\}\) 上的投影 \(^W\hat X_O\)\(^W\hat Y_O\)\(^W\hat Z_O\),可以利用旋转矩阵 \(^W_OR\) 来表示物体坐标系的姿态

\[ \begin{aligned} ^W_OR = \begin{pmatrix}^W\hat X_O & ^W\hat Y_O & ^W\hat Z_O\end{pmatrix} = \begin{pmatrix} \hat X_O \cdot \hat X_W & \hat Y_O\cdot\hat X_W & \hat Z_O\cdot\hat X_W \\ \hat X_O \cdot \hat Y_W & \hat Y_O\cdot\hat Y_W & \hat Z_O\cdot\hat Y_W \\ \hat X_O \cdot \hat Z_W & \hat Y_O\cdot\hat Z_W & \hat Z_O\cdot\hat Z_W \\ \end{pmatrix} = \begin{pmatrix}^O\hat X_W^T \\ ^O\hat Y_W^T \\ ^O\hat Z_W^T\end{pmatrix} \end{aligned} \]

显然,这是一个正交矩阵

\[ \begin{aligned} ^W_OR^T\ ^W_OR = \begin{pmatrix}^W\hat X_O^T \\ ^W\hat Y_O^T \\ ^W\hat Z_O^T\end{pmatrix} \begin{pmatrix}^W\hat X_O & ^W\hat Y_O & ^W\hat Z_O\end{pmatrix} = I_3 \end{aligned} \]

进一步,由于旋转矩阵的所有行向量的模长均为1,且行向量之间两两正交,有 \(\det(R)=1\)

更普遍地,我们用 \(R = \begin{pmatrix}r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \\ \end{pmatrix}\) 来表示一个旋转矩阵

接下来我们推导绕任一轴旋转的旋转矩阵的表达形式

记三维空间中一任意向量 \(\bf v\) 绕旋转轴 \(\bf n=\begin{pmatrix}n_x\\n_y\\n_z\end{pmatrix}\) 旋转 \(\theta\) 得到新向量 \(\bf v_{rot}\),其中 \(\bf n\) 为单位向量,\(n_x^2+n_y^2+n_z^2=1\)

\(\bf v\) 可以根据平行和正交于 \(\bf n\) 分为两部分 \(\bf v_\parallel\)\(\bf v_\perp\),满足 \(\bf v=\bf v_\parallel+\bf v_\perp\)

其中

\[ \begin{cases} \bf v_\parallel = (\bf v\cdot\bf n)n \\ \bf v_\perp = \bf v-(\bf v\cdot\bf n)n = -\bf n\times(\bf n\times\bf v) \end{cases} \]

\[ \begin{aligned} \bf v_{rot} &= \bf v_{\parallel rot} + \bf v_{\perp rot} \\ &= \bf v_\parallel + \cos\theta\bf v_\perp + \sin\theta\bf n\times\bf v_\perp \\ &= (\bf v\cdot\bf n)n + \cos\theta\bf v_\perp + \sin\theta\bf n\times\bf v \\ &= \cos\theta\bf v+(1-\cos\theta)(\bf n\cdot\bf v)\bf n + \sin\theta\bf n\times\bf v \end{aligned} \]

上式就是 罗德里格斯旋转公式 Rodrigues' Rotation Formula,进一步我们令 \(\bf v\) 分别为 \(\begin{pmatrix}1&0&0\end{pmatrix}^T\)\(\begin{pmatrix}0&1&0\end{pmatrix}^T\)\(\begin{pmatrix}0&0&1\end{pmatrix}^T\)

解得

\[ \begin{aligned} \bf v_{rot} &= \cos\theta\begin{pmatrix}1\\0\\0\end{pmatrix}+(1-\cos\theta)\cdot n_x\begin{pmatrix}n_x\\n_y\\n_z\end{pmatrix}+\sin\theta\begin{pmatrix}0\\n_z\\-n_y\end{pmatrix} \\ &=\begin{pmatrix}(1-\cos\theta)n_x^2+\cos\theta\\(1-\cos\theta)n_xn_y+\sin\theta n_z\\(1-\cos\theta)n_xn_z-\sin\theta n_y\end{pmatrix} \end{aligned} \]
\[ \bf v_{rot}=\begin{pmatrix}(1-\cos\theta)n_yn_x-\sin\theta n_z\\(1-\cos\theta)n_y^2+\cos\theta\\(1-\cos\theta)n_yn_z+\sin\theta n_x\end{pmatrix} \]
\[ \bf v_{rot}=\begin{pmatrix}(1-\cos\theta)n_zn_x+\sin\theta n_y\\(1-\cos\theta)n_zn_y-\sin\theta n_x\\(1-\cos\theta)n_z^2+\cos\theta\end{pmatrix} \]

综上得到绕任意轴的旋转矩阵

\[ R=\begin{pmatrix}n_x^2(1-\cos\theta)+\cos\theta & n_xn_y(1-\cos\theta)-n_z\sin\theta & n_xn_z(1-\cos\theta)+n_y\sin\theta \\ n_yn_x(1-\cos\theta)+n_z\sin\theta & n_y^2(1-\cos\theta)+\cos\theta & n_yn_z(1-\cos\theta)-n_x\sin\theta \\ n_zn_x(1-\cos\theta)-n_y\sin\theta & n_zn_y(1-\cos\theta)+n_x\sin\theta & n_z^2(1-\cos\theta)+\cos\theta\end{pmatrix} \]

欧拉角 Euler Angles

定义

  • 顺规:合法的欧拉角组中,任何两个连续的旋转,必须绕着不同的转动轴旋转,因此一共有12种顺规,被划分为两大类:
    • 经典欧拉角 Proper Euler Angles: zxz, xyx, yzy, zyz, xzx, yxy
    • 泰特-布莱恩角 Tait-Bryan Angles: xyz, yzx, zxy, xzy, zyx, yxz 其中按zyx顺序旋转的情况又被称为RPY角或XYZ固定角
  • 内外旋:根据绕旋转后的新轴旋转还是绕世界坐标系中固定不动的轴旋转,欧拉角被分为内旋和外旋:
    • 内旋 Intrisic Rotation, 又称为动态旋转,绕物体坐标系旋转
    • 外旋 Extrinsic Rotation, 又称为静态旋转,绕世界坐标系旋转
    • 内旋与外旋具有等价性

欧拉角 2 旋转矩阵

\[ \begin{aligned} R &= R_Z(\gamma)R_Y(\beta)R_X(\alpha)= \begin{pmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} \cos\beta & 0 & \sin\beta \\ 0 & 1 & 0 \\ -\sin\beta & 0 & \cos\beta \\ \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha \\ 0 & \sin\alpha & \cos\alpha \\ \end{pmatrix} \\ \\ &=R_X^{-1}(\gamma)R_Y^{-1}(\beta)R_Z^{-1}(\alpha)= \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & \sin\alpha \\ 0 & -\sin\alpha & \cos\alpha \\ \end{pmatrix} \begin{pmatrix} \cos\beta & 0 & -\sin\beta \\ 0 & 1 & 0 \\ \sin\beta & 0 & \cos\beta \\ \end{pmatrix} \begin{pmatrix} \cos\gamma & \sin\gamma & 0 \\ -\sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \\ \end{pmatrix} \end{aligned} \]

旋转矩阵 2 欧拉角

以旋转顺序为 zyx 的内旋欧拉角为例

\[ \begin{aligned} R = R_Z(\gamma)R_Y(\beta)R_X(\alpha) &= \begin{pmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} \cos\beta & 0 & \sin\beta \\ 0 & 1 & 0 \\ -\sin\beta & 0 & \cos\beta \\ \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha \\ 0 & \sin\alpha & \cos\alpha \\ \end{pmatrix} \\ \\&= \begin{pmatrix} \cos\gamma\cos\beta & -\sin\gamma\cos\alpha+\cos\gamma\sin\beta\sin\alpha & \sin\gamma\sin\alpha+\cos\gamma\sin\beta\cos\alpha \\ \sin\gamma\cos\beta & \cos\gamma\cos\alpha+\sin\gamma\sin\beta\sin\alpha & -\cos\gamma\sin\alpha+\sin\gamma\sin\beta\cos\alpha \\ -\sin\beta & \cos\beta\sin\alpha & \cos\beta\cos\alpha \end{pmatrix} \end{aligned} \]

由此

\[ \begin{cases} \alpha = \arctan(\frac{r_{32}}{r_{33}}) \\ \beta = \arcsin(-r_{31}) \\ \gamma = \arctan(\frac{r_{21}}{r_{11}}) \\ \end{cases} \]

但当 \(\beta=\frac\pi2\) 时,\(R=\begin{pmatrix}0&-\sin(\gamma-\alpha)&cos(\gamma-\alpha)\\0&\cos(\gamma-\alpha)&\sin(\gamma-\alpha)\\1&0&0\end{pmatrix}\),旋转矩阵退化,无法解出唯一 \(\gamma\)\(\alpha\),这种情况被称为 奇异性 Singularity万向节死锁 Glimbal Lock,可以被视为三维空间的物体姿态无法通过三个实数进行完全表达。在实践中,可以预分析机械最难出现的姿态,并通过有意地设计欧拉角顺规,尽可能避免出现万向节死锁的情况。

轴角 Axis Angle

轴角通过两个参数描述一个旋转:一条轴和描述绕这个轴的旋转量的角度,记为 \(<axis,angle>=\begin{pmatrix}\left[a_x\\a_y\\a_z\right]^T,\theta\end{pmatrix}\)

轴角 2 旋转矩阵

由罗德里格斯旋转公式可推出绕任意轴旋转的旋转矩阵,具体推导见 旋转矩阵 Rotation Matrix

\[ R=\begin{pmatrix}a_x^2(1-\cos\theta)+\cos\theta & a_xa_y(1-\cos\theta)-a_z\sin\theta & a_xa_z(1-\cos\theta)+a_y\sin\theta \\ a_ya_x(1-\cos\theta)+a_z\sin\theta & a_y^2(1-\cos\theta)+\cos\theta & a_ya_z(1-\cos\theta)-a_x\sin\theta \\ a_za_x(1-\cos\theta)-a_y\sin\theta & a_za_y(1-\cos\theta)+a_x\sin\theta & a_z^2(1-\cos\theta)+\cos\theta\end{pmatrix} \]

旋转矩阵 2 轴角

观察上式,对给定旋转矩阵,有

\[ \begin{cases} \theta = \arccos(\frac12(r_{11}+r_{22}+r_{33}-1)) \\ a_x = \frac{r_{32}-r_{23}}{\sqrt{(r_{32}-r_{23})^2+(r_{13}-r_{31})^2+(r_{21}-r_{12})^2}} \\ a_y = \frac{r_{13}-r_{31}}{\sqrt{(r_{32}-r_{23})^2+(r_{13}-r_{31})^2+(r_{21}-r_{12})^2}} \\ a_z = \frac{r_{21}-r_{12}}{\sqrt{(r_{32}-r_{23})^2+(r_{13}-r_{31})^2+(r_{21}-r_{12})^2}} \\ \end{cases} \]

欧拉角 2 轴角

愉快地,我们可以利用 欧拉角 --> 四元数 --> 轴角 的方式得到

\[ \begin{cases} \theta=2*\arccos(\cos\gamma\cos\beta\cos\alpha-\sin\gamma\sin\beta\sin\alpha) \\ a_x=\sin\gamma\sin\beta\cos\alpha+\cos\gamma\cos\beta\sin \alpha\\ a_y=\sin\gamma\cos\beta\cos\alpha+\cos\gamma\sin\beta\sin\alpha\\ a_z=\cos\gamma\sin\beta\cos\alpha-\sin\gamma\cos\beta\sin\alpha \end{cases} \]

轴角 2 欧拉角

直接从轴角转为欧拉角比较困难,我们可以利用 轴角 --> 旋转矩阵 --> 欧拉角 的间接转化方式减少计算难度

\[ \begin{cases} \alpha = \arctan(\frac{a_ya_z(1-\cos\theta)-a_x\sin\theta}{a_z^2(1-\cos\theta)+\cos\theta}) \\ \beta = \arcsin(a_y\sin\theta-a_xa_z(1-\cos\theta)) \\ \gamma = \arctan(\frac{a_xa_y(1-\cos\theta)-a_z\sin\theta}{a_x^2(1-\cos\theta)+\cos\theta}) \\ \end{cases} \]

使用欧拉角进行表示时,某些情况会出现万向节锁和奇异的现象,需要特殊处理

四元数 Quaterions

不妨记四元数为 \(q=w+xi+yj+zk\),其中 \(i^2=j^2=k^2=ijk=-1\),而单位四元数满足 \(w^2+x^2+y^2+z^2=1\)

绕任意轴 \(n\) 旋转 \(\theta\) 的四元数,表示为 \(q=[w,x,y,z]=[\cos\frac\theta2,\sin\frac\theta2n_x,\sin\frac\theta2n_y,\sin\frac\theta2n_z]\)

轴角 2 四元数

\[ \begin{cases} w = \cos\frac\theta2 \\ x = a_x\sin\frac\theta2 \\ y = a_y\sin\frac\theta2 \\ z = a_z\sin\frac\theta2 \\ \end{cases} \]

四元数 2 轴角

\[ \begin{cases} \theta = 2*\arccos(w)\\ a_x=\frac{x}{\sqrt{1-w^2}}\\ a_y=\frac{y}{\sqrt{1-w^2}}\\ a_z=\frac{z}{\sqrt{1-w^2}}\\ \end{cases} \]

四元数 2 旋转矩阵

由罗德里格斯旋转公式可推出绕任意轴旋转的旋转矩阵,具体推导见 旋转矩阵 Rotation Matrix

\[ R=\begin{pmatrix}n_x^2(1-\cos\theta)+\cos\theta & n_xn_y(1-\cos\theta)-n_z\sin\theta & n_xn_z(1-\cos\theta)+n_y\sin\theta \\ n_yn_x(1-\cos\theta)+n_z\sin\theta & n_y^2(1-\cos\theta)+\cos\theta & n_yn_z(1-\cos\theta)-n_x\sin\theta \\ n_zn_x(1-\cos\theta)-n_y\sin\theta & n_zn_y(1-\cos\theta)+n_x\sin\theta & n_z^2(1-\cos\theta)+\cos\theta\end{pmatrix} \]

\(n_x,n_y,n_z,\cos\theta,\sin\theta\)\(w,x,y,z\) 表示

\[ \begin{cases} \cos\theta = 1-2\cos^2\frac\theta2 \\ \sin\theta = 2\sin\frac\theta2\cos\frac\theta2 \end{cases} \]

可以推出以下表达

\[ \begin{aligned} R_q = \begin{pmatrix} 1-2y^2-2z^2 & 2xy-2wz & 2xz+2wy \\ 2xy+2wz & 1-2x^2-2z^2 & 2yz-2wx \\ 2xz-2wy & 2yz+2wx & 1-2x^2-2y^2 \\ \end{pmatrix} \end{aligned} \]

旋转矩阵 2 四元数

当给定旋转矩阵后,观察得到

\[ \begin{aligned} r_{32}-r_{23}=(2yz+2wx)-(2yz-2wx)=4wx \\ r_{13}-r_{31}=(2xz+2wy)-(2xz-2wy)=4wy \\ r_{21}-r_{12}=(2xy+2wz)-(2xy-2wz)=4wz \\ \end{aligned} \]

又有

\[ r_{11}+r_{22}+r_{33}=3-4x^2-4y^2-4z^2=4w^2-1 \]

进一步,可得

\[ \begin{cases} w=\frac12\sqrt{1+r_{11}+r_{22}+r_{33}} \\ x=\frac{r_{32}-r_{23}}{4w} \\ y=\frac{r_{13}-r_{31}}{4w} \\ z=\frac{r_{21}-r_{12}}{4w} \\ \end{cases} \]

欧拉角 2 四元数

对于欧拉角转四元数,我们可以根据四元数的定义写出以下表达

\[ \begin{aligned} q(\gamma, \beta, \alpha) = q_z(\gamma)\ q_y(\beta)\ q_x(\alpha) = \begin{pmatrix} \cos\frac\gamma2 \\ 0 \\ 0 \\ \sin\frac\gamma2 \end{pmatrix} \begin{pmatrix} \cos\frac\beta2 \\ 0 \\ \sin\frac\beta2 \\ 0 \end{pmatrix} \begin{pmatrix} \cos\frac\alpha2 \\ \sin\frac\alpha2 \\ 0 \\ 0 \end{pmatrix} = \begin{pmatrix} \cos\frac\gamma2\cos\frac\beta2\cos\frac\alpha2 - \sin\frac\gamma2\sin\frac\beta2\sin\frac\alpha2 \\ \sin\frac\gamma2\sin\frac\beta2\cos\frac\alpha2 + \cos\frac\gamma2\cos\frac\beta2\sin\frac\alpha2 \\ \cos\frac\gamma2\sin\frac\beta2\cos\frac\alpha2 - \sin\frac\gamma2\cos\frac\beta2\sin\frac\alpha2 \\ \sin\frac\gamma2\cos\frac\beta2\cos\frac\alpha2 + \cos\frac\gamma2\sin\frac\beta2\sin\frac\alpha2 \\ \end{pmatrix} \end{aligned} \]

四元数 2 欧拉角

直接从四元数转为欧拉角比较困难,我们可以利用 四元数 --> 旋转矩阵 --> 欧拉角 的间接转化方式减少计算难度

\[ \begin{cases} \alpha = \arctan(\frac{2yz+2wx}{1-2x^2-2y^2}) \\ \beta = \arcsin(2wy-2xz) \\ \gamma = \arctan(\frac{2xy+2wz}{1-2y^2-2z^2}) \\ \end{cases} \]

同样地,使用欧拉角进行表示,某些情况会出现万向节锁和奇异的现象,需要特殊处理

各种表示方法对比

旋转矩阵 Rotation Matrix 欧拉角 Euler Angles 轴角 Axis Angle 四元数 Quarternions
可以表示三维空间任一姿态,并推广到 n 维空间 符合直觉 解决了万向锁 可以平滑插值,无万向节锁现象(本质是从四维空间描述三维姿态)
三维空间的姿态却用了九个量进行表示,存储冗余 奇异和万向节锁现象无法克服,无法平滑插值 无法平滑插值(本质是三维的) 只对三维空间有效

参考资料

[1] @hideonInternet. 欧式空间的旋转表示[EB/OL]. https://hideoninternet.github.io/ categories/%E4%B8%89%E7%BB%B4%E5%9F%BA%E7%A1%80/%E6%97%8B%E8%BD%AC%E8%A1%A8%E5%BE%81/.

[2] 鸡哥. 三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换[EB/OL]. https://zhuanlan.zhihu.com/p/45404840.

[3] XXX已失联. 四元数与欧拉角(RPY角)的相互转换[EB/OL]. https://www.cnblogs.com/21207-iHome/p/6894128.html.

[4] 展翅飞翔mxq. 姿态的三种描述方式——欧拉角、轴角、四元数[EB/OL]. https://blog.csdn.net/qq_21834027/article/details/85144454.

[5] John J. Craig. Introduction to Robotics: Mechanics and Control[M]. 3rd edition. Pearson, 2004.

[6] Martin John Baker. Maths - Rotation conversions[EB/OL]. https://www.euclideanspace.com/maths/geometry/rotations/conversions/index.htm.

[7] li chongbin. 三维空间绕任意轴旋转矩阵的推导[EB/OL]. https://zhuanlan.zhihu.com/p/56587491.

[8] wtyuan. 罗德里格斯旋转公式(Rodrigues’ rotation formula)推导[EB/OL]. https://www.cnblogs.com/wtyuan/p/12324495.html.

[9] Maschen. File:Orthogonal decomposition unit vector rodrigues rotation formula.svg[R]. 2015.

[10] 罗伯特祥. 四元数笔记(3)—— 轴角表示法与四元数表示的区别[EB/OL]. https://blog.csdn.net/weixin_43455581/article/details/108413001.

Comments