机器人、车载相机标定全链路(单目 + 双目 + 手眼标定 + 环视联合)
2026/7/3 17:58:53 网站建设 项目流程

一、相机标定到底在解决什么问题?

相机拍到的图像是二维像素阵列,真实世界是三维的。要让机器人或自动驾驶系统通过图像理解真实世界——比如测量前方障碍物的距离判断车道线位置——就得在像素坐标和真实世界坐标之间建立映射关系。

这个映射关系,就是标定要干的事。拆开看,三个核心问题

  1. 内参:每个像素对应真实世界多大的角度?图像中心到底在哪?镜头让画面弯了多少?

  2. 外参:相机装在车/机器人的哪个位置?朝哪个方向?和车体坐标系什么关系?

  3. 畸变:镜头把直线拍弯了,广角镜头尤其严重,怎么纠正?

关键判断:不是所有相机都需要标定。如果相机只是给人看画面(倒车影像、监控),不需要标定。但如果图像要参与算法计算——目标检测、距离测量、三维重建——就必须标定

整个标定流程是这样的:

二、标定原理:四次坐标系转换

相机标定就是求解四个坐标系之间的转换关系。一张图讲清楚:

2.1 四个坐标系速查

2.2 三步转换

第一步:世界 → 相机(刚体变换)

通过旋转矩阵R(3×3)和平移向量t(3×1),把世界坐标系下的点旋转平移成相机坐标系下的点。R 和 t 合起来就是外参

第二步:相机 → 图像(透视投影)

利用小孔成像原理,相似三角形把三维点投影到二维平面。关键参数是焦距 f

第三步:图像 → 像素(离散化)

把物理尺寸(mm)换算成像素单位。每个像素的物理尺寸为dx × dy(mm/像素),主点在像素坐标系中的位置为(cx, cy)。焦距 f、主点 (cx, cy)、像素尺寸 dx/dy 合起来构成内参矩阵 K

一句话总结:外参管"相机在哪、朝哪看",内参管"像素怎么映射到物理世界",畸变管"镜头弯了多少"。三者缺一不可。

2.3 畸变从哪来?

理想针孔模型描述不了真实镜头。实际镜头有两种畸变:

  • 径向畸变:光线在透镜边缘弯得更多,图像"桶形"或"枕形"变形。用k1、k2、k3三个系数描述。

  • 切向畸变:透镜和成像平面不平行,用p1、p2两个系数描述。

要点:畸变系数不是越多越好,普通场景用 k1、k2、p1、p2 就够了(共 5 参数),开太多参数容易过拟合,校正效果反而更差。

三、标定参数:内参和外参怎么来?

3.1 内参:厂家给的值能直接用吗?

大多数工业相机和车载相机出厂时会附带一份内参报告,包含焦距、主点、畸变系数等。这些数据是在出厂时的光学平台上用精密仪器测出来的,理论精度很高。

但问题在于:出厂标定和实际使用环境不同。温度变化、振动、镜头螺纹松紧度等都会影响内参,尤其是焦距。焦距差 1%,100 米外的测量误差就可能达到 1 米。

