第8章 传感器坐标系

码枢沄社 · 嵌入式体系化教程平台
入门 👤 刚接触机器人硬件集成的开发者 🔧 为机器人配置激光雷达、相机等传感器
本章你将学到
  • 传感器坐标系的定义与作用
  • 常见传感器(激光雷达、IMU、相机)的坐标系约定
  • 如何确定和标定传感器坐标系
核心概念传感器原点安装外参

机器人身上装满了“眼睛”和“耳朵”,比如激光雷达、摄像头、IMU。要让机器人理解这些传感器看到、听到的信息,我们必须为每个传感器建立一个专属的“观察哨位”,这就是传感器坐标系。它定义了从传感器自身视角出发,如何测量外部世界。

生活类比: 想象你戴着一副智能眼镜。眼镜的镜片中心就是它的“传感器坐标系原点”。当眼镜告诉你“前方1米有障碍物”,这个“前方”和“1米”的距离,都是以镜片中心为起点测量的。技术定义:传感器坐标系是一个固定在传感器上的三维直角坐标系,其原点通常位于传感器的测量中心或物理特征点,用于直接表达传感器观测到的原始数据。

为什么需要独立的传感器坐标系?

每个传感器的物理构造、测量原理和安装位置都不同。激光雷达通过旋转发射激光束测距,其数据天然围绕一个旋转中心;相机成像基于小孔模型,数据来自图像平面。直接使用机器人身体坐标系来描述这些原始数据非常别扭,且无法体现传感器自身的特性。

建立独立的传感器坐标系后,所有原始观测数据都有了清晰、统一的数学表达。例如,激光雷达的一个点云数据 (x=1.5, y=0.2, z=0) 明确表示:在该雷达自身的坐标系下,这个点位于前方1.5米,右侧0.2米,高度为0的位置。

激光雷达点云 (x, y, z)
雷达坐标系
机器人坐标系
相机像素 (u, v)
相机坐标系
机器人坐标系
这个固定的变换关系,就是传感器的安装外参

常见传感器的坐标系约定

工业界和学术界对主流传感器的坐标系方向形成了事实标准。遵循这些约定能让你的代码与其他人的算法、数据集无缝对接。

传感器类型典型型号举例坐标系原点坐标轴方向约定 (右手系)数据特点
2D激光雷达Hokuyo UTM-30LX, Slamtec RPLIDAR激光发射器的旋转中心X轴向前,Y轴向左,Z轴向上数据为在XY平面内的点 (x, y),Z坐标通常为0。
3D激光雷达Velodyne VLP-16, Ouster OS1雷达内部扫描中心X轴向前,Y轴向左,Z轴向上数据为三维点云 (x, y, z)。
惯性测量单元Bosch BMI088, TDK InvenSense MPU-6050IMU芯片的几何中心X轴向前,Y轴向左,Z轴向上输出角速度、加速度,方向基于此坐标系。
单目/双目相机Intel RealSense D435, MYNT EYE S相机光心 (小孔模型中的小孔)Z轴沿光轴向前,X轴向右,Y轴向下图像像素坐标(u,v)通过内参模型与此坐标系关联。
深度相机 (RGB-D)Microsoft Kinect v2, Intel RealSense D435i深度传感器或红外相机光心与单目相机约定相同 (Z向前,X向右,Y向下)提供彩色图像和配准后的深度图,每个像素有 (X, Y, Z) 坐标。

⚠️ 常见误区

  • 混淆坐标系朝向: 最容易出错的是相机坐标系。它的Y轴是向下的(与图像像素坐标系一致),而激光雷达/IMU的Y轴是向左的。如果搞反,融合数据会完全错乱。
  • 忽视原点位置: 认为传感器坐标系原点在物理外壳的角落或安装板中心。实际上,原点在测量中心。例如,相机原点在“镜头后面”的光心,而非CMOS传感器表面。
  • 假设默认对齐: 新买来的传感器,其坐标系与机器人本体坐标系默认是对齐的。实际上,只要安装时有一丝倾斜或偏移,两个坐标系就不重合,必须通过标定获取外参。

我在一个仓储机器人项目里踩过坑:团队新换了一款3D雷达,我们想当然地按照旧雷达的坐标变换参数来用,结果建出的地图全是歪的。排查了半天才发现,新雷达的坐标系定义文档里,Z轴正向是朝下的(非标设计),而我们一直按朝上处理。所以,拿到新传感器的第一件事,就是查阅其数据手册或SDK文档中的坐标系定义章节

