运动学基础(一):空间坐标系与齐次变换、欧拉角与四元数、刚体姿态描述方法
各位同学,欢迎来到Delta机器人运动学的基础部分。
说实话,很多新手一上来就急着写轨迹代码,结果机器人跑起来乱晃,甚至撞到工作台。为什么?因为坐标系都没搞明白。今天这堂课,我们就来啃下这块硬骨头——空间描述与姿态表达。
1. 空间坐标系:机器人眼中的世界
Delta机器人有三个并联臂,每个臂末端都连接在同一个动平台上。要控制这个平台,我们得先定义清楚:它在哪里?它朝哪边?
我个人习惯把坐标系分成三种:
- 世界坐标系:固定在机器人底座上,所有运动都基于它。
- 工具坐标系:固定在末端执行器(比如吸嘴或夹爪)上。
- 用户坐标系:你自定义的工作台坐标系,方便编程。
举个例子。我在做分拣项目时,传送带上的工件位置是变化的。如果只用世界坐标系,每次都要重新计算偏移量,非常麻烦。后来我改用用户坐标系,把传送带平面设为一个坐标系,问题就简单多了。
2. 齐次变换:把旋转和平移打包处理
你想想看,一个刚体在空间中有6个自由度——3个平移,3个旋转。如果分开处理,公式会变得非常冗长。齐次变换矩阵就是来解决这个问题的。
一个4×4的齐次变换矩阵长这样:
| R11 R12 R13 Tx |
| R21 R22 R23 Ty |
| R31 R32 R33 Tz |
| 0 0 0 1 |
左上角3×3是旋转矩阵,右上角3×1是平移向量。最后一行永远是[0 0 0 1],这是齐次坐标的约定。
为什么要加这一行?说白了,就是为了让矩阵乘法能同时处理旋转和平移。否则你得分两步算,代码写起来又臭又长。
3. 欧拉角:直观但容易踩坑
欧拉角用三个角度来描述姿态:绕X轴转(滚转Roll)、绕Y轴转(俯仰Pitch)、绕Z轴转(偏航Yaw)。听起来很直观对吧?
但这里有个大坑——万向锁。当俯仰角接近±90°时,滚转和偏航会变得无法区分,导致姿态失控。
欧拉角的另一个问题是:旋转顺序不同,结果完全不同。常见的顺序有ZYX、ZYZ等。你必须在文档里明确标注顺序,否则别人根本看不懂你的代码。
| 旋转顺序 | 应用场景 |
|---|---|
| ZYX | 航空航天、机器人末端姿态 |
| ZYZ | 工业机器人关节角度计算 |
| XYZ | 视觉标定、相机姿态 |
4. 四元数:稳定可靠的姿态表达
四元数听起来高大上,其实就是一个四维向量:q = w + xi + yj + zk。其中w是实部,x、y、z是虚部。
为什么用四元数?三个原因:
- 无万向锁:无论怎么旋转,都不会出现奇异点。
- 插值平滑:做轨迹规划时,四元数的球面线性插值(SLERP)非常平滑。
- 计算高效:比旋转矩阵少用几个乘法,在嵌入式系统上跑得快。
我记得第一次在STM32上跑四元数运算时,发现浮点运算太慢。后来改用定点数近似,才把控制周期压到1ms以内。嗯,这里要注意,四元数归一化很重要,否则累积误差会让姿态漂移。
// 四元数归一化示例
void quaternion_normalize(float q[4]) {
float norm = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
if (norm > 0.0001f) {
q[0] /= norm;
q[1] /= norm;
q[2] /= norm;
q[3] /= norm;
}
}
5. 刚体姿态描述方法对比
三种方法各有优劣,我整理了一张表,方便你选型:
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 旋转矩阵 | 直观、容易理解 | 9个参数,冗余大 | 教学演示、简单计算 |
| 欧拉角 | 参数少、物理意义明确 | 万向锁、顺序依赖 | 人机交互、小角度运动 |
| 四元数 | 无奇异、插值平滑 | 不够直观、调试困难 | 轨迹规划、实时控制 |
6. 知识体系结构图
下面这张图展示了本章的核心逻辑:从空间坐标系出发,通过齐次变换连接平移和旋转,再对比三种姿态描述方法的适用场景。
好了,这一章的内容就到这里。空间坐标系是基础,齐次变换是工具,欧拉角和四元数是两种不同的姿态表达方式。你不需要死记硬背公式,但一定要理解它们背后的物理意义和适用场景。