自己标定优化:在实际部署前,用标定板重新标定,能得到更贴合实际工况的内参。一般做法:

  1. 打印一张高精度棋盘格标定板(常用9×6 或 10×7格,每格尺寸精确已知,如30mm

  2. 在不同角度、不同距离下拍摄15-30 张标定板图片

  3. 用 OpenCV 的cv2.calibrateCamera()或 MATLAB 的 Camera Calibrator 工具箱求解

  4. 重投影误差作为质量指标:一般要求< 0.3 像素,优秀< 0.1 像素

经验:厂家标定值作为初始值没问题,但装车/装机器人后,强烈建议自己标定一次。焦距和畸变系数在实际工况下和出厂值可能有明显差异。

3.2 外参:装车后必须重新标定

相机装到车上或机器人上后,外参(R, t)就完全变了。外参描述的是相机坐标系相对于车体/机器人基座坐标系的位置和姿态。

外参标定通常有两种方式:

  • 静态标定:在车/机器人周围放置已知位置的标定物(标定板、AprilTag、Charuco 板),拍摄后通过PnP(Perspective-n-Point)算法求解。

  • 动态标定:利用车辆/机器人的运动(如走直线、转弯),结合里程计或 IMU 数据,通过视觉-惯性联合优化在线标定外参。

要点:内参可以"一次标定,长期使用"(除非温度剧烈变化或受到撞击),但外参是装车后必须标定,而且长期运行中需要在线修正漂移。

四、单摄像头标定

4.1 标定五步走

Step 1:准备标定板

棋盘格是 OpenCV 原生支持的标定板,推荐:

  • 格子数:9×6 或 10×7

  • 格子尺寸:30mm 或 50mm(根据视场大小选择)

  • 打印后贴在平整的硬板上(玻璃、铝板最佳),普通纸贴泡沫板精度不够

Step 2:采集标定图像

  • 标定板在相机视野内各种角度、各种位置拍 15-30 张

  • 覆盖整个视野:四个角、中间、近处、远处

  • 每张图片中标定板要完整可见

  • 标定板尽量倾斜(不要总平行于成像平面),这样能更好约束焦距参数

  • 标定板占画面面积 20%-60% 为宜

Step 3:角点检测

OpenCV 提供cv2.findChessboardCorners()自动检测棋盘格角点,再配合cv2.cornerSubPix()进行亚像素精度优化。

Step 4:求解内参和畸变

调用cv2.calibrateCamera(),输入世界坐标系下的角点坐标(已知格子尺寸)和图像坐标系下的角点坐标,输出内参矩阵 K、畸变系数 D、每张图的外参 R 和 t。

Step 5:评估质量

计算重投影误差:将世界坐标点用标定出的参数反投影到图像上,与检测到的角点比较。平均误差< 0.3 像素为合格< 0.1 像素为优秀。超过 0.5 像素需要回头检查角点检测精度或重新采集图像。

本节要点:单目标定五步走——准备标定板 → 多角度采集 15-30 张 → 角点检测 → calibrateCamera() 求解 → 重投影误差评估。核心原则:标定板要覆盖整个视野,不要只拍正面。

4.2 单目标定的局限

单目相机无法直接获取深度信息。标定后,单目只能建立起"像素 → 光线方向"的映射,但无法确定光线上的物体距离。要在机器人/车载场景中做测距,单目必须配合其他传感器(如 IMU 做尺度估计)或依赖地面平面假设。

4.3 标定完了怎么验证?光看重投影误差不够

重投影误差 < 0.3px 就算合格?别被这个数字骗了。重投影误差只能说明"标定板上的角点拟合得好",不能说明标定参数在实际场景中好用。下面几种验证方法,按靠谱程度排序:

方法一:用独立验证集算重投影误差

标定时用 20 张图,另外留 5 张不参与标定,专门用来验证。在这 5 张验证图上跑cv2.projectPoints(),算重投影误差。如果验证集误差比训练集大很多(比如训练集 0.1px,验证集 0.5px),说明标定数据过拟合了——姿态覆盖不够、畸变参数开太多,都可能导致这个问题。

方法二:畸变校正后看直线

拍一张包含直线的实际场景照片(走廊、建筑外墙、瓷砖地板线),用标定参数做畸变校正后,肉眼检查这些直线是否真的直了。这是最直观的验证方式——如果校正后墙边还是弯的,标定就是失败的,重投影误差再低也没用。

方法三:放已知尺寸的物体测距(双目)

标定完双目后,找一把尺子或一个已知尺寸的物体放在相机前方,用标定参数计算深度,和实际距离对比。比如在 1 米处放一个标定板,双目测距结果应该是1.0m ± 2cm。如果偏了 10cm,回头检查基线距离和立体校正结果。

方法四:多视角投影一致性(多相机)

从不同位置拍同一个物体,用标定出的外参把物体投影到统一的坐标系下,看投影点是否重合。如果偏差超过1 个像素,说明多相机之间的外参有问题。

方法五:传感器融合对齐验证(车载)

把激光雷达点云投影到相机图像上,检查点云边缘和图像边缘是否对齐。比如路边的路灯杆,点云投影到图像上应该刚好落在灯杆的像素边缘上。如果偏了5 个像素以上,外参需要重新标定。特斯拉等车企的产线标定工位,核心验收标准就是这个。

踩过的坑:有次标定完双目,重投影误差 0.12px 看着很漂亮,但实际测距 3 米外的物体偏差 15cm。回头看标定数据——20 张照片全在画面中央 30% 区域内拍的,标定板从来没出现在边缘。标定参数在中央区域拟合得很好,但边缘区域的外推精度一塌糊涂。补拍边缘 10 张后重标,测距误差降到 2cm。

本节要点重投影误差低 ≠ 标定好。必须用独立验证集、直线校正、实物测距、传感器融合对齐来验证。标定板必须覆盖画面边缘,否则外推精度不可靠。

五、双目摄像头标定

5.1 双目标定比单目多什么?

双目相机除了要标定每个摄像头的内参,还需要标定两个摄像头之间的外参——即右摄像头相对于左摄像头的位置和姿态(R, t)。这个外参是双目测距的基础:知道了两个相机之间的基线距离和相对姿态,再加上视差,就能用三角测量算出深度。

5.2 双目标定流程

Step 1:分别标定左右相机:先用单目标定方式分别获取左右相机的内参和畸变系数。

Step 2:立体标定:用cv2.stereoCalibrate()同时输入左右相机拍摄的同一组标定板图像,输出左右相机之间的旋转矩阵 R 和平移向量 t(基线)。

Step 3:立体校正:用cv2.stereoRectify()将左右图像校正到共面且行对齐——即左右图像中同一物体出现在同一行上。这是双目匹配算法的前提。对极误差一般要求 < 0.25 像素。

Step 4:验证:检查校正后的图像对,同一特征点应在左右图的同一行上(误差 < 1 像素)。

本节要点:双目标定比单目多两步——立体标定(求 R, t 基线)和立体校正(行对齐)。对极误差 < 0.25px 是硬指标。硬件同步触发是必须的,软件触发不够精确。

5.3 双目标定的工程要点

  • 左右相机必须同时触发拍摄(硬件同步),否则运动物体会产生视差误差。软件触发通常不够精确

  • 基线距离越大,远距离测距越准,但近处盲区也越大

  • 标定时的光照、温度应与实际使用场景接近

六、多摄像头联合标定

6.1 为什么需要联合标定?

现代智能汽车通常配备 8-12 个摄像头(前视、环视、侧视、后视),机器人也可能配备多个不同朝向的摄像头。这些摄像头各自独立标定完后,还需要统一到同一个坐标系下——通常是车体坐标系机器人基座坐标系。这样才能实现:

  • 360 度环视拼接(Bird's Eye View)

  • 多相机目标跟踪(一个物体从前方视野进入侧方视野,需要知道是同一个物体)

  • 多传感器融合(相机 + 激光雷达 + 毫米波雷达)

6.2 四种联合标定方法

方法一:基于公共标定物的全局标定:在所有相机都能看到的区域放置大型标定板或多个标定物,一次性标定所有相机的外参。精度高,但场地要求高,多相机视野可能没有重叠区域。

方法二:基于标定间的链式标定:相机 A 和 B 有公共视野 → 标定 A-B 关系;相机 B 和 C 有公共视野 → 标定 B-C 关系;由此推导出 A-C 关系,再统一到车体坐标系。适合环视相机系统。

方法三:基于车辆运动的在线标定:车辆在特定场地(标定间)按固定轨迹行驶,利用特征点(地面标志、墙壁标记)和车辆里程计,同时优化所有相机的外参。目前量产车最常用的方式。

方法四:基于自然场景的在线标定:利用车道线、交通标志、建筑物边缘等自然特征,持续在线优化外参。不需要专门的标定间,但精度不如离线标定,适合做外参的长期维护和漂移补偿。

选型建议:产线用方法三(标定间+车辆运动),研发用方法一(公共标定物),长期维护用方法四(自然场景在线修正)。

6.3 多相机标定的关键挑战

七、常用标定方法对比

7.1 张正友标定法(最主流)

原理:1999 年微软研究员张正友搞出来的。用平面棋盘格标定板,从不同角度拍多张图,通过单应性矩阵求解内参,再通过旋转矩阵的正交性约束求解外参,最后用 Levenberg-Marquardt 算法做非线性优化。

优点

  • 只要一个平面标定板,成本极低

  • 上手简单,OpenCV/MATLAB/ROS 都有现成的

  • 精度高,重投影误差能到 0.1 像素以内

  • 鲁棒,光照变化影响不大

缺点

  • 得拍 15-30 张不同角度的图,麻烦

  • 标定板要覆盖整个视野,大视场相机需要大标定板

  • 对广角鱼眼镜头效果一般(需要额外处理)

7.2 Tsai 两步法

原理:先用线性方法求解大部分参数,再用非线性优化求解畸变系数。两步走,先粗后精。

优点:计算量比张正友法小,适合实时性要求高的场景。

缺点:精度稍低于张正友法,对标定板的要求更高(需要三维标定物)。

7.3 基于 AprilTag/Charuco 的标定

原理:用二维码式的标定标记(AprilTag)或棋盘格+二维码混合(Charuco),每个标记有唯一 ID,即使部分遮挡也能识别。

优点

  • 部分遮挡不影响标定,适合多相机系统

  • 不需要完整看到标定板

  • 角点检测精度更高

缺点

  • 需要打印专用标定板

  • 小尺寸标记在远距离检测困难

7.4 Kalibr(多相机+IMU 联合标定)

原理:ETH Zurich 搞的开源标定工具(GitHub: ethz-asl/kalibr),支持多相机、相机-IMU、相机-激光雷达的联合标定,基于非线性优化(Bundle Adjustment)。

优点

  • 支持多传感器联合标定

  • 精度很高,学校和企业都在用

  • 支持 AprilGrid 标定板

缺点

  • 上手麻烦,学习曲线不低

  • 标定过程耗时不少

  • 对数据质量要求高

7.5 在线自标定

原理:用自然场景中的线特征、消失点、车道线等信息,不依赖标定板,在车辆/机器人运行过程中动态更新外参。

优点

  • 不需要标定板,不需要标定场地

  • 能持续补偿外参漂移

  • 适合量产车长期维护

缺点

  • 精度不如离线标定

  • 依赖场景特征,隧道/黑夜场景可能失效

  • 算法复杂度高,需要良好的初始化

7.6 方法对比一览

选型速查:开发调试 → 张正友法(成本极低);多传感器 → Kalibr(精度最高);量产维护 → 在线自标定(持续修正);鱼眼镜头 → Ocam 模型(FOV > 150° 必选)。

7.7 鱼眼相机标定:Ocam 模型

前面说的主要是普通镜头(视场角 < 120°),但车载和机器人经常用鱼眼镜头(视场角 180° 甚至更大)。鱼眼镜头的畸变太大,传统针孔模型 + 径向/切向畸变参数已经不够用了。

Ocam 模型是鱼眼标定的主流方案。核心思路:用一个多项式直接拟合入射角 θ 到像高 ρ 的映射关系:

ρ = pol[0] + pol[1]·θ + pol[2]·θ² + ... + pol[N]·θ^N

其中 ρ 是像素到光心的距离,θ 是入射光线与光轴的夹角。通常用 4-6 阶多项式就够了。

Ocam 相比传统畸变模型的优势

实际工程中怎么选

  • 普通镜头(FOV < 100°):张正友法 + 5 参数(k1,k2,p1,p2,k3),OpenCV 原生支持

  • 广角镜头(100° < FOV < 150°):cv2.fisheye.calibrate(),OpenCV 的鱼眼模型

  • 超广角/鱼眼(FOV > 150°):Ocam 模型,参考ethz-asl/kalibr或使用 MATLAB 的鱼眼标定工具箱

和 AVM 系统的关系:典型的 AVM 系统同时支持针孔模型和 Ocam 模型。实际部署时,相机厂商用专门的标定设备做 Ocam 内参标定(高精度转台 + 平行光管),产线只做外参优化。研发阶段如果自己标定鱼眼相机,建议用 Kalibr 的 AprilGrid + Ocam 模型方案。

八、标定难点与常见易错点

标定说起来不难——拍几张棋盘格照片,跑个 OpenCV 函数,参数就出来了。但实际工程中,标定翻车太常见了。下面是六个高频坑位,每个都附了真实案例。

8.1 标定板姿态覆盖不足

这是最普遍的问题。很多新手在一个固定位置反复拍十几张,或者只拍正面、不拍侧面。结果就是:标定板始终在画面中央、始终平行于成像平面。

后果:焦距和主点约束不足,标定结果看似重投影误差很低,但实际测距精度一塌糊涂。

正确做法:标定板要覆盖整个视野——四个角、上下左右边缘都要拍到。标定板要有倾斜(至少 30-45 度),不要一直平行于成像平面。近处、中间、远处各拍几张。

真实案例:有次在实验室标定一个广角车载相机,20 张图拍完,重投影误差 0.08px,高兴得以为完美了。结果装车路测,车道线检测偏差 30cm。回头一看,20 张图全是站在相机正前方 1 米处拍的,标定板从来没出现在画面边缘。补拍四角和边缘 10 张后重标,路测偏差降到 3cm。教训:重投影误差低不代表标定好,只代表在当前数据上拟合得好。

8.2 手持标定板拍摄

网上很多教程示范手持标定板拍摄,这在双目标定场景下很麻烦。手持意味着:

  • 运动模糊(即使你感觉手很稳)

  • 卷帘快门畸变(消费级相机尤其严重)

  • 双目之间时间同步失效(微秒级偏差就够造成大误差)

正确做法:用三脚架固定相机,标定板也固定在稳定表面上。如果要移动标定板,每次移动后等待稳定再拍摄。如果用工业相机,务必使用硬件触发同步。

真实案例:一个项目用 USB 双目相机 + 手持标定板做标定,标定完重投影误差 0.15px,看着还行。但实际测距 2 米外的物体,误差高达 8cm。排查发现:USB 相机是卷帘快门的,手持标定板时微小的抖动导致每行像素曝光时间不同,产生了肉眼不可见的畸变。换成三脚架固定 + 硬件触发同步后,测距误差降到 1.5cm。

8.3 光照不当

人眼能适应大幅度的光照变化,但相机不行。标定板在图像中需要足够的对比度,同时又不能反光。常见问题:

  • 自然光下阴影不均匀,角点检测在暗处丢失

  • 室内灯光造成镜面反射,棋盘格亮区过曝

  • 标定板和背景对比度不够

正确做法:使用均匀的漫射光源(阴天室外、柔光箱),避免阳光直射。用rqt_image_view或 OpenCV 实时检查图像,确保黑白格子边界清晰锐利,没有过曝或欠曝。

真实案例:一次户外标定在下午 3 点进行,太阳斜射导致标定板半边过曝、半边正常。角点检测在过曝区域丢失了 40% 的角点,但findChessboardCorners没有报错——它静默返回了 False(OpenCV 的行为:棋盘格检测失败时不抛异常,直接返回空结果)。标定程序没有任何警告,因为没检测到棋盘格的图片被跳过了,导致实际上只有 8 张有效图片参与标定,精度可想而知。换到阴凉处重拍,角点检测率达到 100%。

8.4 畸变参数开太多

OpenCV 支持 k1、k2、k3、p1、p2、s1、s2、s3、s4 等多个畸变参数。有人觉得参数越多越精确,全部打开。结果就是过拟合——重投影误差低得离谱,但实际畸变校正效果很差,尤其画面边缘。

正确做法:相机模型越简单越好。一般场景用 k1、k2、p1、p2 就够了。k3 对大多数镜头影响极小,额外的 s 参数(薄棱镜畸变)只在极端情况下才需要。用独立测试图像验证校正效果,不要只看重投影误差。

真实案例:OpenCV 论坛上有个经典案例:一个用户用 rational model(8 参数畸变模型)标定,重投影误差 0.05px,但校正后的图像边缘出现了奇怪的"波纹"——直线在校正后反而变形了。原因是标定数据没有覆盖画面边缘,rational model 在边缘区域做了不可靠的外推。换回 5 参数模型(k1,k2,p1,p2,k3),校正效果反而正常了。

8.5 忽略温度漂移和外参变化

标定做完就万事大吉?不存在的。传感器在 -20°C 到 +60°C 的环境下工作,温度变化会导致物理形变,安装角度偏移。特斯拉 FSD 测试中,因传感器标定偏差导致 23% 的紧急制动场景失效。某自动驾驶测试车辆在雨雪天气中,IMU 与摄像头标定误差累计导致车道偏离判定失败。

正确做法

  • 建立标定参数版本管理机制

  • 定期在实车/实机上做全链路标定验证

  • 引入在线标定机制,利用道路特征点(车道线交点)持续优化外参

  • 标定精度要求:摄像头 ±0.1°,激光雷达 ±0.2°,毫米波雷达 ±0.5°

真实案例:冬天在室外标定的双目相机参数,夏天拿到户外用,测距精度从 2cm 飘到了 8cm。查了一圈发现:环境温度从 -5°C 升到 40°C,相机镜头的焦距产生了约 0.4% 的偏移,双目基线的铝合金支架也发生了热胀冷缩。后来加了在线标定模块,每周用自然场景中的消失点自动修正一次外参,测距精度才稳定在 2cm 以内。实测数据:环境温度每变化 10°C,工业相机焦距可能偏移 0.3%~0.5%,基线距离变化会直接等比例传递到深度误差。

8.6 标定板质量问题

打印在普通 A4 纸上、贴在不平整的泡沫板上——这种"标定板"精度根本达不到要求。标定板的平面度和格子尺寸精度会直接传递到标定结果中。

正确做法:使用高精度、刚性材质的标定板(玻璃基底、陶瓷基底、铝板)。标定板格子尺寸精度应在微米级。如果预算有限,至少用高质量打印 + 贴在玻璃或铝板上。

真实案例:一个团队用 A4 纸打印棋盘格、贴在泡沫板上标定,标定完测距精度一直稳不住,不同批次标定结果差异很大。后来发现泡沫板在不同湿度下会轻微弯曲,弯曲量只有 0.5mm,但足以导致角点的世界坐标出现偏差。换成 200 块的玻璃基底标定板后,标定结果的可重复性明显提升,不同批次的标定参数差异从 5% 降到了 0.5% 以内。

8.7 标定翻车了怎么排查?一套排查流程

标定结果不理想的时候,不能瞎猜。下面这套排查流程,按优先级从高到低排列,大多数标定问题都能定位到。

排查口诀一看角点准不准,二看姿态全不全,三剔误差最大图,四查畸变合不合理,五验直线直不直。

各步骤要点

第一步:逐张检查角点检测图像。把每张标定图片上检测到的角点画出来(cv2.drawChessboardCorners()),肉眼检查角点是否准确定位在黑白格子的交叉点上。如果角点偏了半个像素以上,这整张图的数据就是污染的。常见原因:光照不均、运动模糊、标定板反光、图像分辨率太低。处理方法:加cv2.CALIB_CB_ADAPTIVE_THRESH标志位提升低光照下的检测率,或者直接剔除这张图。

第二步:检查标定板姿态分布。把每张图对应的外参(rvec)画出来,看标定板在相机坐标系中的姿态分布。如果所有姿态集中在 ±10 度以内,说明标定板根本没倾斜过,焦距约束不足。理想情况下,标定板应该在 X、Y、Z 三个方向的旋转角度上都有分布。

第三步:剔除误差最大的图片。每张图都有独立的重投影误差,把误差最大的 20% 图片剔除后重新标定,看总误差是否显著下降。如果剔除几张图后误差从 0.5px 降到 0.2px,说明那几张图有问题(角点检测不准或姿态太极端)。

第四步:检查畸变系数是否合理。一个经验法则:k1 的正常范围在 -0.5 到 0.5 之间。如果 k1 的绝对值超过 1,甚至超过 10,说明数据有问题——要么角点检测错了,要么棋盘格尺寸填错了,要么标定板姿态全是正面。正常镜头不会产生这么大的畸变系数。

第五步:用独立验证集验证。不要用标定数据集验证标定结果——这是循环论证。用一组没参与标定的图片,做畸变校正后检查直线是否真的直了。如果校正后直线还是弯的,说明模型过拟合,需要减少畸变参数或增加标定板姿态覆盖。

本节要点:标定翻车时,按顺序排查——角点检测 → 姿态覆盖 → 剔除坏图 → 畸变系数 → 直线验证。绝大多数问题在第一步(角点)或第二步(姿态)就能定位到。

九、车载/机器人场景中的标定实践

9.1 车载相机标定的典型流程

9.2 机器人相机标定的典型流程

机械臂视觉(Eye-in-hand):相机装在机械臂末端

  • 手眼标定(Eye-to-Hand 或 Eye-in-Hand)

  • 标定相机坐标系到机械臂末端坐标系的变换

移动机器人视觉

  • 单目/双目/深度相机外参标定到机器人基座坐标系

  • 配合 IMU/里程计做视觉-惯性联合标定

  • 在线自标定补偿震动和碰撞导致的外参漂移

9.3 手眼标定(机器人专属)

机器人领域多了一个特殊问题:相机和机械臂的关系。分两种情况:

  • 眼在手外(Eye-to-Hand):相机固定在工作台上,标定相机坐标系到机器人基座坐标系的关系

  • 眼在手上(Eye-in-Hand):相机装在机械臂末端,标定相机坐标系到末端执行器坐标系的关系

数学上就是:求解 AX = XB 方程。其中 A 是机械臂末端的运动(从位置 i 到位置 j),B 是相机观测到的标定板运动,X 是待求的相机到机械臂末端(或基座)的变换矩阵。常用算法:Tsai-Lenz 法(两步法,先解旋转再解平移)、Park 法(基于李代数)、Daniilidis 法(对偶四元数同时求解旋转和平移)。

实际怎么选

手眼标定容易踩的坑

  1. 机械臂运动范围不够大:如果机械臂只在 10° 范围内摆动,AX=XB 的旋转分量约束不足,标定结果不稳定。至少要在 3 个正交方向上做大幅度的旋转和平移。

  2. 标定板位姿退化:如果标定板始终平行于相机成像平面,PnP 解算的深度分量不稳定。标定板要多角度倾斜。

  3. 机械臂运动学误差传递:机械臂自己的运动学精度如果差了 2mm,手眼标定不会好于 2mm。柔性关节机械臂(如使用谐波减速机的)需要考虑关节柔性误差,通常需要做局部区域标定而非全空间标定。

9.4 AVM 环视系统标定实战

车载环视(AVM,Around View Monitor)是量产车上相机标定最典型的应用。下面以典型的 4 路鱼眼相机 AVM 系统为例,拆解产线标定流程。

系统配置

  • 4 个鱼眼相机(前、后、左、右),分辨率 1280×720

  • 车身停在标定间中央,地面铺设棋盘格标定图案

  • 每个相机下方有 6×9 的棋盘格,每格 100-150mm

  • 标定间尺寸:约 6000mm × 6000mm

核心算法

1. 外参初值计算:对每个相机,利用检测到的棋盘格角点(世界坐标已知)和对应图像坐标,通过 DLT(直接线性变换)+ SVD 分解计算单应性矩阵 H。然后从 H 中分解出旋转矩阵和平移向量——H = [r1, r2, t],其中 r1、r2 是旋转矩阵的前两列,通过三角函数求解欧拉角(pitch/yaw/roll)。

2. 多相机联合 LM 优化:这是关键。不是每个相机单独优化,而是把所有相机的参数(每个相机 6 个外参:3 个欧拉角 + 3 个平移)放在一个优化问题中,同时最小化所有相机的重投影误差。这样能利用相邻相机重叠区域角点的一致性作为额外约束,避免各相机"各自为政"。

3. 分级优化策略:通常支持三种优化级别:

  • 只优化外参(6 参数/相机)——产线默认模式

  • 外参 + 光心位置(8 参数/相机)——镜头安装偏差较大时

  • 外参 + 光心 + FOV(10 参数/相机)——需要微调内参时

4. 鱼眼模型支持:AVM 系统通常同时支持针孔模型和 Ocam 鱼眼模型。Ocam 模型用多项式近似从入射角 θ 到像高 ρ 的映射,不需要传统的畸变参数,特别适合超过 180° 视场角的鱼眼镜头。

5. 产线验收标准:每个相机的重投影误差须低于阈值(通常为 1-2 像素级别),且所有相机都达标才算标定合格。不合格会触发重新采图流程。

和实验室标定的区别

为什么 AVM 标定不重标内参:鱼眼相机内参高度非线性,在产线上用有限的标定板精确标定内参不现实。相机厂商在出厂时已完成精密内参标定(高精度转台 + 平行光管),产线只需根据标定间的地面棋盘格优化外参。除非相机受到剧烈撞击或温度大幅变化,否则内参基本不变,只优化外参就够了。

环视标定的一些共识:张正友标定法仍是环视系统的基础标定手段;3D 碗状投影比 2D 平面投影效果好(边缘不变形、远景不失真);GPU 加速(OpenGL 渲染)是实现 30fps 实时拼接的关键;基于场景特征的在线修正方案可以降低对激光雷达的依赖。

本节要点:AVM 产线标定和实验室标定是两码事——产线要求 30 秒内完成、操作工执行、多相机联合优化,内参通常由厂家提供。手眼标定的核心是AX=XB 方程,机械臂运动学误差会直接传递到标定结果。

十、总结

相机标定是机器人和自动驾驶感知的基石,直接影响后面所有算法的精度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询