传感器安装外参:从“观察哨”到“身体”

传感器坐标系固连在传感器上。当传感器被拧到机器人身上时,这两个坐标系之间的相对位置和姿态关系就固定了。这个关系用一个齐次变换矩阵 T_sensor^base 表示,它包含了旋转和平移两部分。

安装外参: 描述了传感器坐标系相对于机器人本体坐标系(Base Link)的固定变换。它包含了安装的位置偏移(比如雷达装在机器人头顶前方0.2米处)和姿态旋转(比如相机向下倾斜15度)。

假设我们有一个2D激光雷达安装在机器人前方正中,高度0.5米,水平向前,没有任何倾斜。那么它的外参可以描述为:

如果这个雷达安装时向前倾斜了10度(即绕Y轴旋转了-10度),那么旋转部分就不再是单位矩阵了。实际开发中,大部分团队会使用URDF(统一机器人描述格式)文件来统一定义这些外参,或者直接在导航算法的配置参数中指定。

编者提示: 一个实用的经验是,在机器人机械设计阶段,就应尽量让主要传感器(如前向激光雷达)的坐标系与机器人本体坐标系对齐(即仅存在平移,没有旋转)。这能大大简化后续的坐标变换和算法逻辑,减少因坐标系旋转引入的计算误差和调试复杂度。如果因为结构限制必须旋转安装,务必在图纸和装配说明中清晰标注旋转角度。

如何确定与标定传感器坐标系

对于简单的安装,可以通过机械图纸测量获得外参的粗略值。但对于高精度应用,或者安装了相机、IMU这类对方向极其敏感的传感器,必须通过实验进行标定。

步骤1:查阅文档
步骤2:测量/设计安装位
步骤3:实验标定(如需)
步骤4:验证变换

步骤1:查阅传感器数据手册。 找到其坐标系定义的图示和文字说明,确认原点位置和XYZ轴方向。这是所有工作的基础。

步骤2:根据机器人机械结构,确定理论安装外参。 从CAD模型或实际测量中,得到传感器原点相对于机器人本体坐标系原点的位移,以及可能的旋转角度(如相机俯仰角)。

步骤3:实验标定。 对于相机-雷达外参标定,常用方法是让传感器同时观测一个已知几何形状的标定板(如棋盘格、ArUco码),通过优化算法求解最佳变换参数。对于IMU,可以通过让机器人做特定运动(如绕各轴旋转)来标定其与本体坐标系的姿态对齐关系。

步骤4:验证。 将标定得到的外参用于数据变换,观察多传感器数据在机器人坐标系下是否对齐。例如,让机器人面对一个墙角,检查激光雷达点云中的墙角线和相机图像中的墙角线是否在三维空间中重合。

激光雷达外参标定

  • 目标: 获取雷达相对于机器人本体的精确位置和角度。
  • 方法: 机器人静止,扫描一个特征明显的静态环境(如两面垂直的墙),通过点云匹配优化求解外参。
  • 关键: 需要高精度的先验地图或环境几何模型作为参考。

相机内参与外参标定

  • 目标: 获取相机内部参数(焦距、畸变)和相对于本体的外参。
  • 方法: 使用棋盘格标定板,从多个角度拍摄照片,利用OpenCV的calibrateCamera等函数求解。
  • 关键: 标定板需要充满画面,并呈现多种姿态。

相机-雷达联合标定

  • 目标: 获取相机与雷达之间的空间变换关系。
  • 方法: 使用一个同时能被相机和雷达“看到”的特定标定物(如带有角点的立体标定板),对齐两者的观测数据。
  • 关键: 解决传感器数据模态不同(图像 vs 点云)的匹配问题。

这里有个隐藏的坑:标定过程本身也是在某个坐标系下进行的。你必须明确知道标定算法输出的外参,是从传感器坐标系到哪个坐标系的变换。通常,标定工具会要求你指定一个“目标坐标系”,这个坐标系就是你的机器人本体坐标系。

在代码中处理传感器坐标系

在ROS等机器人框架中,传感器坐标系通常通过`tf`库来管理和发布。每个传感器坐标系作为`tf`树中的一个节点,其到机器人本体坐标系的变换由静态变换发布器(`static_transform_publisher`)或标定得到的参数来发布。

