第一章:机器人运动学基础
大家好,欢迎来到《从零搭建机器人运动模型》的第一章。
说实话,运动学这东西,听起来挺唬人的。什么坐标系、变换矩阵、齐次坐标……我刚入行那会儿,看到这些词就头大。但后来我发现,搞懂它,其实就是搞懂一件事:机器人怎么知道自己的手在哪儿。
嗯,咱们今天就把这事儿掰扯清楚。
1.1 坐标系与变换矩阵
先问个问题:你站在房间里,说“杯子在桌子右边”。那“右边”是谁的右边?是你的,还是桌子的?
你看,这就是坐标系的意义。没有坐标系,位置就是一笔糊涂账。
在机器人里,我们常用两种坐标系:
- 世界坐标系:固定在地面上的,全局参考系。比如车间里那个固定的激光雷达,它的坐标就是世界坐标。
- 机体坐标系:绑在机器人身上的,跟着它动。比如机械臂末端的手爪,它的坐标就是相对于机械臂基座的。
那怎么把一个点从机体坐标转到世界坐标?用变换矩阵。
我习惯把变换矩阵想象成一个“翻译官”。它把机器人自己脑子里的位置,翻译成我们能看懂的世界位置。
核心公式:
P_world = T * P_body
其中 T 就是变换矩阵,它包含了旋转和平移的信息。
举个例子。假设机械臂末端在机体坐标系下是 (1, 0, 0),而机体坐标系相对于世界坐标系旋转了 90 度,还平移了 (2, 0, 0)。那它在世界坐标系下是多少?
算一下你就知道,不是简单的 (3, 0, 0)。因为旋转会改变方向。这就是变换矩阵存在的意义——它把旋转和平移打包处理了。
我的小经验: 刚开始写代码时,我总搞混左乘和右乘的顺序。记住:T * P 是先旋转再平移,P * T 是先平移再旋转。顺序错了,机器人就跑到墙里去了。
1.2 刚体运动的描述
什么叫刚体?说白了,就是不会变形的物体。机械臂的连杆、机器人的底盘,都是刚体。
刚体运动,就是它从 A 点跑到 B 点,同时可能还转了个身。描述这种运动,我们需要两个东西:
- 位置:用三维坐标 (x, y, z) 表示
- 姿态:用旋转矩阵、欧拉角或四元数表示
我个人最常用的是旋转矩阵。为什么?因为它直观,而且方便做矩阵运算。但旋转矩阵有个问题——它有 9 个元素,却只描述 3 个自由度,冗余信息太多。
所以后来我慢慢转向了四元数。四元数只有 4 个参数,没有奇点问题,插值也平滑。我记得第一次用四元数做机械臂轨迹规划时,那个顺滑感,真的让人舒服。
避坑指南: 我曾经在项目里直接用欧拉角做姿态插值,结果机械臂在某个角度突然“翻了个跟头”。后来才发现,那是万向锁问题。从那以后,凡是涉及姿态插值的,我全换成了四元数。
1.3 齐次坐标与齐次变换
好,现在问题来了。我们既要描述旋转,又要描述平移。如果分开写,代码会变得很啰嗦。
齐次坐标就是来解决这个问题的。它把三维坐标 (x, y, z) 扩展成四维 (x, y, z, 1)。多出来的那个 1,就是齐次因子。
你想想看,这样一来,旋转和平移就可以合并成一个 4x4 的矩阵了。这个矩阵,就叫齐次变换矩阵。
齐次变换矩阵的结构:
| R T |
| 0 1 |
其中 R 是 3x3 旋转矩阵,T 是 3x1 平移向量。
用齐次变换矩阵,我们可以把一连串的变换串联起来。比如机械臂从基座到末端,中间经过好几个关节,每个关节都有一个变换矩阵。把它们乘起来,就得到了末端相对于基座的位姿。
这就是机器人运动学的核心思想:链式变换。
我的习惯: 在 ROS 里,我经常用 tf2 库来处理齐次变换。它帮你管理了所有坐标系之间的关系,你只需要发布和监听变换就行。省心得很。
知识体系总览
下面这张图,是我自己画的本章知识结构。你可以把它当作一张地图,随时回来看看。
本章小结
这一章我们聊了三件事:
- 坐标系:世界坐标和机体坐标,以及它们之间的变换矩阵。
- 刚体运动:位置加姿态,用旋转矩阵或四元数描述。
- 齐次变换:把旋转和平移打包成 4x4 矩阵,方便链式计算。
这些东西,是机器人运动学的基石。后面的章节里,我们会用它们来搭建完整的运动模型。到时候你会发现,今天学的每一个概念,都会反复出现。
嗯,今天就到这儿。下一章我们聊正运动学——怎么从关节角度算出末端位置。到时候见。