机器人身上装满了“眼睛”和“耳朵”,比如激光雷达、摄像头、IMU。要让机器人理解这些传感器看到、听到的信息,我们必须为每个传感器建立一个专属的“观察哨位”,这就是传感器坐标系。它定义了从传感器自身视角出发,如何测量外部世界。
生活类比: 想象你戴着一副智能眼镜。眼镜的镜片中心就是它的“传感器坐标系原点”。当眼镜告诉你“前方1米有障碍物”,这个“前方”和“1米”的距离,都是以镜片中心为起点测量的。技术定义:传感器坐标系是一个固定在传感器上的三维直角坐标系,其原点通常位于传感器的测量中心或物理特征点,用于直接表达传感器观测到的原始数据。
每个传感器的物理构造、测量原理和安装位置都不同。激光雷达通过旋转发射激光束测距,其数据天然围绕一个旋转中心;相机成像基于小孔模型,数据来自图像平面。直接使用机器人身体坐标系来描述这些原始数据非常别扭,且无法体现传感器自身的特性。
建立独立的传感器坐标系后,所有原始观测数据都有了清晰、统一的数学表达。例如,激光雷达的一个点云数据 (x=1.5, y=0.2, z=0) 明确表示:在该雷达自身的坐标系下,这个点位于前方1.5米,右侧0.2米,高度为0的位置。
工业界和学术界对主流传感器的坐标系方向形成了事实标准。遵循这些约定能让你的代码与其他人的算法、数据集无缝对接。
| 传感器类型 | 典型型号举例 | 坐标系原点 | 坐标轴方向约定 (右手系) | 数据特点 |
|---|---|---|---|---|
| 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-6050 | IMU芯片的几何中心 | 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) 坐标。 |
我在一个仓储机器人项目里踩过坑:团队新换了一款3D雷达,我们想当然地按照旧雷达的坐标变换参数来用,结果建出的地图全是歪的。排查了半天才发现,新雷达的坐标系定义文档里,Z轴正向是朝下的(非标设计),而我们一直按朝上处理。所以,拿到新传感器的第一件事,就是查阅其数据手册或SDK文档中的坐标系定义章节。
传感器坐标系固连在传感器上。当传感器被拧到机器人身上时,这两个坐标系之间的相对位置和姿态关系就固定了。这个关系用一个齐次变换矩阵 T_sensor^base 表示,它包含了旋转和平移两部分。
安装外参: 描述了传感器坐标系相对于机器人本体坐标系(Base Link)的固定变换。它包含了安装的位置偏移(比如雷达装在机器人头顶前方0.2米处)和姿态旋转(比如相机向下倾斜15度)。
假设我们有一个2D激光雷达安装在机器人前方正中,高度0.5米,水平向前,没有任何倾斜。那么它的外参可以描述为:
如果这个雷达安装时向前倾斜了10度(即绕Y轴旋转了-10度),那么旋转部分就不再是单位矩阵了。实际开发中,大部分团队会使用URDF(统一机器人描述格式)文件来统一定义这些外参,或者直接在导航算法的配置参数中指定。
编者提示: 一个实用的经验是,在机器人机械设计阶段,就应尽量让主要传感器(如前向激光雷达)的坐标系与机器人本体坐标系对齐(即仅存在平移,没有旋转)。这能大大简化后续的坐标变换和算法逻辑,减少因坐标系旋转引入的计算误差和调试复杂度。如果因为结构限制必须旋转安装,务必在图纸和装配说明中清晰标注旋转角度。
对于简单的安装,可以通过机械图纸测量获得外参的粗略值。但对于高精度应用,或者安装了相机、IMU这类对方向极其敏感的传感器,必须通过实验进行标定。
步骤1:查阅传感器数据手册。 找到其坐标系定义的图示和文字说明,确认原点位置和XYZ轴方向。这是所有工作的基础。
步骤2:根据机器人机械结构,确定理论安装外参。 从CAD模型或实际测量中,得到传感器原点相对于机器人本体坐标系原点的位移,以及可能的旋转角度(如相机俯仰角)。
步骤3:实验标定。 对于相机-雷达外参标定,常用方法是让传感器同时观测一个已知几何形状的标定板(如棋盘格、ArUco码),通过优化算法求解最佳变换参数。对于IMU,可以通过让机器人做特定运动(如绕各轴旋转)来标定其与本体坐标系的姿态对齐关系。
步骤4:验证。 将标定得到的外参用于数据变换,观察多传感器数据在机器人坐标系下是否对齐。例如,让机器人面对一个墙角,检查激光雷达点云中的墙角线和相机图像中的墙角线是否在三维空间中重合。
calibrateCamera等函数求解。这里有个隐藏的坑:标定过程本身也是在某个坐标系下进行的。你必须明确知道标定算法输出的外参,是从传感器坐标系到哪个坐标系的变换。通常,标定工具会要求你指定一个“目标坐标系”,这个坐标系就是你的机器人本体坐标系。
在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. (判断题)“安装外参”描述了机器人本体在世界中的运动,是一个随时间变化的量。