《Modern Robotics》阅读笔记2——刚体的运动(二)
在这篇文章中,主要讲述的是旋转矩阵的内容。
1. 旋转矩阵与特殊正交群(刚体的三维运动表示方法)
旋转矩阵的概念不用再介绍。我们知道,旋转矩阵有9个元素,但其中可以自由选取的元素只有3个,因为旋转矩阵必须满足额外的6个约束,这些约束可以总结为下面的式子:
R
T
R
=
I
R^TR = I
RTR=I
以及:
d
e
t
R
=
I
det R = I
detR=I
第二个约束是用于保证旋转矩阵符合右手坐标系的定义。
基于以上这两个约束,有人定义了 特殊正交群(Special Orthogonal Group) 的概念(传说中的李群)。也就是满足上面这两个约束的矩阵组成的集合,详细的定义如下:
所有满足上述两个约束( R T R = I R^TR = I RTR=I和 d e t R = I det R = I detR=I)的 3 × 3 3\times3 3×3的实矩阵的集合构成特殊正交群 S O ( 3 ) SO(3) SO(3)。
所有满足上述两个约束( R T R = I R^TR = I RTR=I和 d e t R = I det R = I detR=I)的 2 × 2 2\times2 2×2的实矩阵的集合构成特殊正交群 S O ( 2 ) SO(2) SO(2)。
实际上,旋转矩阵就属于 S O ( 2 ) SO(2) SO(2)和 S O ( 3 ) SO(3) SO(3)。
特殊正交群的一些性质
假设 A A A和 B B B都属于特殊正交群:
- A B AB AB也属于该群
- ( A B ) C = A ( B C ) (AB)C=A(BC) (AB)C=A(BC)
- 群内存在一个元素 I I I,使得 A I = I A = A AI=IA=A AI=IA=A成立
- 群内存在一个元素 A − 1 A^{-1} A−1,使得 A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I AA−1=A−1A=I成立
- 对于任意向量 x ∈ R 3 x \in \mathbb{R}^3 x∈R3并且 R ∈ S O ( 3 ) R\in SO(3) R∈SO(3),那么 y = R x y=Rx y=Rx与 x x x的长度相等(即纯旋转)
2. 旋转矩阵的使用方法
旋转矩阵通常可用作三类用途,下面会一一介绍。
下面这幅图中,定义了三个坐标系,分别是{a}系,{b}系和{c}系。其中{a}系和{s}系是完全对齐的。
2.1. 一种姿态的表示方法
旋转矩阵可以作为一种姿态表示方法。
假设我们已经将{s}系看做参考坐标系或者说是惯性坐标系,那么我们可以通过旋转矩阵来表示其他一切坐标系的姿态。
比如,上图中{a}系就可以表示为:
R
a
=
[
1
0
0
0
1
0
0
0
1
]
R_a = \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{matrix} \right]
Ra=⎣⎡100010001⎦⎤
{b}系可以表示为:
R
a
=
[
0
−
1
0
1
0
0
0
0
1
]
R_a = \left[ \begin{matrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \\ \end{matrix} \right]
Ra=⎣⎡010−100001⎦⎤
同理,其他坐标系也可以进行类似的表示。
值得注意,严格的写法是
R
a
=
R
s
a
R_a=R_{sa}
Ra=Rsa,
R
b
=
R
s
b
R_b=R_{sb}
Rb=Rsb,上面我们省略了下标。
2.2. 一个改变向量表达的参考坐标系的算子
思考一个问题,假设
R
b
c
R_{bc}
Rbc表示{c}系在{b}系下的姿态,
R
a
b
R_{ab}
Rab表示{b}系在{a}系下的姿态,那么如何求{c}系在{a}系下的姿态
R
a
c
R_{ac}
Rac呢?
答案是:
R
a
c
=
R
a
b
⋅
R
b
c
R_{ac}=R_{ab} \cdot R_{bc}
Rac=Rab⋅Rbc
其实在上面式子中,我们可以换一种方式解读:
R
a
c
=
c
h
a
n
g
e
_
r
e
f
e
r
e
n
c
e
_
f
r
a
m
e
_
f
r
o
m
_
{
b
}
_
t
o
_
{
a
}
(
R
b
c
)
R_{ac}= change\_reference\_frame\_from\_\{b\}\_to\_\{a\} \left( R_{bc} \right)
Rac=change_reference_frame_from_{b}_to_{a}(Rbc)
R
a
b
R_{ab}
Rab可以被看成一个算子,它作用在
R
b
c
R_{bc}
Rbc上,将
R
b
c
R_{bc}
Rbc的参考坐标系从{b}系变成了{a}系。
所以,利用旋转矩阵的这个性质,我们可以改变任意向量的参考坐标系!!!
比如,存在一个向量
p
p
p,
p
b
p_b
pb是它在{b}系下的表示,如何得到它在{a}系下的表示呢?
p
a
=
R
a
b
⋅
p
b
p_a = R_{ab} \cdot p_b
pa=Rab⋅pb
2.3. 一个转动向量的操作
在这里,旋转矩阵被用于转动向量或者坐标系。
为了区别于前面两种用法,我们把旋转矩阵写成如下形式:
R
=
R
o
t
(
ω
^
,
θ
)
R=Rot(\hat{\omega},\theta)
R=Rot(ω^,θ)
如下图,旋转矩阵用于表示让坐标系
{
x
^
,
y
^
,
z
^
}
\{\hat{x},\hat{y},\hat{z}\}
{x^,y^,z^}绕着
ω
^
\hat{\omega}
ω^轴旋转
θ
\theta
θ度,变换到
{
x
^
′
,
y
^
′
,
z
^
′
}
\{\hat{x}',\hat{y}',\hat{z}'\}
{x^′,y^′,z^′}的这个操作。
其中,
ω
^
\hat{\omega}
ω^是一个单位向量。
由此又引出了一个新的问题,
ω
^
\hat{\omega}
ω^是一个向量,它表示在哪个坐标系里,对我们旋转矩阵的表示有影响吗?
答案是肯定的。
通过上面这幅图,我们来解释这个问题。
假设存在坐标系{s}和{b},我们希望通过将{b}系绕着
ω
^
\hat{\omega}
ω^旋转
θ
\theta
θ度,得到一个新的坐标系。
显而易见,当
ω
^
\hat{\omega}
ω^表示在{b}系下,或者表示在{s}系下时,旋转之后的结果肯定不同。比如,绕{b}系的z轴转和绕{s}系的z轴转,最后结果肯定不同。
我们假设绕{s}系下的
ω
^
s
\hat{\omega}_s
ω^s旋转得到的坐标系是{b’},绕{b}系下的
ω
^
b
\hat{\omega}_b
ω^b旋转得到的坐标系是{b’’}。我们将{b’}系和{b’’}系表示如下:
R
s
b
′
=
r
o
t
a
t
e
_
b
y
_
R
_
i
n
_
{
s
}
_
f
r
a
m
e
(
R
s
b
)
=
R
⋅
R
s
b
R_{sb'}= rotate\_by\_R\_in\_\{s\}\_frame\left( R_{sb} \right) = R \cdot R_{sb}
Rsb′=rotate_by_R_in_{s}_frame(Rsb)=R⋅Rsb
R
s
b
′
′
=
r
o
t
a
t
e
_
b
y
_
R
_
i
n
_
{
b
}
_
f
r
a
m
e
(
R
s
b
)
=
R
s
b
⋅
R
R_{sb''}= rotate\_by\_R\_in\_\{b\}\_frame\left( R_{sb} \right) = R_{sb} \cdot R
Rsb′′=rotate_by_R_in_{b}_frame(Rsb)=Rsb⋅R
其中:
R
=
R
o
t
(
ω
^
,
θ
)
=
R
o
t
(
ω
^
s
,
θ
)
=
R
o
t
(
ω
^
b
,
θ
)
R = Rot(\hat{\omega},\theta)=Rot(\hat{\omega}_s,\theta)=Rot(\hat{\omega}_b,\theta)
R=Rot(ω^,θ)=Rot(ω^s,θ)=Rot(ω^b,θ)
ω
^
s
=
ω
^
b
=
ω
^
\hat{\omega}_s= \hat{\omega}_b = \hat{\omega}
ω^s=ω^b=ω^
下面,我们来解释如何理解上面两个式子。
式子一:
R
s
b
′
=
r
o
t
a
t
e
_
b
y
_
R
_
i
n
_
{
s
}
_
f
r
a
m
e
(
R
s
b
)
=
R
⋅
R
s
b
R_{sb'}= rotate\_by\_R\_in\_\{s\}\_frame\left( R_{sb} \right) = R \cdot R_{sb}
Rsb′=rotate_by_R_in_{s}_frame(Rsb)=R⋅Rsb
这个式子,为什么
R
R
R是左乘?
首先,
R
s
b
R_{sb}
Rsb矩阵的每一列分别是{b}系的x,y,z轴在{s}系下的表示。
其次,
R
R
R表示的是,绕{s}系下的
ω
^
\hat{\omega}
ω^轴旋转。我们这里把
R
R
R看做是一个转动向量的操作。即,将一个{s}系下表示的向量,绕{s}系下的
ω
^
\hat{\omega}
ω^旋转,很自然就是左乘。
式子二:
R
s
b
′
′
=
r
o
t
a
t
e
_
b
y
_
R
_
i
n
_
{
b
}
_
f
r
a
m
e
(
R
s
b
)
=
R
s
b
⋅
R
R_{sb''}= rotate\_by\_R\_in\_\{b\}\_frame\left( R_{sb} \right) = R_{sb} \cdot R
Rsb′′=rotate_by_R_in_{b}_frame(Rsb)=Rsb⋅R
这个式子,为什么
R
R
R是右乘?
首先,
R
s
b
R_{sb}
Rsb可以被看做是一个算子,可以将{b}系下的向量,表示到{s}系中去。
其次,
R
R
R表示绕{b}系下的
ω
^
\hat{\omega}
ω^轴旋转。所以
R
R
R中的每一列都代表{b’’}系的x,y,z轴在{b}系下的向量。所以,要将{b}系下的向量转到{s}系上去,自然要用
R
s
b
R_{sb}
Rsb乘
R
R
R。