1 · TF坐标系统概述

做机器人导航,绕不开 TF。说白了,TF 就是 ROS 里用来描述“每个零件在哪、朝哪”的那根线。我最早接触 TF 的时候,觉得它不就是几个坐标嘛,后来被坑了几次才明白——TF 是导航的骨架,骨架歪了,整个系统就别想走直。

什么是 TF?

TF(Transform)是 ROS 中的坐标变换库。它维护了一棵随时更新的树,树上的每个节点代表一个坐标系,节点之间的边代表相对位置和姿态。你想想看,机器人有底盘、激光雷达、里程计、地图……每个部件都有自己的“局部视角”,TF 就把这些视角统一起来。

我个人习惯把 TF 理解成“机器人的骨骼”。只要骨骼关系对,任何模块都能随时问:“激光雷达现在相对于地图原点在哪?” TF 一秒内给出答案。

核心一句话: TF 解决的是“我在哪,你又在哪,咱俩啥关系”的问题。

TF 在导航中的作用

导航栈里,TF 几乎无处不在。我举个例子:
机器人要规划路径,它必须知道 base_link(机器人本体)在 map(地图)中的位姿。这个位姿从哪来?要么是里程计推算,要么是 SLAM 定位。但不管哪种,最终都要靠 TF 发布出去。

  • 定位融合: 把轮式里程计、IMU、激光雷达的数据统一到同一个时间轴和坐标系下。
  • 传感器数据对齐: 激光扫描的点云是在 laser_link 下采集的,但代价地图需要转换到 base_link 或 map。
  • 路径跟踪: 全局规划器在 map 下生成路径,局部规划器必须知道 base_link 相对于路径的位置。

嗯,这里要注意:导航栈对 TF 的实时性要求很高。我曾经遇到一个项目,机器人走几步就开始抖动,查了半天发现是 TF 的发布频率不够,导致规划器拿到的是“过期坐标”。

💡 我的经验:导航中 TF 的更新频率最好不低于 30Hz,尤其是 odom→base_link 的变换。

常见坐标系定义与关系

导航里最常见的四个坐标系,我一个个说清楚。

坐标系全称作用
map地图坐标系全局固定,通常由 SLAM 建立,原点与真实世界某个点绑定。
odom里程计坐标系以机器人启动位置为原点,随运动漂移,但短时精度高。
base_link机器人基座坐标系固定在机器人底盘上,通常位于驱动轮轴中心。
laser_link激光雷达坐标系激光传感器的原点,点云数据就是相对于这个系。

它们的关系像一条链:map → odom → base_link → laser_link(以及其他传感器)。
为什么这么设计?因为 map 和 odom 之间是“漂移修正”的关系,而 odom 到 base_link 是连续推算的。你想想看,如果直接把 map 连到 base_link,一旦定位跳变,整个控制就会乱套。

map odom base_link laser_link 定位修正 里程计推算 静态/动态 全局固定 相对起始点 机器人本体 激光雷达

▲ 导航中典型的 TF 坐标树链(简化)

坐标系之间的“潜规则”

做导航调参,你一定会遇到坐标系不匹配的报错。我分享几个避坑点:

  • map 和 odom 不能直接连。 它们之间必须有一个“漂移修正”节点(比如 robot_localization 或 AMCL)。
  • base_link 必须位于机器人旋转中心。 如果放偏了,旋转时激光点云会扭曲。我曾经因为 base_link 偏移了 5 厘米,导致建图重影,折腾了两天。
  • laser_link 的安装角度要标定准确。 哪怕差 1 度,远距离障碍物位置就会偏几十厘米。
⚠️ 注意:laser_link 的父坐标系通常是 base_link,但有些机器人把激光装在底盘之外(比如顶部),这时候中间可能多一个 base_footprint 或 base_laser_link。一定要用 tf_echo 确认树结构。

好了,这一章我们理清了 TF 是什么、为什么重要、以及四个核心坐标系的关系。