机器人一旦开始“动起来”,就绕不开一个最基础的问题:怎么描述物体在空间中的位置和朝向。
比如机械臂末端在哪里,夹爪朝哪个方向,工件相对机器人底座是什么姿态,摄像头看到的目标怎么转换到机械臂坐标系下……这些问题表面上看不一样,背后其实都在处理同一件事:空间中的描述与变换。
这一部分内容几乎是整个机器人学的坐标语言。后面你学正运动学、逆运动学、雅可比矩阵,甚至手眼标定、视觉伺服,本质上都在不断使用这一套东西。所以这一章看起来像“基础工具”,其实是机器人学里非常核心的一层。
坐标系与坐标变换
机器人操作对象、工具和自身结构,都是在三维空间中运动的。只要涉及空间运动,就一定要回答两个问题:第一,这个东西在哪;第二,它朝哪。

“在哪”说的是位置,“朝哪”说的是姿态。单独知道位置还不够,因为一个夹爪即使末端点到了目标处,也可能方向完全不对,根本抓不住东西。机器人真正需要处理的,从来不是纯位置,而是位置加方向,也就是我们常说的位姿。
要想把位姿描述清楚,就必须先建立坐标系。机器人学通常默认存在一个“世界参考系”,然后所有东西的位置和方向,都相对于某个坐标系来描述。你也可以继续在其他局部坐标系里描述它们,比如末端坐标系、相机坐标系、工件坐标系。于是,机器人学很自然就变成了一门“在不同坐标系之间来回翻译”的学问。
位置怎么描述:用位置向量
如果一个坐标系已经建立好了,那么空间中的任意一点,都可以用一个三维向量来表示。最常见的写法是:

这里上标 (A) 的意思是:这个向量是在坐标系 ({A}) 中表达的。也就是说,这三个数表示的是该点沿着 ({A}) 的 (x,y,z) 三个坐标轴方向的分量。
这件事看起来很普通,但其实非常重要。因为同一个物理点,在不同坐标系下写出来的数值往往完全不同。点本身没有变,变的是它的描述方式。机器人学后面大量操作,说到底都不是“把物体真的搬走”,而是在做“换一种坐标表达”。
方向怎么描述:用旋转矩阵
位置用向量描述,那一个刚体的朝向怎么描述?机器人学里最标准的方法,是在这个刚体上再附一个坐标系。这样一来,只要把这个附着坐标系相对于参考坐标系的方向说清楚,就等于把刚体朝向说清楚了。
假设我们把坐标系 ({B}) 固定在物体上,要描述它相对于 ({A}) 的方向。一个直接做法是:把 ({B}) 的三个单位轴向量,分别写成 ({A}) 坐标系下的分量,然后把它们按列排起来,形成一个 (3\times 3) 矩阵:

这就是旋转矩阵。它的每一列,表示 ({B}) 的一个坐标轴在 ({A}) 中长什么样。于是只要这个矩阵给出来,({B}) 的方向也就完全确定了。
旋转矩阵有两个非常重要的性质。第一,它的列向量两两正交,且长度都为 1;第二,它的逆矩阵等于它的转置矩阵:

这件事很有用,因为它意味着如果你知道“B 相对 A 的方向”,那“A 相对 B 的方向”不用重新算,直接转置就行:

坐标系的完整描述
在机器人里,仅仅知道一个物体的方向还不够,还得知道它的位置。所以一个完整的坐标系描述,其实要同时包含两部分:方向和原点位置。

这其实就是机器人学里对“一个坐标系相对于另一个坐标系”的完整表达。位置解决“它在哪”,旋转矩阵解决“它朝哪”。
有了描述方法,怎么从一个坐标系换到另一个
机器人学里最常见的操作,不是求一个点在哪,而是:已知它在 B 系里的坐标,怎么换成 A 系里的坐标。

先看最简单的情况。如果 ({A}) 和 ({B}) 方向完全一样,只是原点平移了,那么有:

也就是说,如果两个坐标系没有转动关系,只是挪了位置,那换坐标本质上就是向量相加。
再看第二种情况。如果两个坐标系原点重合,但方向不同,那么坐标变换就只能靠旋转矩阵:

这条公式非常重要。它表示的是:同一个点没有动,只是把它从 B 系表达,换成了 A 系表达。左边和右边说的是同一个物理点,只是数字写法不同。
如果平移和旋转同时存在,那两者合起来就是:

这就是最常见的刚体坐标变换公式。你可以把它理解成两步:先把 B 系中的向量方向转到 A 系里,再把原点偏移补上。
齐次变换矩阵:一种更统一的表示
上面这个公式已经够用了,但写起来有点分裂:前半部分是矩阵乘法,后半部分是向量加法。为了让“旋转 + 平移”统一成一次矩阵运算,机器人学里引入了齐次变换矩阵。
定义:

同时,把三维点扩成四维形式:

于是原来的“旋转加平移”就能写成统一形式:

这个矩阵 {T} 就叫齐次变换矩阵。它本质上并没有引入什么新物理意义,只是把旋转和平移打包成了一个统一算子。这样一来,机器人里的多级坐标变换就会特别整齐,尤其适合写链式关系。
齐次变换最方便的地方:能直接连乘
机器人里常常会遇到这样的问题:末端相对于关节 3,关节 3 相对于关节 2,关节 2 相对于底座,底座相对于世界。那末端相对于世界怎么求?

