坐标系与状态表示:全局坐标系、局部坐标系、机器人位姿表示(x, y, theta)

好,咱们进入第二个题目。坐标系这东西,听起来有点抽象,但说白了,它就是机器人的「世界观」。

我刚开始做机器人规划时,犯过一个低级错误——把局部坐标当成全局坐标用。结果机器人原地转了三圈,然后一头撞向墙壁。嗯,从那以后,我对坐标系的理解就深刻多了。

1. 全局坐标系:机器人的「世界地图」

全局坐标系,也叫世界坐标系。你可以把它想象成一张固定的地图。不管机器人走到哪,这个坐标系的原点和方向都不变。

我个人习惯用 X轴指向东,Y轴指向北。当然,这不是硬性规定。有些项目里,X轴指向正前方,Y轴指向左侧,也完全没问题。关键是——整个团队要统一。

核心要点:

  • 全局坐标系是固定的,不随机器人移动而改变
  • 通常用大写字母表示,比如 X_w、Y_w
  • 用于路径规划、地图构建等全局任务

我在项目中遇到过一个问题:两个传感器各自定义了自己的「全局坐标系」,结果数据融合时全乱了。后来我们强制规定:所有传感器数据必须先转换到同一个全局坐标系下。这个教训,值好几万块钱。

2. 局部坐标系:机器人的「第一人称视角」

局部坐标系是跟着机器人走的。机器人往左转,局部坐标系也跟着往左转。说白了,就是「以我为中心」看世界。

你想想看,机器人身上的激光雷达、摄像头,它们采集的数据都是相对于机器人自身的。如果不用局部坐标系,每次都要换算到全局坐标,计算量会爆炸。

我的习惯:

局部坐标系通常把原点放在机器人的几何中心,X轴指向正前方,Y轴指向左侧。这样处理传感器数据最直观。

为什么局部坐标系这么重要?因为控制指令都是基于局部坐标发出的。比如「向前走1米」,这个「向前」就是局部坐标系里的X轴方向。

3. 机器人位姿表示:(x, y, theta)

好了,现在我们要回答一个核心问题:如何描述机器人「在哪」以及「朝哪看」?

答案就是三个量:x, y, theta。

符号 含义 单位
x 机器人在全局坐标系中的X坐标 米 (m)
y 机器人在全局坐标系中的Y坐标 米 (m)
theta 机器人的朝向角(与X轴正方向的夹角) 弧度 (rad) 或度 (°)

这里有个坑,我必须要说:theta 的取值范围。有些库用 [-π, π],有些用 [0, 2π)。我曾经因为没统一这个范围,导致角度跳变,机器人原地打转。嗯,后来我写了个函数专门做角度归一化。

避坑指南:

我曾经在角度计算时直接用了 atan2(y, x) 的结果,没做归一化。结果在 -π 和 π 的边界处,角度跳了 2π,机器人直接来了个360度大回旋。从那以后,我每次处理角度都先归一化到 [-π, π]。

4. 坐标系转换:从局部到全局

实际应用中,我们经常需要在全局坐标和局部坐标之间来回切换。比如:

  • 激光雷达检测到前方2米处有障碍物(局部坐标)
  • 需要把这个障碍物位置转换到全局坐标,更新地图
  • 规划出一条全局路径后,再转换回局部坐标,生成控制指令

转换公式其实很简单,但容易写错。我直接给你代码:

// 局部坐标 (lx, ly) 转全局坐标 (gx, gy)
// 机器人位姿 (x, y, theta)
gx = x + lx * cos(theta) - ly * sin(theta);
gy = y + lx * sin(theta) + ly * cos(theta);

// 全局坐标 (gx, gy) 转局部坐标 (lx, ly)
dx = gx - x;
dy = gy - y;
lx = dx * cos(theta) + dy * sin(theta);
ly = -dx * sin(theta) + dy * cos(theta);

你看,其实就是个旋转加平移。我建议你把这段代码封装成函数,每次调用就行,别手算——我手算错过好几次。

5. 知识体系结构图

下面这张图,是我自己总结的坐标系与状态表示的知识结构。你看一眼,心里就有谱了。

坐标系与状态表示 知识体系 全局坐标系 • 固定不变 • 世界地图 • 路径规划 局部坐标系 • 随机器人移动 • 第一人称视角 • 传感器数据 位姿 (x,y,θ) • 位置 + 朝向 • 角度归一化 • 状态估计 坐标系转换 旋转矩阵 + 平移向量 路径规划 运动控制 传感器融合

6. 实际项目中的经验

最后,分享几个我在实际项目中踩过的坑:

  • 角度单位要统一:有的传感器输出度,有的输出弧度。我建议全部转成弧度,因为数学库里的三角函数都认弧度。
  • 坐标系方向要明确:是右手系还是左手系?Z轴朝上还是朝下?这些细节决定了你的转换公式对不对。
  • 别忘了初始化:机器人启动时,位姿 (x, y, theta) 通常设为 (0, 0, 0)。但如果你用的是GPS,那初始值就是经纬度转换后的坐标。

一个小技巧:

调试时,我习惯在屏幕上同时显示全局坐标和局部坐标下的机器人位置。如果两个坐标系的转换正确,那么局部坐标下的障碍物位置,转换到全局坐标后,应该和地图上的障碍物位置重合。这个方法帮我抓出过好几个bug。

好了,坐标系和状态表示就讲到这里。记住一句话:坐标系是机器人的世界观,搞错了世界观,后面全白搭。