3. 坐标系与运动学基础:笛卡尔坐标系、关节坐标系、正逆运动学简介

各位同学,今天我们来聊聊运动控制里最基础、也最绕不开的一个话题——坐标系和运动学。

说实话,我刚入行那会儿,觉得坐标系不就是初中数学嘛,有什么好学的?结果第一次调试六轴机器人,就被正逆运动学狠狠上了一课。嗯,从那以后我再也不敢小看这些基础概念了。

3.1 为什么需要坐标系?

你想想看,一个机械臂要抓东西,它得知道「自己在哪里」、「目标在哪里」。没有坐标系,这些信息就是一团乱麻。

坐标系说白了,就是给空间里的每个点一个「身份证号」。有了这个号,控制器才能精确地告诉电机:「往X方向走50毫米,再往Y方向转30度」。

我个人习惯把坐标系分成两大类:

  • 笛卡尔坐标系(直角坐标系):用X、Y、Z三个轴描述位置,用A、B、C描述姿态。适合描述「工具末端在空间中的绝对位置」。
  • 关节坐标系:用每个关节的角度值来描述。比如J1=30°,J2=-45°,J3=120°……适合描述「每个电机当前转到了什么位置」。

核心区别一句话:笛卡尔坐标系是「结果导向」,关节坐标系是「过程导向」。

3.2 笛卡尔坐标系——我们最熟悉的陌生人

笛卡尔坐标系,就是你在纸上画的那根X轴和Y轴,只不过在运动控制里,它变成了三维的。

我见过不少新手,写程序时只关注X、Y、Z,忽略了姿态角。结果呢?机器人走到目标点,但末端工具是倒着抓的——工件直接摔了。这就是典型的「位置对了,姿态错了」。

在运动控制中,笛卡尔坐标系通常包含6个自由度:

自由度 符号 说明
X轴平移 X 左右移动
Y轴平移 Y 前后移动
Z轴平移 Z 上下移动
绕X轴旋转 A(或Rx) 俯仰角
绕Y轴旋转 B(或Ry) 偏转角
绕Z轴旋转 C(或Rz) 翻滚角

我的小技巧:调试时先用示教模式让机器人走到目标位置,记录下此时的笛卡尔坐标值。然后把这个值直接写到程序里,能省掉很多计算上的麻烦。

3.3 关节坐标系——电机才不管你在哪

关节坐标系,是电机真正「听得懂」的语言。

每个关节对应一个电机,关节坐标系的值就是每个电机的目标角度。比如一个SCARA机器人,J1是肩关节,J2是肘关节,J3是上下移动,J4是手腕旋转。

为什么要有关节坐标系?因为电机只能转圈,它不知道什么叫「直线运动」。你告诉它「走到X=100,Y=200」,它得先算出来每个关节该转多少度,才能执行。

我曾经犯过一个错误:在关节坐标系下直接写了一个直线插补指令。结果机器人走出来的路径是弧线,差点撞到旁边的夹具。后来才明白——关节空间里的「直线」和笛卡尔空间里的「直线」是两码事。

注意:在关节坐标系下做运动规划,路径是不可预测的。如果你需要精确的直线轨迹,必须在笛卡尔坐标系下编程。

3.4 正运动学——从关节到笛卡尔

正运动学,就是「已知每个关节的角度,求末端工具的位置和姿态」。

说白了,你给机器人六个关节角度,它告诉你:「我现在的手在X=300,Y=150,Z=400,姿态是A=10°,B=20°,C=30°」。

正运动学是确定的、唯一的。给定一组关节角度,末端位置是固定的,没有第二种可能。

数学上,正运动学通常用齐次变换矩阵来表示:

// 伪代码示例:正运动学计算
// 输入:关节角度 j1, j2, j3, j4, j5, j6
// 输出:末端位姿矩阵 T

T = T1(j1) * T2(j2) * T3(j3) * T4(j4) * T5(j5) * T6(j6)

// 其中 T1~T6 是每个关节的变换矩阵
// 最终 T 包含了位置和姿态信息

我在项目中遇到过一个问题:正运动学算出来的位置和实际位置差了2毫米。查了半天,发现是减速比参数写错了。嗯,这种低级错误,犯过一次就记住了。

3.5 逆运动学——从笛卡尔到关节

逆运动学就复杂多了。它是「已知末端工具的目标位置和姿态,求每个关节的角度」。

为什么复杂?因为逆运动学通常有多个解,甚至可能无解。

举个例子:你要让机械臂的手伸到桌子上的某个点。它可以肘部朝上,也可以肘部朝下——两种姿态都能到达同一个点。这就是多解问题。

更麻烦的是,有些位置机器人根本够不到——那就是无解。

// 伪代码示例:逆运动学求解(以六轴机器人为例)
// 输入:目标位姿矩阵 T_target
// 输出:可能的关节角度组合

// 步骤1:检查可达性
if (距离超出工作范围) {
    return "无解";
}

// 步骤2:求解腕部位置
P_wrist = T_target * [0, 0, -d6, 1]^T;

// 步骤3:求解前三个关节(位置部分)
[j1_a, j2_a, j3_a] = solve_position(P_wrist);
[j1_b, j2_b, j3_b] = solve_position_alternative(P_wrist);

// 步骤4:求解后三个关节(姿态部分)
[j4, j5, j6] = solve_orientation(T_target, j1, j2, j3);

// 返回所有可能的解
return [ [j1_a, j2_a, j3_a, j4, j5, j6],
         [j1_b, j2_b, j3_b, j4', j5', j6'] ];

避坑指南:我曾经在逆运动学求解时,直接取了第一个解。结果机器人每次走到那个位置,都会做一个「大回环」动作——因为第一个解对应的关节角度变化太大了。后来我学会了加一个「最小关节位移」的约束,优先选择离当前关节角度最近的解。

3.6 正逆运动学的实际应用

在实际项目中,正逆运动学是成对出现的:

  • 示教时:你手动拖动机器人,编码器记录关节角度 → 正运动学算出末端位置 → 显示在屏幕上。
  • 运行时:你输入目标位置 → 逆运动学算出关节角度 → 发给伺服驱动器执行。
  • 轨迹规划时:在笛卡尔空间规划路径点 → 逆运动学转换成关节空间的运动序列 → 做速度规划和插补。

我建议你在调试时,先验证正运动学是否正确。方法很简单:手动转动每个关节,观察末端位置的变化是否符合预期。正运动学对了,逆运动学才有意义。

3.7 知识体系总览

下面这张图,是我自己总结的坐标系与运动学的关系图。你看完应该能明白整个逻辑链条:

坐标系与运动学知识体系 笛卡尔坐标系 X, Y, Z, A, B, C 关节坐标系 J1, J2, J3, J4, J5, J6 正运动学 关节角度 → 末端位姿 逆运动学 末端位姿 → 关节角度 互为逆运算 实际应用场景 示教再现 | 轨迹规划 | 碰撞检测 | 离线编程

这张图把整个逻辑串起来了。你从左边或者右边开始看都行,核心就是:正运动学是从关节到笛卡尔,逆运动学是从笛卡尔到关节。两者配合,才能让机器人既知道「自己在哪」,也知道「怎么过去」。

最后说一句:别被那些矩阵变换公式吓到。实际工作中,大部分控制器都封装好了正逆运动学函数。你真正需要理解的是:什么时候用笛卡尔坐标,什么时候用关节坐标,以及为什么同一个位置会有多个关节解。

把这些想明白了,后面学轨迹规划、速度规划,就会轻松很多。


公众号:蓝海资料掘金营,微信deep3321