这时候齐次变换的优势就出来了。假设有三个坐标系 ({A},{B},{C}),那么:

也就是说,中间那个坐标系自动“消掉”了。这种写法在机械臂正运动学里几乎天天出现。你只要从底座一路往末端乘过去,就能得到末端相对于基座的总变换。
这也是为什么很多机器人教材在讲坐标变换时会特别强调记号系统。因为一个好的上标下标习惯,会让你在写连乘时几乎像做单位消元一样自然。
同样一个矩阵,为什么既能表示“描述”,又能表示“变换”
这部分是很多初学者最容易绕进去的地方。齐次变换矩阵 ({T}) 在机器人学里通常有三种看法,但数学形式是同一个。
第一种看法,它是一个坐标系描述。比如

表示“B 坐标系相对于 A 坐标系长什么样”。第二种看法,它是一个映射关系,把某个点从 B 系坐标变成 A 系坐标。第三种看法,它还可以被看成一个算子,直接对一个向量做“旋转加平移”的操作。
这三种看法本质上说的是同一套数学,只是站的角度不同。一个是“这个坐标系怎么定义”,一个是“怎么换坐标表达”,一个是“怎么对向量做几何操作”。刚开始学时容易混,但熟悉以后会发现,这种统一性反而让机器人学特别干净。
旋转的常用表示方法:欧拉角
旋转矩阵很好用,但有一个明显问题:它有 9 个数,看起来有点笨重。可一个三维旋转本质上只有 3 个自由度,所以大家自然会问:能不能只用 3 个参数来表示方向?
答案当然可以,这就引出了各种欧拉角和固定角表示。比如一种常见方式是按固定坐标轴顺序旋转,先绕 (X) 轴转 (\gamma),再绕 (Y) 轴转 (\beta),最后绕 (Z) 轴转 (\alpha)。那么总旋转矩阵可以写成:

其中三个基础旋转矩阵分别是:

把它们乘起来,就得到完整方向。

这种表示的优点很明显:只用 3 个角度,输入和理解都比较方便。比如给机械臂设一个“朝下”“向左偏 30 度”的姿态,人脑更容易接受角度,而不是直接去敲一个 (3x3) 矩阵。
但它也有缺点,就是会遇到奇异性。在某些姿态下,三个角度不再稳定,甚至会出现万向节锁问题。所以在工程里,欧拉角适合人机交互和显示,而旋转矩阵更适合内部计算。
旋转的其它表示方法:轴角和四元数
轴角其实很好理解,它把任意一个三维旋转看成“绕某一根轴转了一个角度”。也就是说,不再用九个数去写旋转矩阵,也不一定非要拆成三个欧拉角,而是直接回答两个问题:绕哪根轴转、转了多少角。于是,一个旋转就可以用“单位轴向量 + 旋转角”来描述。如果把旋转轴写成

旋转角写成 θ,那么轴角表示就记作 (k^,θ)。它的直觉特别强,因为你很容易在脑子里想象一个物体沿着某根空间轴转动的样子。后面学机器人运动学、刚体运动指数映射时,轴角表示会非常常见,因为它和“旋转的本质”贴得很近。
四元数可以理解成另一种表示旋转的方法,它本质上也是在描述三维方向变化,但形式上比欧拉角更稳定,比旋转矩阵更紧凑。它通常用四个数来表示一个旋转,虽然这四个数还要满足一个单位长度约束,但本质上仍然只对应三个自由度。一个常见写法是

这里 k^是旋转轴,θ是旋转角。四元数最大的优点,是在做姿态插值、连续旋转和数值计算时不容易出奇异问题,也不会像欧拉角那样在某些姿态下突然变得很别扭。所以在机器人、图形学、无人机和视觉系统里,四元数经常被拿来做内部姿态表示。
这一章最值得记住的是什么
如果把这一章压缩成最核心的几件事,其实就这几条。
第一,位置用向量表示,方向用旋转矩阵表示,完整位姿用齐次变换表示。第二,同一个物理对象在不同坐标系下会有不同数值描述,机器人学的大量工作,本质上是在不同描述之间做转换。第三,齐次变换矩阵是机器人学里最基础的坐标工具,它既能表示一个坐标系,也能做映射和连乘。第四,旋转除了矩阵,还可以用欧拉角、固定角、轴角等方式表示,但每种表示都有自己的优缺点。
真正学会这一章之后,你对机器人“空间关系”这件事的理解会一下子清楚很多。后面再看正运动学,其实就是在不断连乘这些变换矩阵;看逆运动学,本质上是在反过来求这些矩阵对应的关节变量;看视觉和标定,也是在不同坐标系之间做统一表达。
所以这部分看起来像坐标系基础,实际上它就是机器人学的语言系统。后面很多内容,都是在用这门语言说更复杂的话。
参考文献
Craig, John J. Introduction to Robotics: Mechanics and Control. Third Edition. Pearson, 2014.
文章来源于公众号-机器人学习笔记,仅用于学习分享,如有侵权请私聊删除

全部评论