坐标系定义:世界坐标系、物体坐标系、相机坐标系的概念与关系
做机器人仿真,说白了就是跟坐标系打交道。我见过不少新手,代码写得挺溜,但一涉及到坐标变换就懵了。嗯,这很正常。今天咱们就把这三个最核心的坐标系掰扯清楚。
世界坐标系——整个仿真世界的“绝对参考”
世界坐标系,你可以把它想象成整个仿真场景的“大地基准”。它固定不动,所有其他坐标系的位置和姿态,最终都要换算到它上面来。
我个人习惯把世界坐标系的原点放在仿真场景的中心地面。为什么?因为这样正负坐标对称,调试起来直观。我在做移动机器人项目时,就吃过亏——一开始把原点随便放在墙角,结果算里程计的时候,坐标值动不动就溢出,排查了半天才发现是原点位置选得不合理。
世界坐标系的关键特征:
- 固定不变,不随任何物体移动
- 通常用大写字母 W 或 world 表示
- 所有其他坐标系的变换,最终都要转换到世界坐标系下
- 在 ROS 中,通常用
map或odom作为世界坐标系
物体坐标系——跟着物体走的“本地参考”
物体坐标系,也叫本体坐标系。它牢牢地贴在物体上,物体怎么动,它就怎么动。
你想想看,如果你要控制一个机械臂抓取杯子,你肯定希望用机械臂自身的坐标系来描述它的关节角度,而不是用世界坐标系去算每个关节的绝对位置。那样太反人类了。
我记得有一次做多机器人协同仿真,每个机器人都有自己的物体坐标系。我犯了个低级错误——把两个机器人的物体坐标系定义方向搞反了。结果一个机器人说“向左转”,另一个真的向左了,但它的左边其实是另一个方向。嗯,调试了整整一个下午。
物体坐标系定义小技巧:
- 通常把原点放在物体的质心或几何中心
- Z轴一般指向上方(右手系)
- X轴指向物体前方
- Y轴由右手定则确定
这样做的好处是,旋转和平移的物理意义非常清晰。
相机坐标系——从“眼睛”看世界
相机坐标系,就是模拟摄像头的视角。它跟物体坐标系类似,也是跟着相机走的。但有个特殊之处——相机坐标系的 Z 轴通常指向相机的前方(也就是镜头朝向的方向),而 X 轴指向右,Y 轴指向下。
为什么会这样?因为图像坐标系的原点在左上角,X 向右,Y 向下。为了跟图像坐标系对齐,相机坐标系就采用了这种“别扭”的朝向。我第一次接触时也觉得奇怪,但用多了就习惯了。
注意:相机坐标系跟物体坐标系的朝向定义不同。如果你直接把物体坐标系的变换套用到相机上,图像会上下颠倒。我曾经在项目里踩过这个坑,投影出来的点云全反了。
三个坐标系的关系——变换矩阵是桥梁
这三个坐标系之间怎么转换?靠的就是齐次变换矩阵。说白了,就是一个 4x4 的矩阵,同时包含了旋转和平移信息。
举个例子:
# 世界坐标系下的物体位置
T_world_to_object = [
[R, t],
[0, 0, 0, 1]
]
# 物体坐标系下的相机位置
T_object_to_camera = [
[R_cam, t_cam],
[0, 0, 0, 1]
]
# 世界坐标系下的相机位置
T_world_to_camera = T_world_to_object * T_object_to_camera
你看,这就是链式变换。从世界到物体,再从物体到相机,乘起来就是世界到相机。我在仿真中经常用这种链式关系来推算传感器数据。
一张图看懂三者关系
下面这张 SVG 图,把三个坐标系的关系画得清清楚楚。我建议你多看几遍,理解透了这个图,坐标变换就入门了。
实际仿真中的坐标系管理
在搭建仿真环境时,我建议你遵循以下原则:
- 统一命名规范:比如
world、base_link、camera_link,别自己瞎起名 - 树形结构管理:所有坐标系组成一棵树,根节点是世界坐标系
- 定期验证:在仿真中放一个已知位置的标记物,用坐标变换算一下,看对不对得上
我的一个小习惯:每次新建仿真项目,我都会先写一个简单的测试脚本,打印出各个坐标系之间的变换矩阵。如果发现矩阵不对,马上就能定位问题,不用等到后面跑大场景时才抓瞎。
好了,坐标系的概念和关系就讲到这里。你只要记住:世界坐标系是绝对基准,物体坐标系跟着物体走,相机坐标系是特殊的物体坐标系。它们之间用变换矩阵连接。搞懂了这些,后面的坐标变换计算就是水到渠成的事。
可可精品资料库