知乎同款

引言

如果不明确旋转的定义和物理意义,那么本篇文章是没有意义的。本人曾在一本书籍上见到关于绕z轴旋转θ角的两种不同的旋转表示,也了解旋转在不同领域,甚至同一领域的不同应用场景都有不同的物理意义。
旋转的表示有很多种:旋转矩阵,欧拉角,四元数,轴角,李群与李代数。
旋转的应用场景也有很多种:惯性导航,机器人学(机械臂运动学,无人机姿态估计,SLAM等)。
本文将以旋转矩阵为载体,说明旋转(旋转矩阵)左乘与右乘的不同情况。

本文背景

我们首先给出绕x,y,z轴旋转的旋转矩阵表示:
Rx(θ)=[1000cosθsinθ0sinθcosθ] \boldsymbol{R}_{x}(\theta)=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta \\ 0 & \sin \theta & \cos \theta \end{array}\right]
Ry(γ)=[cosγ0sinγ010sinγ0cosγ] \boldsymbol{R}_{y}(\gamma)=\left[\begin{array}{ccc} \cos \gamma & 0 & \sin \gamma \\ 0 & 1 & 0 \\ -\sin \gamma & 0 & \cos \gamma \end{array}\right]
Rz(α)=[cosαsinα0sinαcosα0001] \boldsymbol{R}_{z}(\alpha)=\left[\begin{array}{ccc} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{array}\right]
其中,旋转角的正方向由右手螺旋定则给定。注意,绕Y轴旋转的旋转矩阵,-sin在下方。
其实,关于上面三个矩阵,不同书,不同库函数(甚至matlab的不同函数,makehgtform与angle2dcm)都不尽相同,我们之所以如此规定,是出于其物理意义。

以z轴旋转为例:

第一种物理意义,坐标系的旋转,其应用场景有SLAM,机械臂运动学等。

旋转的左乘与右乘

如上图所示,PP点不变,坐标系OxyzO-x y z 旋转 α\alpha,得到新的坐标系OxyzO-x^{\prime} y^{\prime} z^{\prime},在新坐标系下,PP点的坐标变为PP^{\prime},则有:
P=Rz(α)PP=\boldsymbol{R}_{z}(\alpha) P^{\prime}

第二种物理意义,向量的旋转,其应用场景有机器人的姿态估计等。
旋转的左乘与右乘

如上图所示,坐标系 OxyzO-x y z不变,PP^{\prime} 点旋转 α\alpha,得到新的点 PP(我也想反过来,但用的教材上的图,没办法),则有:
P=Rz(α)PP=\boldsymbol{R}_{z}(\alpha) P^{\prime}
没错,对比上面两个式子,这种旋转矩阵的规定,使得这两种物理意义是不冲突的,因此,我们选用上述的旋转矩阵规定。

坐标系旋转中的右乘——相对于自身坐标系旋转

为了简化,我们并不以绕x,y,z轴旋转表示旋转矩阵。记坐标系0,1,2。坐标系1相对于坐标系0的旋转矩阵,记为R10R_1^0,;坐标系2相对于坐标系1的旋转矩阵,记为R21R_2^1;坐标系2相对于坐标系0的旋转矩阵,记为R20R_2^0。点p在坐标系0,1,2中的坐标分别为p0,p1,p2p^0, p^1, p^2
其中,相对于哪个坐标系旋转,就是绕哪个坐标系的轴旋转。则根据上小节,第一个物理意义,有以下关系式:
p1=R21p2(1) p^{1}=R_{2}^{1} p^{2} \tag{1}
p0=R10p1(2) p^{0}=R_{1}^{0} p^{1} \tag{2}
p0=R20p2(3) p^{0}=R_{2}^{0} p^{2} \tag{3}
由上述1,2,3式可得:
R20=R10R21(4) \boldsymbol{R}_{2}^{0}=\boldsymbol{R}_{1}^{0} \boldsymbol{R}_{2}^{1} \tag{4}
即证明了相对自身坐标系下,旋转矩阵按顺序右乘。

坐标系旋转中的左乘——相对于固定坐标系旋转

在推导像4式那样的关系之前,我们先推导同一个旋转在不同坐标系下有什么关系。假设0系坐标系下有两点M,NM, N,其在1系的坐标 Mˉ,Nˉ\bar M, \bar N,类比上述的符号定义,则有以下关系式:
M=RnmN(5) M = R_{n}^{m} N \tag{5}
Mˉ=RˉnmNˉ(6) \bar M=\bar R_{n}^{m} \bar N \tag{6}
M=R10Mˉ(7) M = R_{1}^{0} \bar M \tag{7}
N=R10Nˉ(8) N = R_{1}^{0} \bar N \tag{8}
将7,8式代入5式得,
R10Mˉ=RnmR10Nˉ(9) R_{1}^{0} \bar M = R_{n}^{m} R_{1}^{0} \bar N \tag{9}
由9式即可得到我们想要的关系式,
Rnm=R10RˉnmR01(10) R_{n}^{m} = R_{1}^{0} \bar R_{n}^{m} R_{0}^{1} \tag{10}