下面是一个概念性的代码片段,展示了如何用齐次变换矩阵将激光雷达点从传感器坐标系转换到机器人本体坐标系:

// 假设我们有一个激光雷达点在其自身坐标系下的坐标
double point_in_laser[3] = {1.5, 0.2, 0.0}; // x, y, z

// 激光雷达的外参:安装在机器人前方(0.3, 0, 0.5),水平向前(无旋转)
double translation[3] = {0.3, 0.0, 0.5}; // x, y, z 平移
double rotation[9] = {1,0,0, 0,1,0, 0,0,1}; // 3x3单位旋转矩阵 (无旋转)

// 将点转换到机器人本体坐标系
double point_in_base[3];
// 应用旋转: point_rotated = R * point_in_laser
point_in_base[0] = rotation[0]*point_in_laser[0] + rotation[1]*point_in_laser[1] + rotation[2]*point_in_laser[2];
point_in_base[1] = rotation[3]*point_in_laser[0] + rotation[4]*point_in_laser[1] + rotation[5]*point_in_laser[2];
point_in_base[2] = rotation[6]*point_in_laser[0] + rotation[7]*point_in_laser[1] + rotation[8]*point_in_laser[2];

// 再应用平移: point_in_base = point_rotated + t
point_in_base[0] += translation[0];
point_in_base[1] += translation[1];
point_in_base[2] += translation[2];

// 此时 point_in_base 就是点在机器人本体坐标系下的坐标
printf("点在机器人坐标系: (%.2f, %.2f, %.2f)\n",
       point_in_base[0], point_in_base[1], point_in_base[2]);

在实际开发中,你会使用Eigen、TF2等数学库来完成这些变换,它们提供了更简洁、高效的API。重要的是理解其背后的原理:每个传感器的数据都必须经过一次“外参变换”,才能从它自己的小世界进入机器人共通的“大世界”。

动手试一试

1. 虚拟安装: 在纸上画一个矩形代表你的机器人(本体坐标系:X向前,Y向左,Z向上)。在矩形前方正中、离地20厘米处画一个点代表2D激光雷达原点。假设雷达坐标系与机器人坐标系朝向一致。请写出这个雷达的外参变换矩阵中的平移向量 (x, y, z)。

2. 坐标系推理: 查阅一款常见传感器(如Intel RealSense D435深度相机)的官方文档或ROS驱动说明,找到其坐标系定义图。描述它的X, Y, Z轴分别指向哪个方向。

3. 思维实验: 如果一个IMU的加速度计输出为 (ax=0, ay=0, az=9.8),且已知其坐标系Z轴向上。当机器人静止水平放置时,这个输出合理吗?如果IMU被倒置安装(Z轴向下),同样的静止状态下,输出会变成什么?

检验你的理解

1. (判断题)传感器坐标系的原点通常定义在传感器外壳上最方便安装测量的角落。

2. (选择题)在标准的相机坐标系约定中,哪个描述是正确的?
A. X轴向前,Y轴向左,Z轴向上。
B. Z轴沿光轴向前,X轴向右,Y轴向下。
C. X轴向右,Y轴向下,Z轴向后。
D. 原点位于图像平面的左上角像素中心。

3. (判断题)“安装外参”描述了机器人本体在世界中的运动,是一个随时间变化的量。

本章小结

  • 传感器坐标系是固连在传感器上的三维坐标系,用于表达该传感器的原始观测数据,其原点和轴向有行业约定。
  • 不同传感器(激光雷达、IMU、相机)的坐标系约定不同,使用前必须查阅官方文档确认,尤其注意相机坐标系的Y轴向下。
  • 安装外参(一个固定的旋转平移变换)描述了传感器坐标系到机器人本体坐标系的静态关系,是进行多传感器数据融合的前提。
  • 确定外参可通过机械测量和实验标定两种方式,对于精度要求高的应用,标定是必不可少的步骤。
  • 在软件中,通过齐次变换矩阵或`tf`等工具来应用外参,将传感器数据统一到机器人本体坐标系下进行处理。
码枢沄社 · 嵌入式体系化教程平台

3000+ 实战教程 · STM32 / Linux / RTOS / 汽车电子 / 物联网…
官方v:kulemao21 | 咨询 · 定制 · 完整目录
查看全部课程
← 上一章 返回目录 下一章 →