04-传感器与感知-相机与标定

作者:姚博文 · 2026-09-15

相机与标定(针孔模型 / 内参外参 / 标定方法 / 相机选型)

定位:讲透相机成像几何(针孔模型、畸变、外参、立体视差、鱼眼模型)与标定三件套(棋盘格内参标定脚本、AprilTag、ROS2 中 TF 表达),完成小车的相机选型 | 适用:智能小车/移动机器人开发

1\. 概述

1.1 这篇解决什么问题

相机是智能小车上信息量最大的传感器:一帧画面里同时包含颜色、纹理与几何结构,也是唯一能"认出东西"(车道线、红绿灯、停止标志)的传感器。但原始图像只是一个 2D 像素数组,要把它用于导航,必须回答三个问题:

1. **图像是怎么形成的** — 空间某 3D 点为什么落在某个像素上?(针孔模型 + 畸变,§2.2–2.4)

2. **相机相对车在哪里** — 同一个像素,车在原地和车往前开 1 米时对应的世界位置完全不同(外参 R, t,§2.5–2.6)

3. **参数准不准** — 真实镜头不是理想针孔,必须用标定(Calibration)把内参 K、畸变 D 测出来(§4)

这三个问题的答案——**K(内参)、D(畸变)、R 和 t(外参)**——是所有视觉算法的"地基":

· 视觉里程计 / 视觉 SLAM(见 `06-定位与SLAM/`):用特征点投影模型估计位姿,K/D 错 → 位姿漂移;

· 视觉避障 / 识别(见 `08-视觉与机器学习/`):先 `undistort` 去畸变,K/D 错 → 识别框位置系统性偏移;

· 立体深度 / 相机-激光融合:外参 R, t 错 → 深度面歪斜、点云与图像对不齐。

1.2 在自主导航链路中的位置

**标定是预处理环节的离线工作**:做一次(换镜头/换分辨率/摔过之后再做),产出一组数字(K、D),之后所有在线处理都直接读这组数字。

1.3 核心概念速览

| 概念 | 一句话定义 | 本文位置 |

| --- | --- | --- |

| 内参 Intrinsics (K) | 相机"内部"参数:焦距(像素)、主点 | §2.2–2.3 |

| 畸变 Distortion (D) | 真实镜头偏离理想针孔的系统性几何偏差 | §2.4 |

| 外参 Extrinsics (R, t) | 相机相对车(世界)的位姿:旋转 + 平移 | §2.5–2.6 |

| 标定 Calibration | 采集图像 → 解出 K, D(内参);已知 3D 目标 → 解出 R, t(外参) | §4 |

| 视差 Disparity | 同一物点在左右立体图中的水平像素偏移,与深度成反比 | §2.7 |

| 重投影误差 Reprojection Error | 标定质量的判据:解出的参数把 3D 点投回图像,与实测点差几个像素 | §4.3 |

💡 **先给结论**:智能小车开发第一步标定的是**单目内参**(棋盘格 + 本文 §4.4 脚本,约 30 分钟完成);外参只在**传感器融合**(相机+激光、双目立体、相机+IMU)时才需要精确值——单车+激光的方案,外参先"尺子量 + 倾角器粗调"进 TF,后期再上目标点标定精调。

2\. 基本原理

2.1 坐标系约定:OpenCV 相机坐标系

写公式之前先统一坐标系(**坐标系混用是标定类工作第一大错误源**):

| 坐标系 | 原点 | 轴约定 | 用途 |

| --- | --- | --- | --- |

| 相机坐标系 Camera Frame | 光学中心(optical center,不是相机外壳几何中心) | z 沿光轴指向场景内,x 向右,y 向下,右手系 | 3D 成像计算 |

| 图像像素坐标 | 图像左上角像素 | u 向右,v 向下,单位:像素 | 图像/检测结果 |

| 车体系 Base Frame | 底盘参考点(见 01-基础概念/坐标系与变换.md) | x 前,y 左,z 上