想象一下,你要告诉一个朋友你家书桌的位置。你可能会说:“从大门进来,往前走3米,然后左转走2米,书桌就在你右手边。”这种描述方式,本质上就是在使用一个坐标系——以大门为原点,前进方向为X轴,左侧为Y轴。在机器人世界里,我们使用一种更精确、更通用的数学工具来描述位置和方向,这就是笛卡尔坐标系。
笛卡尔坐标系,也叫直角坐标系,是一个由互相垂直的坐标轴构成的系统,用于唯一确定空间中一个点的位置。在机器人学中,我们最常用的是三维笛卡尔坐标系。
一个完整的三维笛卡尔坐标系由三个核心要素构成:原点、坐标轴和方向。理解这三者,你就掌握了坐标系的骨架。
原点是一个固定的参考点,所有位置的测量都从这里开始。坐标轴是从原点延伸出的三条互相垂直的直线,通常标记为X轴、Y轴和Z轴。方向则由著名的“右手定则”来确定。
这是确定三维坐标系各轴正方向的黄金法则。伸出你的右手,让拇指、食指和中指两两垂直:
这个规则确保了不同坐标系之间方向定义的一致性。我在调试机械臂时,曾因为一个外部传感器提供的坐标系方向不符合右手定则(可能是左手系),导致计算出的抓取位置完全错误,排查了半天才发现是坐标轴方向定义冲突。
现在,我们可以用笛卡尔坐标系来精确地定义它。
| 分量 | 描述 | 在三维坐标系中的表示 | 示例 (单位:米) |
|---|---|---|---|
| 位置 (Position) | 机器人上某一点(如底盘中心)相对于坐标系原点的偏移。 | 一个三维向量 (x, y, z) | (1.5, 0.8, 0.0) |
| 姿态 (Orientation) | 机器人本体相对于坐标系各轴的旋转角度。 | 旋转矩阵、欧拉角或四元数( | 绕Z轴旋转30度 |
| 位姿 (Pose) | 位置和姿态的组合。 | 位置向量 + 姿态表示 | 位置(1.5,0.8,0), 绕Z轴旋转30度 |
对于地面移动机器人(如扫地机器人、AGV),我们通常忽略高度变化,将其简化为二维平面上的运动。此时,位姿可以用三个量表示:x坐标、y坐标和朝向角(通常称为偏航角,yaw)。
一个机器人系统内部存在多个笛卡尔坐标系,它们像地图上的不同图例层,共同描述了机器人的状态和环境信息。
例如,激光雷达测到一个障碍物在其自身坐标系下的坐标是(2.0, 0.5, 0.1)。只有我们知道雷达相对于机器人底盘中心的安装位置和角度(即两个坐标系间的变换关系),才能计算出这个障碍物在机器人本体坐标系下的位置,进而判断是否会发生碰撞。
编者提示:从“相对”到“绝对”的思维转换
实际开发中,最常遇到的坑就是坐标系混乱。当你拿到一个坐标数据时,第一反应必须是问:“这个坐标是相对于哪个坐标系的?”养成这个习惯能避免绝大多数定位和导航错误。我参与过一个AGV项目,定位模块输出的坐标默认是在“起始点坐标系”下,而路径规划模块期望的是“地图坐标系”,两者原点相差几十米,直接导致机器人“鬼畜”乱跑。解决方法就是明确每个数据源的坐标系上下文,并在系统设计文档中强制标注。
根据机器人应用场景的不同,我们会对坐标系进行简化或使用完整的三维表示。
对于在平坦地面运动的机器人(如自动驾驶汽车、仓库AGV),我们使用二维坐标系(X, Y)加上一个旋转角(θ,即偏航角Yaw)。其位姿通常写作 (x, y, θ)。
对于在空中飞行或需要复杂操作的机器人(如无人机、机械臂),则必须使用三维坐标系(X, Y, Z),姿态也需要用三个旋转角(Roll, Pitch, Yaw)或更复杂的数学工具来描述。
在代码中,我们使用结构体或类来封装位姿数据。以二维位姿为例,一个典型的C++定义如下:
struct Pose2D {
double x; // X坐标(米)
double y; // Y坐标(米)
double theta; // 偏航角(弧度)
// 一个实用的构造函数
Pose2D(double x_ = 0.0, double y_ = 0.0, double theta_ = 0.0)
: x(x_), y(y_), theta(theta_) {}
};
// 使用示例:创建一个表示机器人位于(1.0, 2.0),朝向东方(0弧度)的位姿
Pose2D robot_pose(1.0, 2.0, 0.0);
注意,角度在数学运算中通常使用弧度制。如果你从传感器得到的是角度制(0-360度),记得先转换为弧度(弧度 = 角度 * π / 180)。很多三角函数库的默认输入就是弧度。
理解并熟练使用笛卡尔坐标系,是读懂机器人状态、处理传感器数据、进行路径规划的前提。它就像机器人世界的通用语言,所有模块都必须基于统一的坐标系“方言”进行交流。
1. 纸上练习:在一张白纸上画一个二维笛卡尔坐标系,原点在中心。标出X轴向右为正,Y轴向上为正。在图上标出以下几个点:A(2, 1), B(-1, 3), C(0, -2)。然后,在每个点旁边画一个小箭头,表示机器人位于该点且朝向分别为:A点箭头指向右(0度),B点箭头指向左上(135度),C点箭头指向下(-90度或270度)。这就是三个不同的二维位姿。
2. 思维练习:假设你的书桌是一个“机器人”,定义两个坐标系:
- 坐标系W:以你房间的门口为原点,进门方向为X轴正方向,左侧为Y轴正方向。
- 坐标系D:以书桌中心为原点,桌面正对你时的朝向为X轴正方向,左侧为Y轴正方向。
试着描述你的电脑显示器在坐标系D下的位置(例如:显示器在书桌中心正前方0.5米,即(0.5, 0))。然后,思考一下,如果你知道书桌在房间里的位置和朝向,如何计算出显示器在坐标系W(房间门口)下的位置?这个“如何计算”的过程,就是坐标变换的核心思想。
1. 判断题:在三维笛卡尔坐标系中,根据右手定则,当拇指指向X轴正方向,食指指向Y轴正方向时,中指指向的是Z轴负方向。(对/错)
2. 选择题:对于一个在室内平坦地面移动的扫地机器人,我们最少需要几个参数来描述它在某一时刻的完整位姿?
A. 2个 (x, y)
B. 3个 (x, y, z)
C. 3个 (x, y, θ)
D. 6个 (x, y, z, roll, pitch, yaw)
3. 判断题:坐标值(5, -3)具有绝对意义,我们可以直接知道这个点在哪里。(对/错)