坐标系与位姿表示:世界坐标系、机器人坐标系、位姿(x, y, θ)表示法、齐次变换矩阵

各位同学,咱们今天聊点硬核的。坐标系和位姿,说白了就是回答三个问题:我在哪?我要去哪?我怎么描述我去的过程?

我刚开始做AGV那会儿,觉得坐标系这东西太简单了,不就是画个十字轴嘛。结果第一次联调,机器人原地转圈,死活找不到目标点。查了半天,原来是坐标系搞反了。嗯,从那以后,我再也不敢小看这章内容了。

一、世界坐标系 vs 机器人坐标系

先搞清楚两个坐标系的关系。你想想看,AGV在车间里跑,它得知道自己在地图上的位置,也得知道自己车身上的传感器在什么方位。

  • 世界坐标系(World Frame):固定在地面上的参考系。通常以地图左下角为原点,X轴指向东,Y轴指向北。这个坐标系是全局的,所有物体都相对于它定位。
  • 机器人坐标系(Robot Frame):固定在AGV车体上的参考系。原点在机器人中心,X轴指向车头方向,Y轴指向左侧。这个坐标系是跟着机器人动的。

核心概念:世界坐标系是「绝对」的,机器人坐标系是「相对」的。两者之间通过平移和旋转来转换。

我在项目中遇到过一个问题:激光雷达扫描到的障碍物坐标,是在机器人坐标系下的。但路径规划需要世界坐标系下的坐标。如果不做转换,机器人就会撞墙。所以,坐标系变换是避不开的坎。

二、位姿(x, y, θ)表示法

位姿,就是位置+姿态。位置好理解,就是坐标点(x, y)。姿态呢?就是机器人朝哪个方向,用角度θ表示。

举个例子:
机器人位于世界坐标系中的 (2.5, 3.0) 处,车头朝向东北方向,角度为 45°。那么它的位姿就是:

pose = (x=2.5, y=3.0, θ=45°)

这里要注意几个细节:

  • θ 通常以弧度为单位,但调试时我喜欢用角度,直观。代码里再转弧度。
  • θ 的范围一般是 [-π, π] 或 [0, 2π),看你的习惯。
  • θ=0 表示车头朝向 X 轴正方向。

个人经验:我习惯用弧度制做运算,用角度制做显示。ROS里默认是弧度,但调试信息打印成角度更方便肉眼检查。

为什么用三个量就能描述一个平面机器人的状态?因为AGV在平面上运动,只有两个平移自由度和一个旋转自由度。说白了,它不能像无人机那样上下翻飞。

三、齐次变换矩阵

好了,现在问题来了:已知机器人在世界坐标系下的位姿,怎么把机器人坐标系下的一个点转换到世界坐标系下?

答案就是齐次变换矩阵。它是一个 3×3 的矩阵(对于二维平面),长这样:

| cosθ  -sinθ  x |
| sinθ   cosθ  y |
|  0      0    1 |

这个矩阵把旋转和平移打包在一起了。你想想看,如果没有齐次变换,你得先旋转再平移,两步操作。有了它,一步到位。

具体怎么用?假设机器人坐标系下有一个点 P_robot = (px, py),想求它在世界坐标系下的坐标 P_world:

P_world = T * P_robot

其中 T 是齐次变换矩阵,P_robot 要写成齐次坐标形式 (px, py, 1)

展开计算:

P_world.x = cosθ * px - sinθ * py + x
P_world.y = sinθ * px + cosθ * py + y

是不是很简洁?

避坑指南:我曾经在代码里忘记把普通坐标转成齐次坐标(末尾加1),结果矩阵乘法算出来全是错的。调试了一下午才发现。记住:齐次坐标的最后一个分量,点用1,向量用0。

四、逆变换与复合变换

有正变换就有逆变换。已知世界坐标系下的点,想求它在机器人坐标系下的坐标,就用逆矩阵:

T_inv = | cosθ   sinθ  -x*cosθ - y*sinθ |
        | -sinθ  cosθ   x*sinθ - y*cosθ |
        |  0      0           1         |

复合变换更常用。比如AGV先移动到A点,再移动到B点,那么从起始点到B点的总变换,就是两个变换矩阵的乘积。

T_total = T_A * T_B

注意顺序:先发生的变换在右边,后发生的在左边。这个顺序搞反了,机器人就会跑到莫名其妙的地方去。

五、知识体系结构图

下面我用一张SVG图来总结本章的核心逻辑,帮你理清思路:

坐标系与位姿表示 知识体系 世界坐标系 固定在地面,全局参考 机器人坐标系 固定在车体,局部参考 齐次变换矩阵 T 位姿表示 (x, y, θ) 位置 + 姿态 = 完整状态描述 齐次变换矩阵 | cosθ -sinθ x | | sinθ cosθ y | | 0 0 1 |

这张图把本章的核心逻辑串起来了:世界坐标系和机器人坐标系之间,通过位姿(x, y, θ)建立联系,而齐次变换矩阵就是实现这个联系的数学工具。

六、实战中的注意事项

场景 常见错误 我的建议
传感器数据转换 忘记将激光雷达坐标从机器人系转到世界系 写一个工具函数,输入位姿和点,输出转换后的点
多机器人协同 各机器人使用不同的世界坐标系原点 统一使用地图原点,并在启动时校准
路径跟踪 θ 角度跳变导致控制量突变 对 θ 做 unwrap 处理,避免 -π 到 π 的跳变

调试技巧:我习惯在Rviz里同时显示世界坐标系和机器人坐标系,用不同颜色区分。如果两个坐标系对不上,一眼就能看出来。另外,打印位姿时用 (x, y, deg) 格式,人脑更容易理解。

好了,坐标系和位姿这部分就讲到这里。记住一句话:没有坐标系,机器人就是瞎子;没有位姿,机器人就是路痴。 下一章我们会把这些知识用到运动学模型里,到时候你就知道今天学的有多重要了。


专注资料整理