好了有了上面的结论,我们开始进入正文。记坐标系0,1,2(上面说的0,1系只是为了表述两个不同的坐标系,与这里的不同),其中记固定坐标系为0系。另外,因为旋转是个“事实”,旋转矩阵只不过是描述这个“事实”的工具,因此我们如下表述:坐标系1相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 Rˉ10\bar R_1^0;坐标系2相对于坐标系1的旋转矩阵,在固定坐标系下的旋转,记为 Rˉ21\bar R_2^1;坐标系2相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 Rˉ20\bar R_2^0

由公式10及0系为固定坐标系的定义可知,
Rˉ10=R10(11) \bar R_1^0 = R_1^0 \tag{11}
Rˉ20=R20(12) \bar R_2^0 = R_2^0 \tag{12}
Rˉ21=R10R21R01(13) \bar R_2^1 = R_{1}^{0} R_2^1 R_{0}^{1} \tag{13}
为了读者理解,特此对公式13进行解释,此时的R21R_2^1是相对于1系的旋转,就相当于 Rˉnm\bar R_{n}^{m}, Rˉ21\bar R_2^1是相对于固定坐标系(0系)的旋转,就相当于 RnmR_{n}^{m},而1系相对于0系的旋转矩阵为R10R_{1}^{0}

将公式11-13代入公式4,可得
Rˉ20=R10R01Rˉ21R10=Rˉ21Rˉ10(14) \bar R_2^0 = R_1^0 R_0^1 \bar R_2^1 R_{1}^{0} = \bar R_2^1 \bar R_{1}^{0} \tag{14}
即证明了在固定坐标系下,旋转矩阵按顺序左乘。

向量旋转中的左乘

在固定坐标系下,有一点 p0p_0, 先通过旋转矩阵R01R_0^1,将其旋转到p1p_1,再通过旋转矩阵R12R_1^2,将其旋转到p2p_2。同样对于p0p_0,可以通过旋转矩阵R02R_0^2,一步将其旋转到p2p_2。则有以下公式:
p1=R01p0(15) p_1 = R_0^1 p_0 \tag{15}
p2=R12p1(16) p_2 = R_1^2 p_1 \tag{16}
p2=R02p0(17) p_2 = R_0^2 p_0 \tag{17}
易得:
R02=R12R01(18) R_0^2 = R_1^2 R_0^1 \tag{18}

向量旋转中的右乘

把18式两边取个逆就好。等式成立的代价是旋转矩阵的物理意义,或者说描述也改变了。向量旋转中的右乘这一节本没必要,甚至会引起人误解。但这里还是留出来,是因为误解总会发生的,还不如提前搞明白。

在处理旋转问题上,一定要弄清楚其物理意义,是坐标系旋转还是向量,是哪个点到哪个点;符号规定也要统一,上标代表什么,下标又代表什么,要与物理意义联系起来。(至少自己不糊涂吧)

旋转小知识

  1. 绕x,y,z轴的旋转顺序有几种?
  • 12种,以先绕x轴为例,有xyz,xzy,xzx,xyx。
  1. 为什么旋转表示那么多?
  • 头脑风暴开始…欧拉角很直观,但是不连续的,有奇异点;四元数连续,且可以通过机体坐标系的角速度更新,但需要归一化,不适合用于优化;轴角实际上属于李代数;而李代数既连续,也无约束,适合优化;旋转矩阵属于李群;说到群,其实旋转矩阵也可以由基变换得到(矩阵论里的了)。

放到最后的话

实际上这段话本身是放在前面作为引言的。但鉴于大家刷知乎都是碎片化时间学习,就不在开头浪费大家时间了。
关于旋转矩阵的博客与文章已经无数篇了,也有相应教材,无论是机器人学,还是惯导,都对此有详细的讲解。但大家都自有一套符号体系与应用场景,因此初入者常常看完一篇博客茅塞顿开,换了本书看又觉得和之前学到的不一样。大二时,为了做机器人的姿态估计,我参考一些惯导书籍和一些博客,自学AHRS(航姿参考系统),这些年来我一直觉得旋转矩阵是按先后顺序左乘的,虽然中间也看过有人用右乘,但当时不求甚解,只觉得是两边同乘逆矩阵就好了。直到最近的课堂作业涉及到机械臂的坐标系转换,我才认识到,我学了两三年,可能还是没学明白,于是就做了这篇简单的总结。

相关文章:

  • 2021-12-08
  • 2022-12-23
  • 2021-09-08
  • 2021-06-29
  • 2022-12-23
  • 2021-09-08
猜你喜欢
  • 2022-12-23
  • 2021-10-06
  • 2021-12-17
  • 2022-01-18
  • 2022-12-23
  • 2021-12-23
  • 2021-10-28
相关资源
相似解决方案