1. 从“标定”说起:为什么它无处不在又至关重要?
如果你在制造业、机器人、自动驾驶或者任何一个涉及精密测量的领域工作过,那么“标定”这个词对你来说一定不陌生。它听起来有点技术,有点枯燥,但却是所有精密系统从“能用”到“好用”甚至“精准”的基石。简单来说,标定就是给一个测量系统“定规矩”的过程。一个未经标定的传感器,就像一把没有刻度的尺子,你只能用它比较长短,却无法说出具体的数值。而标定,就是在这把尺子上刻上精确的毫米、厘米刻度,让它从一个定性工具变成一个定量工具。
这个过程的核心,是建立测量系统输出值与真实物理量之间的准确对应关系。比如,一个摄像头拍到的图像是二维的像素坐标,但我们关心的是三维世界的实际位置;一个力传感器输出的是一串电压信号,但我们想知道的是施加了多少牛顿的力;一个机械臂的每个关节都有编码器读数,但我们需要知道末端执行器在空间中的精确位姿。所有这些从“信号”到“物理量”的转换桥梁,都需要通过标定来搭建。没有标定,自动驾驶汽车无法准确感知障碍物的距离,工业机器人无法完成高精度的装配,医疗影像设备也无法给出可靠的诊断依据。因此,理解标定的分类,就是理解我们如何为不同的“尺子”刻上最合适的“刻度”,这是深入任何感知与控制系统都无法绕过的一课。
2. 标定分类的底层逻辑:按对象、方法与目标三维拆解
面对五花八门的标定任务,初学者很容易感到困惑:为什么有的标定需要在无尘室里用激光干涉仪完成,而有的只需要对着棋盘格拍几张照片?其根本原因在于标定的对象、方法和目标不同。我们可以从这三个维度来构建对标定分类的清晰认知,这比死记硬背几种类型要有用得多。
2.1 按标定对象划分:你的“尺子”是什么?
这是最直观的分类方式,直接决定了标定的技术路径和复杂程度。
传感器标定:这是最基础的层面,针对单个感知元件。目的是确定传感器自身的输入-输出特性。例如:
- 相机标定:确定相机的内参(焦距、主点、畸变系数)和外参(相机相对于世界坐标系的位置和姿态)。内参标定回答“像素坐标如何对应到相机坐标系下的射线”,外参标定回答“相机在哪儿”。
- 惯性测量单元标定:确定陀螺仪的零偏、标度因数误差、安装误差,以及加速度计的零偏、标度因数和非正交误差。不标定的IMU积分几分钟,位置误差可能达到公里级。
- 激光雷达标定:确定每个激光束的发射角度、时间偏移等,以确保点云中每个点的三维坐标准确。
- 联合标定:当多个传感器协同工作时(如相机+激光雷达,相机+IMU),需要确定它们之间的相对位置和姿态关系(外参),这个过程称为传感器间的联合标定或标定。这是多传感器融合的前提。
执行器标定:针对输出动作的机构。目的是建立控制指令与实际物理输出之间的准确关系。
- 机器人标定:工业机器人的运动学标定(确定连杆长度、关节零位等几何参数误差)和动力学标定(确定质量、惯性张量、摩擦系数等)。前者影响绝对定位精度,后者影响高速高负载下的轨迹跟踪性能。
- 伺服系统标定:标定电机、驱动器、减速器整套系统的控制环参数,如PID增益、摩擦补偿、前馈等,以实现精准的力/位置控制。
系统标定:针对整个闭环系统。对象不再是单个部件,而是包含感知、决策、控制的完整链条。例如,自动驾驶车辆的“整车标定”,会综合检验感知系统的探测精度、定位系统的位姿精度、控制系统的路径跟踪精度在真实车辆上的整体表现。
2.2 按标定方法划分:如何“刻刻度”?
方法的选择,取决于对象的特性、可获得的参照物以及精度要求。
基于模型的标定:这是主流方法。我们为标定对象建立一个参数化的数学模型(如相机的小孔成像模型+畸变模型),然后通过观测数据(如棋盘格角点)来求解模型中的未知参数。这个过程本质上是一个优化问题:寻找一组参数,使得模型预测的输出与实际观测值之间的误差最小。
- 优点:物理意义明确,参数可解释,精度高。
- 缺点:依赖于模型的准确性。如果实际系统行为偏离模型假设(如存在未建模的非线性),标定效果会下降。
非模型标定(或称为黑箱标定、数据驱动标定):当系统过于复杂,难以用简洁的物理模型描述时,会采用这种方法。例如,使用神经网络直接学习从传感器原始数据到最终物理量的映射关系。在一些复杂的工业过程或生物医学信号处理中有所应用。
- 优点:无需精确建模,能拟合复杂非线性关系。
- 缺点:可解释性差,依赖大量数据,泛化能力可能不足,且标定结果不易传递。
手动标定 vs 自动标定:根据人工参与程度划分。手动标定依赖操作员使用千分表、块规等工具进行测量和调整,常见于高精度机床的初始装调。自动标定则由系统自动执行数据采集和参数计算流程,如相机标定软件自动检测棋盘格并计算参数,效率高,一致性更好。
2.3 按标定目标划分:你想得到什么?
这决定了标定过程的输出和评价标准。
- 参数标定:目标是得到模型中的具体参数值。例如,相机标定最终输出焦距
fx, fy、主点cx, cy、径向畸变系数k1, k2, k3、切向畸变系数p1, p2这一系列数值。这些参数可以保存下来,用于后续所有的几何计算。 - 误差补偿标定:目标是直接得到一个“查表”或“补偿函数”,用于实时校正测量值。例如,对于存在非线性误差的温度传感器,我们可能不关心其物理模型,而是通过标定实验建立一张“读数-真实温度”的查找表,测量时直接查表补偿。这种方法在模型复杂或未知时很有效。
- 性能验证标定:目标不是获取参数,而是验证系统整体性能是否达到预期指标。例如,在交付一台测量机之前,使用标准量块进行测量,验证其示值误差是否在承诺的微米级范围内。这更像是一次“期末考试”。
理解这三个维度,你就能在面对一个具体的标定任务时,迅速定位:我要标定什么(对象)?我有哪些资源(方法)?我最终要拿到什么(目标)?这个思维框架是指导所有标定实践的总纲。
3. 内参标定 vs 外参标定:以相机为例的经典剖析
在众多标定类型中,相机标定的内参与外参之分最为典型,也最能体现标定的核心思想。我们以此为例进行深入拆解,你会发现其中蕴含的逻辑可以迁移到许多其他传感器上。
3.1 内参标定:刻画相机自身的“生理特征”
想象一下,你新买了一个相机,但你不信任厂家给出的规格参数,或者这个相机经过改装、镜头更换,你需要自己来确定它的“视力特性”。这就是内参标定的场景。它的目标是确定从三维相机坐标系到二维图像像素坐标系之间变换的固有参数,这些参数只与相机和镜头本身有关,与相机放在哪里无关。
内参矩阵通常表示为:
K = [ fx, 0, cx, 0, fy, cy, 0, 0, 1 ]fx, fy:焦距,单位为像素。它决定了物体的成像大小。为什么用像素?因为这直接关联到感光元件(CMOS/CCD)上像元的大小和间距。cx, cy:主点坐标,通常是图像的中心点(但不绝对,需要标定)。它是光轴与成像平面的交点。- 为什么需要标定
fx, fy分开?因为现代相机感光元件的像元不一定是完美的正方形,fx和fy的微小差异反映了像素在x和y方向上的物理尺寸不同。 - 畸变系数:这是内参标定另一大核心产出。由于镜头并非理想的小孔成像,会引入畸变,主要是径向畸变(图像边缘的直线变弯)和切向畸变(由于镜头与传感器不平行导致)。标定就是求解像
k1, k2, k3(径向)和p1, p2(切向)这些系数,用于后续的图像校正。
实操心得:内参标定的“棋盘格”艺术张正友标定法之所以成为经典,棋盘格功不可没。这里有几个容易忽略的细节:
- 棋盘格质量:打印的棋盘格一定要平整,黑白方格对比度要足够高。最好使用表面覆膜的硬质材料,避免反光。我曾用普通A4纸打印,环境光稍强,角点检测就频繁失败。
- 姿态多样性:拍摄时,要让棋盘格在相机视野中出现在不同位置、不同角度(既有倾斜也有旋转)、不同距离。建议拍摄15-20张以上。目的是让角点数据充分覆盖图像的各个区域(尤其是边缘),这样求解出的畸变系数才准确。只拍正面平行几张,标定结果往往只在图像中心区域准确。
- 焦距初始化:很多标定工具(如OpenCV的
calibrateCamera)需要一个初始焦距估计。一个实用技巧是,可以用图像的宽度(像素)除以传感器宽度(毫米,查相机手册)来得到一个粗略的fx初始值。这能帮助优化算法更快、更稳定地收敛。
3.2 外参标定:确定相机在“世界”中的位姿
内参标定好了,相机自身“视力”清楚了。现在,我要用这个相机来测量房间里物体的位置。那么,相机本身在房间(世界坐标系)的哪个位置?朝哪个方向看?这就是外参标定要解决的问题。
外参用一个3x3的旋转矩阵R和一个3x1的平移向量t表示。它描述了如何将世界坐标系下的点P_w转换到相机坐标系P_c:P_c = R * P_w + t。
外参标定的典型场景就是手眼标定。在机器人领域,这分为两类经典问题:
- 眼在手外:相机固定在一个地方,观察机器人末端的工具。目标是求相机坐标系到机器人基座坐标系的变换关系。
- 眼在手上:相机安装在机器人末端,随着机器人一起运动。目标是求相机坐标系到机器人末端法兰盘坐标系的变换关系。
无论是哪种,其数学本质都是求解一个“AX=XB”的方程。其中,A是机器人末端(或基座)的运动变换(通过机器人控制器读数已知),B是相机观察到的标定物(如棋盘格)的运动变换(通过图像计算已知),X就是我们要求解的手眼关系(外参)。
避坑指南:外参标定的运动要求解“AX=XB”方程,对机器人(或相机)的运动轨迹有严格要求。一个常见的错误是只让机器人做单纯的平移运动或绕单一轴旋转。这样采集的数据是病态的,方程无法求解出唯一稳定的解。正确的做法是让机器人做充分“兴奋”的运动:
- 既要有较大的平移变化(在不同位置拍摄)。
- 更关键的是,要有充分的三维旋转变化。让末端工具或标定板在相机视野中呈现不同的偏航、俯仰、横滚姿态。理想情况下,这些旋转轴不应共面。
- 通常需要10组以上不同位姿的数据。采集时,要确保标定物在每张图像中都清晰可见且角点能被成功检测。
- 标定完成后,必须验证。用一个已知尺寸的物体放在机器人工作空间内不同位置,用标定好的系统测量其位置,与真实值(或机器人示教值)对比,计算重投影误差或绝对位置误差。这是检验外参标定成功与否的唯一金标准。
4. 在线标定与离线标定:时效性与精度的权衡
标定并非一劳永逸。传感器会随着时间漂移(如IMU的零偏),机械结构会因温度、负载发生微变,镜头可能因震动而松动。因此,根据标定发生的时机和频率,又可以分为离线标定和在线标定。
4.1 离线标定:追求极致精度的“体检”
离线标定是指在系统正式投入运行之前,在一个受控的、精心准备的环境下进行的标定。它通常追求最高的精度。
- 场景:实验室、出厂前、定期维护时。
- 特点:
- 环境可控:在温湿度稳定的实验室内,使用高精度的标定设备(如高精度三维标定板、激光跟踪仪、转台)。
- 过程耗时:步骤严谨,数据采集全面,参数计算复杂,可能持续数小时。
- 精度最高:目标是获取当前状态下最准确的参数,作为后续运行的基准。
- 静态参数:标定结果一旦确定,在本次运行周期内通常视为不变。
- 典型应用:工业相机的出厂标定、高精度机器人运动学标定、自动驾驶原型车传感器联合标定的初始阶段。
4.2 在线标定:适应动态环境的“自适应”
在线标定是指在系统正常运行过程中,利用可获得的观测信息,实时或近实时地对参数进行估计和修正。它牺牲一部分绝对精度,换取了系统的自适应能力和长期稳定性。
- 场景:系统运行过程中,无法中断任务时。
- 特点:
- 环境不可控:在真实、动态、可能存在干扰的环境下进行。
- 实时/周期性:可以是连续的(如基于滤波器的估计),也可以是周期性的(如每天启动时进行一次)。
- 精度相对较低:依赖运行时的观测数据,这些数据本身可能带有噪声,且观测条件未必理想。
- 动态参数:参数被视为随时间缓慢变化的,需要持续跟踪。
- 技术方法:
- 基于滤波器的估计:将待标定参数(如相机外参、IMU零偏)作为状态量,纳入卡尔曼滤波器或扩展卡尔曼滤波器的状态向量中,利用系统运行时的其他传感器观测(如视觉特征点、GPS、轮速计)对其进行实时估计。这是自动驾驶和机器人SLAM中的常见做法。
- 基于优化窗口的估计:在视觉惯性里程计中,滑动窗口优化不仅估计机器人的位姿,也同时优化相机与IMU之间的时延、尺度因子等标定参数。
- 利用场景约束:在自动驾驶中,可以利用“车辆行驶在平坦地面”、“车道线是平行的”等场景先验信息,在线修正相机的俯仰角等外参。
4.3 如何选择?一个实用的决策框架
在实际项目中,离线标定和在线标定往往结合使用,形成“初始标定 + 在线维护”的混合策略。
- 初始基准:系统首次部署时,务必进行高精度的离线标定,获取一组可靠的基准参数。这组参数是后续所有在线修正的“锚点”。
- 评估漂移源:分析哪些参数容易漂移(如IMU零偏、机械结构热变形影响的外参),哪些相对稳定(如相机内参、镜头畸变)。
- 设计在线策略:对易漂移的参数设计在线估计模块。例如,在机器人启动时,让其执行一套固定的“热身”动作,利用内置的传感器(如关节编码器)和末端观测(如接触力觉)对动力学参数进行快速标定。在自动驾驶车辆行驶中,利用车道线和平地假设对相机外参进行微调。
- 设置安全边界:在线标定更新的参数必须有合理的边界约束,防止在受到异常干扰(如传感器短暂故障、剧烈颠簸)时,参数被错误更新到离谱的数值,导致系统崩溃。通常会将在线更新的幅度限制在离线标定值附近的一个可信区间内。
我个人的经验是,永远不要完全依赖在线标定。一个设计良好的系统,其在线标定模块更像是一个“微调”和“补偿”机制,用于对抗缓慢的漂移。而系统的核心精度和稳定性,必须建立在扎实、可靠的离线标定基础之上。试图用在线标定去纠正一个初始偏差巨大的系统,就像用软件算法去修正一个硬件设计缺陷,往往是徒劳且危险的。
5. 标定流程的通用范式与关键陷阱
无论标定何种对象,一个稳健的标定流程都遵循着“准备-采集-计算-验证”的通用范式。跳过或轻视其中任何一环,都可能导致标定失败或精度不达标。下面我们拆解这个流程,并指出每个环节最常见的“坑”。
5.1 第一阶段:精心准备——成败在此一举
很多人急于采集数据,却忽略了准备阶段,这是标定误差的主要来源之一。
- 标定物的选择与制作:
- 精度是生命线:标定物本身的精度必须远高于你期望的系统精度。如果你希望相机标定达到0.1像素的重投影误差,那么棋盘格方格的尺寸误差就必须控制在微米级。使用低精度打印的棋盘格,是绝对无法得到高精度标定结果的。
- 特征点需明确:角点、圆点、ArUco码等特征必须清晰、对比度高,且能被检测算法稳定、重复地提取。在光照变化大的环境中,可能需要使用主动发光的标定板。
- 尺寸与距离匹配:标定物在图像中应占据足够大的区域(通常建议超过图像面积的1/4),特征点要清晰可辨。距离太远,特征点只有几个像素,提取误差会很大。
- 环境控制:
- 光照:均匀、稳定的光照至关重要。避免阴影、反光、高光。对于视觉标定,我强烈建议使用漫射光源,或者在没有直射光的阴天户外进行。
- 振动与稳定性:标定期间,相机、标定物、机器人基座都必须保持绝对稳定。即使是微小的振动,也会在数据中引入噪声。对于高精度标定,需要隔振平台。
- 温度:对于涉及金属机械结构或某些光学元件的标定,需要考虑热膨胀的影响。最好在系统达到热平衡(运行一段时间后)再进行标定,并在标定报告中记录环境温度。
5.2 第二阶段:数据采集——宁多勿少,宁杂勿单
数据采集的质量和数量直接决定了参数估计的精度和鲁棒性。
- 位姿覆盖的完备性:这是最核心的原则。必须让标定物(或相机)出现在尽可能多的不同位置和姿态上。具体来说:
- 空间覆盖:布满整个相机视野,包括四个角落和中心。
- 姿态覆盖:要有绕X、Y、Z轴的各种旋转组合,而不仅仅是倾斜。让标定板“跳舞”。
- 距离覆盖:有远有近。近距离可以获取更多特征点,远距离可以更好地约束焦距参数。
- 数据量:没有绝对的标准,但通常相机内参标定需要15-25张有效图像。对于手眼标定,至少需要10组不同且激励充分的机器人位姿。数据量太少,优化容易陷入局部最优或对噪声敏感。
- 一个关键检查:每采集一张图像/一组数据,立即检查特征点是否被正确、完整地检测出来。如果检测失败(如部分角点未检出、误检),必须当场重拍。事后才发现大量数据无效,代价巨大。
5.3 第三阶段:参数计算——理解工具,而非黑箱
现在进入“计算”环节。大多数人只是调用一个库函数(如OpenCV的calibrateCamera),然后等待输出结果。但理解背后的原理和工具的选项,能帮你诊断问题。
- 初值的重要性:非线性优化算法(如Levenberg-Marquardt)需要一个好的初始猜测值才能收敛到全局最优。对于相机内参,主点
(cx, cy)可以用图像中心初始化,焦距f可以用一个经验值(如图像宽度)。糟糕的初值可能导致优化失败或收敛到错误的值。 - 理解输出信息:
- 重投影误差:这是标定质量最直接的指标。它表示将标定出的参数反投回图像,计算出的投影点与真实检测到的角点之间的平均像素距离。一般来说,对于精心准备的标定,这个误差应小于0.1像素(对于普通镜头)到0.5像素(对于广角/鱼眼镜头)。如果误差达到几个像素,说明标定很可能失败了。
- 参数的标准差/协方差:高级的标定工具会给出每个估计参数的标准差。这反映了该参数估计的置信度。如果某个参数(如某个畸变系数)的标准差非常大,接近甚至超过其估计值本身,说明这个参数在当前数据下“不可观”,数据没有提供足够的信息来约束它。此时,你应该考虑固定这个参数(设为0),或者采集更多样化的数据。
- 剔除异常值:在标定过程中,可能存在少数几张图像因为轻微模糊、检测误差大等原因成为“坏点”。它们会严重扭曲优化结果。稳健的标定流程应该包含异常值剔除步骤。例如,可以计算每张图像的平均重投影误差,将误差明显大于其他图像的帧剔除后,重新进行优化。
5.4 第四阶段:验证与评估——不要相信没有验证的标定
标定程序运行完毕,输出了参数,这绝不意味着工作结束。没有经过独立验证的标定结果是不可信的。
- 独立验证集:绝对不能使用参与标定的数据来验证标定结果!这就像用同一套题目来训练和测试模型,会得到过于乐观的评估。你必须预留一部分在标定时未使用的数据(用不同的位姿拍摄的图像)作为验证集。
- 验证指标:
- 重投影误差(验证集):将标定得到的参数用于验证集图像,计算重投影误差。这个误差应该与标定集上的误差处于同一量级。如果显著变大,说明标定结果过拟合了标定集数据,泛化能力差。
- 绝对精度测量:这是最可靠的验证方法。使用一个已知精确尺寸的物体(不是标定板),将其放置在工作空间的不同位置,用标定好的系统去测量它的尺寸或关键点之间的三维距离。将测量值与真实值比较,得到系统的绝对测量精度。这才是系统最终性能的体现。
- 文档化:详细记录标定环境(温度、湿度)、设备(相机型号、镜头型号、标定板规格)、数据量、关键参数结果(内参、重投影误差)和验证结果。这份文档对于问题追溯、版本对比和后续维护至关重要。
标定是一个系统工程,它考验的不仅是理论知识,更是严谨的实验态度和对细节的掌控能力。每一次成功的标定,都是对物理世界与数字模型之间桥梁的一次可靠焊接。