01-基础概念-坐标系与变换
作者:姚博文 · 2026-09-15
坐标系与变换
定位:建立"位姿的通用语言"——坐标系、刚体变换、姿态表示与 ROS2 TF2,是整条自主导航链路所有模块共同的地基 | 适用:智能小车/移动机器人开发
1\. 概述
1.1 这篇文档解决什么问题
先给一段外行也能懂的话:**机器人必须随时在"我怎么动的"和"我在世界的哪里"之间做翻译**。里程计说"我往前走了 1 米、左转了 90°",激光雷达说"我前方 3 米有堵墙",地图说"那堵墙在 (5, 3)"——这些数字各说各话,分属不同的坐标系。如果不先定义一套统一的坐标系(frame)和坐标系之间的变换规则,这些数字就拼不到一起,"自主导航"就只是一堆无法互相引用的数字。这篇文档就是来定义这套语言的。
具体回答以下问题:
· 坐标系(frame)和数学里的"坐标系"有什么区别?什么是右手系?
· 两个坐标系之间"旋转 + 平移"的关系怎么用一个矩阵表达?(刚体变换、齐次变换矩阵)
· 多个坐标系串联时,变换怎么复合?乘法顺序为什么不能错?
· 为什么三个角度(欧拉角)不够用、万向节死锁(gimbal lock)发生在哪、四元数(quaternion)解决了什么?
· ROS2 TF2 里的 map / odom / base\_link 三坐标系各是什么、谁发布、为什么必须拆成三段?
· 差速小车的 base\_link 系哪根轴朝前?yaw(航向角)正方向是什么?
· 左手/右手系、rad/deg、yaw 正方向混用时,怎么快速定位问题?
1.2 在自主导航链路中的位置
链路中每个模块都在**生产或消费位姿(pose = 位置 + 姿态)**。位姿离开坐标系就没有意义:"x = 1.7 m" 必须说清"在哪个坐标系下"。ROS2 的 TF2 系统管理的就是"每个位姿属于哪个坐标系、怎么互相换算"。所以本篇是 04-传感器(里程计/IMU)、06-定位、07-导航的数学前置,放在 01-基础概念最前面。
关联文档:
· [移动机器人与自主导航总览](./%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA%E4%B8%8E%E8%87%AA%E4%B8%BB%E5%AF%BC%E8%88%AA%E6%80%BB%E8%A7%88.md):各模块在全链路中的位置与频率
· `../05-控制系统/移动机器人运动学模型.md`:差速运动学,直接消费本文的 (x, y, θ) 约定
· `../labs/diff_drive_sim.py`:可运行的运动学仿真,已按本文约定实现(x 前、y 左、θ 逆时针为正)
1.3 核心概念速查
| 术语(英文) | 一句话定义 | 例子 |
| --- | --- | --- |
| 坐标系/坐标帧 (frame) | 空间中的一个点(原点)+ 一组右手系轴(朝向)+ 一个名字 | map、base_link、laser |
| 坐标系(数学) (coordinate system) | 纯数学结构:原点 + 基,没有名字和物理含义 | 笛卡尔坐标系、极坐标 |
| 位姿 (pose) | 一个坐标系相对另一个坐标系的位置 + 姿态 | "车在 map 系 (1.7, 1.7),朝向 135°" |
| 刚体变换 (rigid transform) | 旋转 + 平移的组合,把一个坐标系的点映射到另一个 | 4×4 齐次变换矩阵 |
| 齐次变换矩阵 (homogeneous transform) | 把旋转 R 与平移 p 嵌入一个 4×4 矩阵,使复合变成矩阵乘法 | $T = \begin{bmatrix} R & p \\ 0 & 1 \end{bmatrix}$ |
| 姿态 (orientation) | 位姿中"朝向"的部分(不含位置) | 旋转矩阵 / 欧拉角 / 四元数 |
| TF 树 (transform tree) | ROS 中所有坐标系构成的树,每条边是一次带时间戳的变换 | base_link → laser、odom → base_link |
| 基准连杆 (base link) | 机器人本体坐标系,所有机上传感器的"家长" |