知乎同款
如果不明确旋转的定义和物理意义,那么本篇文章是没有意义的。本人曾在一本书籍上见到关于绕z轴旋转θ角的两种不同的旋转表示,也了解旋转在不同领域,甚至同一领域的不同应用场景都有不同的物理意义。
旋转的表示有很多种:旋转矩阵,欧拉角,四元数,轴角,李群与李代数。
旋转的应用场景也有很多种:惯性导航,机器人学(机械臂运动学,无人机姿态估计,SLAM等)。
本文将以旋转矩阵为载体,说明旋转(旋转矩阵)左乘与右乘的不同情况。
我们首先给出绕x,y,z轴旋转的旋转矩阵表示:
R x ( θ ) = [ 1 0 0 0 cos θ − sin θ 0 sin θ 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] Rx(θ)=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤
R y ( γ ) = [ cos γ 0 sin γ 0 1 0 − sin γ 0 cos γ ] \boldsymbol{R}_{y}(\gamma)=\left[\begin{array}{ccc} \cos \gamma & 0 & \sin \gamma \\ 0 & 1 & 0 \\ -\sin \gamma & 0 & \cos \gamma \end{array}\right] Ry(γ)=⎣⎡cosγ0−sinγ010sinγ0cosγ⎦⎤
R z ( α ) = [ cos α − sin α 0 sin α cos α 0 0 0 1 ] \boldsymbol{R}_{z}(\alpha)=\left[\begin{array}{ccc} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{array}\right] Rz(α)=⎣⎡cosαsinα0−sinαcosα0001⎦⎤
其中,旋转角的正方向由右手螺旋定则给定。注意,绕Y轴旋转的旋转矩阵,-sin在下方。
其实,关于上面三个矩阵,不同书,不同库函数(甚至matlab的不同函数,makehgtform与angle2dcm)都不尽相同,我们之所以如此规定,是出于其物理意义。
以z轴旋转为例:
第一种物理意义,坐标系的旋转,其应用场景有SLAM,机械臂运动学等。
如上图所示, P P P点不变,坐标系 O − x y z O-x y z O−xyz 旋转 α \alpha α,得到新的坐标系 O − x ′ y ′ z ′ O-x^{\prime} y^{\prime} z^{\prime} O−x′y′z′,在新坐标系下, P P P点的坐标变为 P ′ P^{\prime} P′,则有:
P = R z ( α ) P ′ P=\boldsymbol{R}_{z}(\alpha) P^{\prime} P=Rz(α)P′
第二种物理意义,向量的旋转,其应用场景有机器人的姿态估计等。
如上图所示,坐标系 O − x y z O-x y z O−xyz不变, P ′ P^{\prime} P′ 点旋转 α \alpha α,得到新的点 P P P(我也想反过来,但用的教材上的图,没办法),则有:
P = R z ( α ) P ′ P=\boldsymbol{R}_{z}(\alpha) P^{\prime} P=Rz(α)P′
没错,对比上面两个式子,这种旋转矩阵的规定,使得这两种物理意义是不冲突的,因此,我们选用上述的旋转矩阵规定。
为了简化,我们并不以绕x,y,z轴旋转表示旋转矩阵。记坐标系0,1,2。坐标系1相对于坐标系0的旋转矩阵,记为 R 1 0 R_1^0 R10,;坐标系2相对于坐标系1的旋转矩阵,记为 R 2 1 R_2^1 R21;坐标系2相对于坐标系0的旋转矩阵,记为 R 2 0 R_2^0 R20。点p在坐标系0,1,2中的坐标分别为 p 0 , p 1 , p 2 p^0, p^1, p^2 p0,p1,p2。
其中,相对于哪个坐标系旋转,就是绕哪个坐标系的轴旋转。则根据上小节,第一个物理意义,有以下关系式:
p 1 = R 2 1 p 2 (1) p^{1}=R_{2}^{1} p^{2} \tag{1} p1=R21p2(1)
p 0 = R 1 0 p 1 (2) p^{0}=R_{1}^{0} p^{1} \tag{2} p0=R10p1(2)
p 0 = R 2 0 p 2 (3) p^{0}=R_{2}^{0} p^{2} \tag{3} p0=R20p2(3)
由上述1,2,3式可得:
R 2 0 = R 1 0 R 2 1 (4) \boldsymbol{R}_{2}^{0}=\boldsymbol{R}_{1}^{0} \boldsymbol{R}_{2}^{1} \tag{4} R20=R10R21(4)
即证明了相对自身坐标系下,旋转矩阵按顺序右乘。
在推导像4式那样的关系之前,我们先推导同一个旋转在不同坐标系下有什么关系。假设0系坐标系下有两点 M , N M, N M,N,其在1系的坐标 M ˉ , N ˉ \bar M, \bar N Mˉ,Nˉ,类比上述的符号定义,则有以下关系式:
M = R n m N (5) M = R_{n}^{m} N \tag{5} M=RnmN(5)
M ˉ = R ˉ n m N ˉ (6) \bar M=\bar R_{n}^{m} \bar N \tag{6} Mˉ=RˉnmNˉ(6)
M = R 1 0 M ˉ (7) M = R_{1}^{0} \bar M \tag{7} M=R10Mˉ(7)
N = R 1 0 N ˉ (8) N = R_{1}^{0} \bar N \tag{8} N=R10Nˉ(8)
将7,8式代入5式得,
R 1 0 M ˉ = R n m R 1 0 N ˉ (9) R_{1}^{0} \bar M = R_{n}^{m} R_{1}^{0} \bar N \tag{9} R10Mˉ=RnmR10Nˉ(9)
由9式即可得到我们想要的关系式,
R n m = R 1 0 R ˉ n m R 0 1 (10) R_{n}^{m} = R_{1}^{0} \bar R_{n}^{m} R_{0}^{1} \tag{10} Rnm=R10RˉnmR01(10)
好了有了上面的结论,我们开始进入正文。记坐标系0,1,2(上面说的0,1系只是为了表述两个不同的坐标系,与这里的不同),其中记固定坐标系为0系。另外,因为旋转是个“事实”,旋转矩阵只不过是描述这个“事实”的工具,因此我们如下表述:坐标系1相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 R ˉ 1 0 \bar R_1^0 Rˉ10;坐标系2相对于坐标系1的旋转矩阵,在固定坐标系下的旋转,记为 R ˉ 2 1 \bar R_2^1 Rˉ21;坐标系2相对于坐标系0的旋转,在固定坐标系下的旋转矩阵,记为 R ˉ 2 0 \bar R_2^0 Rˉ20。
由公式10及0系为固定坐标系的定义可知,
R ˉ 1 0 = R 1 0 (11) \bar R_1^0 = R_1^0 \tag{11} Rˉ10=R10(11)
R ˉ 2 0 = R 2 0 (12) \bar R_2^0 = R_2^0 \tag{12} Rˉ20=R20(12)
R ˉ 2 1 = R 1 0 R 2 1 R 0 1 (13) \bar R_2^1 = R_{1}^{0} R_2^1 R_{0}^{1} \tag{13} Rˉ21=R10R21R01(13)
为了读者理解,特此对公式13进行解释,此时的 R 2 1 R_2^1 R21是相对于1系的旋转,就相当于 R ˉ n m \bar R_{n}^{m} Rˉnm, R ˉ 2 1 \bar R_2^1 Rˉ21是相对于固定坐标系(0系)的旋转,就相当于 R n m R_{n}^{m} Rnm,而1系相对于0系的旋转矩阵为 R 1 0 R_{1}^{0} R10。
将公式11-13代入公式4,可得
R ˉ 2 0 = R 1 0 R 0 1 R ˉ 2 1 R 1 0 = R ˉ 2 1 R ˉ 1 0 (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} Rˉ20=R10R01Rˉ21R10=Rˉ21Rˉ10(14)
即证明了在固定坐标系下,旋转矩阵按顺序左乘。
在固定坐标系下,有一点 p 0 p_0 p0, 先通过旋转矩阵 R 0 1 R_0^1 R01,将其旋转到 p 1 p_1 p1,再通过旋转矩阵 R 1 2 R_1^2 R12,将其旋转到 p 2 p_2 p2。同样对于 p 0 p_0 p0,可以通过旋转矩阵 R 0 2 R_0^2 R02,一步将其旋转到 p 2 p_2 p2。则有以下公式:
p 1 = R 0 1 p 0 (15) p_1 = R_0^1 p_0 \tag{15} p1=R01p0(15)
p 2 = R 1 2 p 1 (16) p_2 = R_1^2 p_1 \tag{16} p2=R12p1(16)
p 2 = R 0 2 p 0 (17) p_2 = R_0^2 p_0 \tag{17} p2=R02p0(17)
易得:
R 0 2 = R 1 2 R 0 1 (18) R_0^2 = R_1^2 R_0^1 \tag{18} R02=R12R01(18)
把18式两边取个逆就好。等式成立的代价是旋转矩阵的物理意义,或者说描述也改变了。向量旋转中的右乘这一节本没必要,甚至会引起人误解。但这里还是留出来,是因为误解总会发生的,还不如提前搞明白。
在处理旋转问题上,一定要弄清楚其物理意义,是坐标系旋转还是向量,是哪个点到哪个点;符号规定也要统一,上标代表什么,下标又代表什么,要与物理意义联系起来。(至少自己不糊涂吧)