《Modern Robotics》阅读笔记1——刚体的运动(一)
一般而言,空间中的刚体运动有六个自由度,但我们描述刚体的运动常见做法是用 4 × 4 4\times4 4×4的变换矩阵,即用了16个元素加上10个约束,而不是就用6个量来表达。用16个元素加上约束的表示方法,叫做implicit representation(隐式表达),这种表达方法好处是没有奇异值。而相对的explicit representation(显式表达)只需要用6个量(比如欧拉角+三维位置矢量),但是有时会遇到奇异值的情况。而造成这种现象的本质原因来自于,代表刚体运动的六维空间并不是欧式空间,而是非欧空间。比如球面是二维面,因此两个量就能表达球面上的一点(经纬度法),但由于球面不是欧式平面,所以经纬度法会有奇点(球面的南北极坐标有无穷多种)。而如果用XYZ三维坐标来表达呢?就完全不会出现这种问题了。
这篇文章主要内容不是关于如何用变换矩阵表示刚体运动,而是用exponential coordinates(指数坐标)来表示。这种方式是比较新颖的,让我们先从二维平面运动开始。
刚体的二维平面运动
如何表达上图中{s}系和{b}系的关系是首先要解决的问题?
- {b}系的原点在{s}系下的表示:
p = p x x ^ s + p y y ^ s p=p_x \hat{x}_s+p_y\hat{y}_s p=pxx^s+pyy^s - {b}系的坐标轴在{s}系下的表示:
x ^ b = cos θ x ^ s + sin θ y ^ s \hat{x}_b=\cos{\theta} \hat{x}_s+\sin{\theta} \hat{y}_s x^b=cosθx^s+sinθy^s
y ^ b = − sin θ x ^ s + cos θ y ^ s \hat{y}_b=-\sin{\theta} \hat{x}_s+\cos{\theta} \hat{y}_s y^b=−sinθx^s+cosθy^s
其中, ^ \hat{} ^ 代表单位向量。
把上面的等式组织成矩阵的形式, { P , p } \{P,p\} {P,p},
p = [ p x p y ] p=\left[\begin{matrix} p_x \\ p_y \end{matrix}\right] p=[pxpy]
P = [ x ^ b y ^ b ] = [ cos θ − sin θ sin θ cos θ ] P=[\begin{matrix} \hat{x}_b & \hat{y}_b\end{matrix}]=\left[ \begin{matrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{matrix} \right ] P=[x^by^b]=[cosθsinθ−sinθcosθ]
这样就表达了{b}系与{s}系的关系, { P , p } \{P,p\} {P,p}被叫做旋转矩阵和平移矢量。
{ P , p } \{P,p\} {P,p}可以被用作为三个目的:
- (a)一个刚体的坐标系在{s}系下的表示
- (b)用于改变某个向量或者坐标系的参考坐标系(向量需要表示在参考坐标系下)
- (c)移动某个向量或者坐标系
除了用旋转+平移的方法来表达刚体运动,还有一种方法!
刚体的运动完全可以表达为绕一个固定轴的旋转。如下图:
上图中灰色的椭圆从{
c
c
c}系变到{
c
′
c^{'}
c′}系,即可以看做经过了平移和旋转(图(a)),也可以看做是绕s点旋转了90度(图(b))。
这种运动可以叫做screw motion。表示为:
(
β
,
s
x
,
s
y
)
=
(
π
/
2
,
0
,
2
)
(\beta,s_x,s_y)=(\pi/2,0,2)
(β,sx,sy)=(π/2,0,2)
其中,
(
s
x
,
s
y
)
(s_x,s_y)
(sx,sy)是旋转轴的位置,
β
\beta
β是角度。
另一种表达screw motion的方法是,将运动视作为由一个角速度和线速度运动一段给定的距离形成的。
在上面这个例子中,角速度假设为单位量,
ω
=
1
r
a
d
/
s
\omega=1 \ rad/s
ω=1 rad/s 。那么我们根据这个运动的结果,很自然能够算出,坐标系原点的线速度是
v
=
(
v
x
,
v
y
)
=
(
2
,
0
)
v=(v_x,v_y)=(2,0)
v=(vx,vy)=(2,0)。所以,我们可以把两个速度放到一起,表示为:
S
=
(
ω
,
v
x
,
v
y
)
=
(
1
,
2
,
0
)
\mathcal{S}=(\omega,v_x,v_y)=(1,2,0)
S=(ω,vx,vy)=(1,2,0)
这也被叫做screw axis。(两个速度组成的向量,为什么叫axis呢?因为,线速度比上角速度就可以得到轴的位置,这个向量里已经隐含了轴的位置了。)
绕着这个screw axis,只需要旋转
θ
=
π
/
2
\theta=\pi/2
θ=π/2就可以了。所以,我们最终可以把这个运动表示为:
S
θ
=
(
π
/
2
,
π
,
0
)
\mathcal{S}\theta=(\pi/2,\pi,0)
Sθ=(π/2,π,0)
注意,这里的表示方法和上面不一样了。我们称这种表示方法为,刚体运动的exponential coordinates(指数坐标)。
还有一种表达screw motion的方法,将运动视作为由一个角速度和线速度运动单位时间形成的。
进一步的,我们又定义twist的概念!
twist的定义如下:
V
=
S
θ
˙
\mathcal{V}=\mathcal{S}\dot{\theta}
V=Sθ˙
其中,
θ
˙
=
θ
\dot{\theta}=\theta
θ˙=θ,也就是说以
V
\mathcal{V}
V运动单位时间就可以表达运动了。
twist的概念很重要,之后将会一直用到,这和传统的旋转矩阵的表达方法不一样了。