这一部分是机器人运动学的基础,在其他领域也有广泛的应用,比如飞行器控制、三维运动捕捉等等。

1 问题提出

首先介绍一下问题的来由。

不论是机器人还是飞行器还是人体,通常自身的结构都是相对固定的,在这个固定的结构上描述一些位置是非常方便的。例如,我说我在右手手腕关节上戴着一块手表,那么无论我在什么地方无论我的右手摆出了什么姿势,手表相对我的右手小臂的位置都不会改变。如果我精确一点,在右手小臂上建立一个坐标系,那么手表在这个坐标系中的坐标就是不变的。右手小臂坐标系就是我们通常说的固连坐标系,或刚体坐标系。

固连坐标系虽然简单,但却是不方便的,因为坐标系的形态老是在变化。例如虽然手表一直在我手腕上的固定位置,但是它在地球上的位置却随着手臂的变化而变化。所以常常会有一个参考坐标系或者叫世界坐标系。这个坐标系是不动的,所以里面的对象可以很方便地描述相对位置。

那么问题来了,例如我知道了手表在手臂坐标系的位置和手臂的位置和姿态,如何求它在世界坐标的位置呢?抽象一点就是如何表示两个坐标系的关系,并求出一个坐标中的位置在另一个坐标系中的表示。

2 坐标变换

先用数学语言重新描述一下问题,假设参考坐标系为OXYZ,刚体坐标系为OUVW,我有一个点P,在O’UVW中的坐标表示为[a,b,c],现在要求他在OXYZ中的坐标值[x,y,z]是多少(我们不妨先假设O和O’重合)。这个问题其实不难,可以这样思考:

  • O’UVW中的坐标[a,b,c]就分别是了O’P向量在O’U,O’V,O’W三个轴上投影,即 $$\vec{O’P}=a\cdot \vec{O’U}+b\cdot \vec{O’V}+c\cdot \vec{O’W}$$, 我们叫这个式子式1.
  • 如果同样知道了如上面的O’U,O’V,O’W分别在OX,OY,OZ的分量表示,即 $$\vec{O’U}=i_{1,1}\cdot \vec{OX}+i_{2,1}\cdot \vec{OY}+i_{3,1}\cdot \vec{OZ}$$ $$\vec{O’V}=i_{1,2}\cdot \vec{OX}+i_{2,2}\cdot \vec{OY}+i_{3,2}\cdot \vec{OZ}$$ $$\vec{O’W}=i_{1,3}\cdot \vec{OX}+i_{2,3}\cdot \vec{OY}+i_{3,3}\cdot \vec{OZ}$$ 我们就可以把这些式子带到上面式1中整理,就会得到O’P关于O’ X,O’Y,O’Z的表达式。
  • 表达式中O’X,O’Y,O’Z的三个系数不就是O’P在坐标系OXYZ中的坐标了吗 如果我们把上面的过程写成矩阵形式,将会是长这样的(大家自己验证哦)

[ \begin{pmatrix}x \y \ z \end{pmatrix} = \begin{pmatrix} i_{11} & i_{12} & i_{13} \ i_{21} & i_{22} & i_{23} \ i_{31} & i_{32} & i_{33} \end{pmatrix} \begin{pmatrix}a \ b \ c \end{pmatrix} ]

大家看出来了吗,等号右边的那个矩阵是的三列分别是O’U,O’V,O’W在OX,OY,OZ的分量表示。这就是坐标变换的核心了!!

总结一下就是,刚体坐标中点的世界坐标等于一个矩阵乘以它在刚体坐标系中的坐标。而这个矩阵描述的是刚体坐标系的坐标轴在世界坐标系中的坐标(虽然有点绕,但大家多看两遍还是很好理解的~)。如果我们的两个坐标系之间只有旋转关系(没有伸缩、平移),我们称这个矩阵为旋转矩阵,而且这个矩阵一定是正交矩阵。

3 空间旋转

有了坐标变幻的知识就可以来用旋转矩阵来描述空间旋转了。这部分主要考虑两个问题,还是用手表和手臂为例

  1. 如果我的右手臂扭(轴线沿着手臂)一个角度,手表的新世界坐标怎么求
  2. 如果我整个人保持姿势原地转一个角度,手表的新世界坐标怎么求 假定脚底是世界坐标的原点,竖直向上是OZ轴,那第二个问题就是在世界坐标系中旋转,而问题一则是绕刚体坐标系的旋转。首先明确一点,这两种旋转是不一样的!

先铺垫一下,如果我在世界坐标系中描述一个点,这个点的位置自然可以用[x,y,z]‘向量表示,那我也可以画蛇添足地写成

[ \begin{pmatrix} x\y\z \end{pmatrix}= \begin{pmatrix} 1\ 1\ 1 \end{pmatrix}\begin{pmatrix} x\y\z \end{pmatrix} ]

如果这个点在某个刚体系中的坐标是[a,b,c]’,那它在世界坐标系中的点可以写成

[ \begin{pmatrix} x\y\z \end{pmatrix} = \begin{pmatrix} 1\ 1\ 1 \end{pmatrix} \cdot R \cdot \begin{pmatrix} a\ b\c \end{pmatrix} ]

其中R是2中所说的旋转矩阵,也就是刚体坐标系的世界坐标表示。

先说绕参考坐标系旋转的情况,这样的旋转可以理解成整个世界都旋转了,我的刚体坐标系应该在一个新的世界坐标中表示,而这个新世界坐标是从原来的世界坐标旋转来的。那我们可以在单位阵和R阵之间乘一个旋转矩阵Rw,即

[ \begin{pmatrix} x’\y’\z’ \end{pmatrix}= \begin{pmatrix} 1\ 1\ 1 \end{pmatrix}\cdot R_w\cdot R \begin{pmatrix} a\ b\c \end{pmatrix} ]

其中Rw就是新世界系在旧世界系中的表示了。

如果是绕刚体系转呢?那新刚体系是从旧刚体系旋转来的,我在R后面乘上一个表示这个旋转的矩阵Rr,RRr就是新刚体系坐标轴的世界系表示了。由于点P是随刚体系一起旋转的,它在新刚体系中的坐标仍然是[a,b,c]’。也就是说

[ \begin{pmatrix}x\y\z\end{pmatrix}= \begin{pmatrix} 1\ 1\ 1 \end{pmatrix}\cdot R \cdot R_r \cdot \begin{pmatrix} a\ b\c \end{pmatrix} ]

通常,最开始的那个单位阵是不写的。于是我们就得到了教科书中常说的

  • 如果旋转坐标系 O-U-V-W 绕参考坐标系OXYZ的主轴旋转,那么在原有旋转矩阵的左边乘以单轴旋转矩阵。
  • 如果旋转坐标系 O-U-V-W 是绕其自身坐标系的主轴旋转,那么在原有旋转矩阵的右边乘以单轴旋转矩阵。

文章里没有图,我觉得看图还不如自己照着矩阵运算再画画简单的图来得直接。希望这篇文章对大家有帮助~