引言
如果不明确旋转的定义和物理意义,那么本篇文章是没有意义的。本人曾在一本书籍上见到关于绕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式两边取个逆就好。等式成立的代价是旋转矩阵的物理意义,或者说描述也改变了。向量旋转中的右乘这一节本没必要,甚至会引起人误解。但这里还是留出来,是因为误解总会发生的,还不如提前搞明白。
在处理旋转问题上,一定要弄清楚其物理意义,是坐标系旋转还是向量,是哪个点到哪个点;符号规定也要统一,上标代表什么,下标又代表什么,要与物理意义联系起来。(至少自己不糊涂吧)
旋转小知识
- 绕x,y,z轴的旋转顺序有几种?
- 12种,以先绕x轴为例,有xyz,xzy,xzx,xyx。
- 为什么旋转表示那么多?
- 头脑风暴开始…欧拉角很直观,但是不连续的,有奇异点;四元数连续,且可以通过机体坐标系的角速度更新,但需要归一化,不适合用于优化;轴角实际上属于李代数;而李代数既连续,也无约束,适合优化;旋转矩阵属于李群;说到群,其实旋转矩阵也可以由基变换得到(矩阵论里的了)。