知乎同款
引言
如果不明确旋转的定义和物理意义,那么本篇文章是没有意义的。本人曾在一本书籍上见到关于绕z轴旋转θ角的两种不同的旋转表示,也了解旋转在不同领域,甚至同一领域的不同应用场景都有不同的物理意义。
旋转的表示有很多种:旋转矩阵,欧拉角,四元数,轴角,李群与李代数。
旋转的应用场景也有很多种:惯性导航,机器人学(机械臂运动学,无人机姿态估计,SLAM等)。
本文将以旋转矩阵为载体,说明旋转(旋转矩阵)左乘与右乘的不同情况。
本文背景
我们首先给出绕x,y,z轴旋转的旋转矩阵表示:
Rx(θ)=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤
Ry(γ)=⎣⎡cosγ0−sinγ010sinγ0cosγ⎦⎤
Rz(α)=⎣⎡cosαsinα0−sinαcosα0001⎦⎤
其中,旋转角的正方向由右手螺旋定则给定。注意,绕Y轴旋转的旋转矩阵,-sin在下方。
其实,关于上面三个矩阵,不同书,不同库函数(甚至matlab的不同函数,makehgtform与angle2dcm)都不尽相同,我们之所以如此规定,是出于其物理意义。
以z轴旋转为例:
第一种物理意义,坐标系的旋转,其应用场景有SLAM,机械臂运动学等。

如上图所示,P点不变,坐标系O−xyz 旋转 α,得到新的坐标系O−x′y′z′,在新坐标系下,P点的坐标变为P′,则有:
P=Rz(α)P′
第二种物理意义,向量的旋转,其应用场景有机器人的姿态估计等。

如上图所示,坐标系 O−xyz不变,P′ 点旋转 α,得到新的点 P(我也想反过来,但用的教材上的图,没办法),则有:
P=Rz(α)P′
没错,对比上面两个式子,这种旋转矩阵的规定,使得这两种物理意义是不冲突的,因此,我们选用上述的旋转矩阵规定。
坐标系旋转中的右乘——相对于自身坐标系旋转
为了简化,我们并不以绕x,y,z轴旋转表示旋转矩阵。记坐标系0,1,2。坐标系1相对于坐标系0的旋转矩阵,记为R10,;坐标系2相对于坐标系1的旋转矩阵,记为R21;坐标系2相对于坐标系0的旋转矩阵,记为R20。点p在坐标系0,1,2中的坐标分别为p0,p1,p2。
其中,相对于哪个坐标系旋转,就是绕哪个坐标系的轴旋转。则根据上小节,第一个物理意义,有以下关系式:
p1=R21p2(1)
p0=R10p1(2)
p0=R20p2(3)
由上述1,2,3式可得:
R20=R10R21(4)
即证明了相对自身坐标系下,旋转矩阵按顺序右乘。
坐标系旋转中的左乘——相对于固定坐标系旋转
在推导像4式那样的关系之前,我们先推导同一个旋转在不同坐标系下有什么关系。假设0系坐标系下有两点M,N,其在1系的坐标 Mˉ,Nˉ,类比上述的符号定义,则有以下关系式:
M=RnmN(5)
Mˉ=RˉnmNˉ(6)
M=R10Mˉ(7)
N=R10Nˉ(8)
将7,8式代入5式得,
R10Mˉ=RnmR10Nˉ(9)
由9式即可得到我们想要的关系式,
Rnm=R10RˉnmR01(10)
好了有了上面的结论,我们开始进入正文。记坐标系0,1,2(上面说的0,1系只是为了表述两个不同的坐标系,与这里的不同),其中记固定坐标系为0系。另外,因为旋转是个“事实”,旋转矩阵只不过是描述这个“事实”的工具,因此我们如下表述:坐标系1相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 Rˉ10;坐标系2相对于坐标系1的旋转矩阵,在固定坐标系下的旋转,记为 Rˉ21;坐标系2相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 Rˉ20。
由公式10及0系为固定坐标系的定义可知,
Rˉ10=R10(11)
Rˉ20=R20(12)
Rˉ21=R10R21R01(13)
为了读者理解,特此对公式13进行解释,此时的R21是相对于1系的旋转,就相当于 Rˉnm, Rˉ21是相对于固定坐标系(0系)的旋转,就相当于 Rnm,而1系相对于0系的旋转矩阵为R10。
将公式11-13代入公式4,可得
Rˉ20=R10R01Rˉ21R10=Rˉ21Rˉ10(14)
即证明了在固定坐标系下,旋转矩阵按顺序左乘。
向量旋转中的左乘
在固定坐标系下,有一点 p0, 先通过旋转矩阵R01,将其旋转到p1,再通过旋转矩阵R12,将其旋转到p2。同样对于p0,可以通过旋转矩阵R02,一步将其旋转到p2。则有以下公式:
p1=R01p0(15)
p2=R12p1(16)
p2=R02p0(17)
易得:
R02=R12R01(18)
向量旋转中的右乘
把18式两边取个逆就好。等式成立的代价是旋转矩阵的物理意义,或者说描述也改变了。向量旋转中的右乘这一节本没必要,甚至会引起人误解。但这里还是留出来,是因为误解总会发生的,还不如提前搞明白。
在处理旋转问题上,一定要弄清楚其物理意义,是坐标系旋转还是向量,是哪个点到哪个点;符号规定也要统一,上标代表什么,下标又代表什么,要与物理意义联系起来。(至少自己不糊涂吧)
旋转小知识
- 绕x,y,z轴的旋转顺序有几种?
- 12种,以先绕x轴为例,有xyz,xzy,xzx,xyx。
- 为什么旋转表示那么多?
- 头脑风暴开始…欧拉角很直观,但是不连续的,有奇异点;四元数连续,且可以通过机体坐标系的角速度更新,但需要归一化,不适合用于优化;轴角实际上属于李代数;而李代数既连续,也无约束,适合优化;旋转矩阵属于李群;说到群,其实旋转矩阵也可以由基变换得到(矩阵论里的了)。
放到最后的话
实际上这段话本身是放在前面作为引言的。但鉴于大家刷知乎都是碎片化时间学习,就不在开头浪费大家时间了。
关于旋转矩阵的博客与文章已经无数篇了,也有相应教材,无论是机器人学,还是惯导,都对此有详细的讲解。但大家都自有一套符号体系与应用场景,因此初入者常常看完一篇博客茅塞顿开,换了本书看又觉得和之前学到的不一样。大二时,为了做机器人的姿态估计,我参考一些惯导书籍和一些博客,自学AHRS(航姿参考系统),这些年来我一直觉得旋转矩阵是按先后顺序左乘的,虽然中间也看过有人用右乘,但当时不求甚解,只觉得是两边同乘逆矩阵就好了。直到最近的课堂作业涉及到机械臂的坐标系转换,我才认识到,我学了两三年,可能还是没学明白,于是就做了这篇简单的总结。