深度相机用久了标定参数漂移是个绕不开的问题。我手上这台D435i用了大半年最近做近场抓取的时候发现深度图和RGB对齐明显偏了边缘处尤其明显手指和背景的深度值混在一起抓取点算出来能差出好几毫米。一开始以为是算法问题排查了一圈才确认是出厂标定参数在温度变化和轻微磕碰之后已经不准了。翻了一圈资料发现Intel RealSense Viewer里其实内置了自校准On-Chip Calibration功能不用额外工具、不用棋盘格、不用MATLAB直接在Viewer里点几下就能跑。但网上关于这个功能的实操记录很少尤其是不同场景下到底该怎么选、跑完效果怎么样几乎没人讲清楚。我花了两个周末分别在白墙、纹理纸和普通办公环境三种场景下把D435i的自校准跑了一遍记录下完整的操作链路和实测数据这篇就把整个过程拆开讲透。1. 先搞清楚D435i自校准到底在标什么很多人一听到标定就想到张正友棋盘格法要打印标定板、拍几十张不同角度的照片、再用MATLAB或者OpenCV算内参外参。D435i的自校准完全是另一回事它标的是深度模块内部左右红外相机之间的相对关系也就是外参中的基线Baseline和深度缩放Depth Scale不涉及RGB相机的内参也不涉及RGB和深度之间的外参。1.1 自校准和传统标定的本质区别传统棋盘格标定解决的是相机内参准不准的问题比如焦距、主点偏移、畸变系数。而D435i的自校准解决的是深度算得准不准的问题。深度值的计算依赖左右两个红外相机之间的视差视差等于基线乘以焦距再除以深度。如果基线因为温度变化或者轻微形变发生了偏移视差就会算错深度值整体就会有一个系统性偏差。自校准的原理是让深度模块对着一个平面或者近似平面的场景采集一帧深度图然后通过优化算法反推出当前实际的基线偏移量和深度缩放系数把新的参数写回设备。整个过程不需要外部标定物只需要一个足够平的场景。注意自校准只修正深度模块不会修正RGB相机的内参。如果你的RGB图像本身有畸变问题自校准帮不了你那得用传统的棋盘格方法。1.2 什么情况下需要跑自校准不是所有深度不准的情况都适合跑自校准。我总结了几种典型场景深度图整体偏浅或偏深比如实际1米的东西测出来0.95米或者1.05米这种系统性偏差自校准能修。深度图边缘和中心不一致中心准、边缘偏这种可能是畸变问题自校准效果有限。温度变化后精度下降D435i对温度比较敏感刚开机和跑热了之后深度值会有差异自校准可以在工作温度下重新校准。轻微磕碰后深度异常如果相机摔过基线可能发生物理偏移自校准能救回来一部分但如果是严重形变就没戏了。如果深度图出现大面积空洞、随机噪点、或者完全无深度值那多半是硬件或者驱动问题自校准解决不了。1.3 自校准的精度边界在哪里官方文档里提到自校准的典型精度提升在0.1%到0.5%的深度误差改善听起来不多但对于1米距离来说就是1到5毫米的改善做近场抓取或者精密测量的时候这个量级很关键。但要注意自校准的精度高度依赖场景质量如果场景本身不平、纹理太弱或者太强、光照不均匀校准结果可能反而变差。我实测下来在理想场景下大面积平整纹理纸自校准后1米处的深度误差从原来的8毫米降到了2毫米左右。在白墙场景下误差从8毫米降到了4毫米左右。在普通办公环境下误差基本没改善因为场景太杂乱算法找不到足够的平面约束。2. 跑自校准之前必须做好的环境准备自校准对场景的要求比想象中高。我第一次跑的时候随便对着办公桌就点了开始结果跑完深度图反而更差了。后来仔细读了官方说明才明白自校准需要一个大面积、平整、有适度纹理的平面而且相机要正对这个平面距离和角度都有讲究。2.1 硬件连接和固件版本检查先把D435i用USB 3.0线缆直连电脑不要经过Hub不要用延长线。USB 2.0虽然也能跑但带宽不够自校准过程中可能丢帧影响结果。我试过用USB 2.0跑跑到一半提示帧同步失败换回3.0就正常了。固件版本很关键。自校准功能在较新的固件里才完善老固件可能有bug。打开RealSense Viewer在设备信息里看Firmware Version。我手上这台出厂固件是5.12.7.100自校准跑完经常报错升级到5.13.0.50之后稳定了很多。升级固件用Intel RealSense Viewer自带的工具就行在More菜单里找Update Firmware选对应的bin文件等几分钟就好。提示升级固件过程中不要拔线、不要断电否则设备可能变砖。升级前先把相机从其他程序里释放出来关掉所有可能占用相机的软件。2.2 场景布置的核心原则场景布置是自校准成败的关键。核心原则就一条让深度模块看到的画面尽可能接近一个理想平面。具体来说平面要足够大至少覆盖相机视野的80%以上。D435i在1米距离下的视野大约是90厘米乘50厘米所以平面至少要有1米乘0.6米。平面要平整不能有褶皱、弯曲、凸起。我用的是A1尺寸的纹理纸贴在KT板上效果不错。纹理要适中完全无纹理的白墙不行完全光滑的反光面也不行。纹理纸的颗粒感刚好白墙需要额外处理。光照要均匀避免一侧亮一侧暗避免阳光直射避免频闪光源。室内均匀的顶灯就行。相机要正对平面俯仰角和偏航角尽量接近零距离控制在0.5米到1米之间。2.3 三种场景的搭建方法我实测了三种场景搭建方法各不相同白墙场景找一面干净的白墙相机距离墙面0.8米左右正对墙面。白墙的问题是纹理太弱红外相机看不到足够的特征点。我的做法是在白墙上贴几张A4纸纸上用铅笔轻轻画一些不规则的线条增加纹理但不影响平整度。或者直接用投影仪在白墙上投一个随机噪点图案效果更好。纹理纸场景买一卷带颗粒纹理的纸类似素描纸或者砂纸那种质感裁成A1大小用双面胶平整地贴在KT板上。KT板要够硬不能弯。相机距离0.6米左右正对纹理纸。这个场景是三种里效果最好的因为纹理均匀、平面度好、光照容易控制。任意环境场景就是普通办公环境对着桌面或者地面跑。这个场景最方便但效果最不稳定。如果桌面够大够平、有适度纹理也能跑出不错的结果。我试过对着木质桌面跑效果介于白墙和纹理纸之间。场景类型平面尺寸要求纹理要求推荐距离实测效果白墙1m x 0.6m以上需额外增加纹理0.8m中等纹理纸1m x 0.6m以上天然颗粒纹理0.6m最佳任意环境尽量大且平自然纹理0.5-1m不稳定3. 在RealSense Viewer里跑自校准的完整操作链路环境准备好之后打开RealSense Viewer插上相机等设备识别。Viewer界面左侧是设备树右侧是各个流的预览窗口。自校准的入口藏得有点深第一次找的时候我翻了半天。3.1 找到On-Chip Calibration入口在Viewer里先展开左侧的Stereo Module然后找到On-Chip Calibration这一项。如果没看到检查一下固件版本老固件可能没有这个选项。点进去之后会弹出一个校准面板面板里有几个关键参数Health Check先跑一次健康检查看看当前标定状态。健康检查会给出一个分数分数越低越好一般低于0.25算正常高于0.5说明需要校准。Calibration Mode有Standard和Precision两档。Standard快大概几秒钟Precision慢要十几秒但精度更高。我一般用Precision。Target Distance填相机到平面的实际距离单位是毫米。这个值要填准填错了校准结果会偏。Speed校准速度有几档可选。速度越慢采集的帧越多结果越稳。我一般用默认的中速。3.2 健康检查先跑一遍在正式校准之前强烈建议先跑一次Health Check。这个检查不修改任何参数只是评估当前标定状态。操作很简单点Health Check按钮等几秒钟面板上会显示一个分数和一段文字描述。我实测的数据新相机开箱健康分数0.18用了半年后变成0.42跑完自校准后降到0.21。这个分数可以作为是否需要校准的判断依据。如果分数低于0.25其实没必要校准校准反而可能引入新的误差。注意健康检查也需要对着平整场景跑场景不好分数会虚高。我第一次在白墙前跑健康检查分数0.55换了纹理纸再跑变成0.42说明场景对分数影响很大。3.3 正式校准的操作步骤确认需要校准后按以下步骤操作把相机固定好正对平面距离填进Target Distance。选择Calibration Mode为Precision。点击Calibrate按钮然后立刻停止所有其他操作不要动相机不要动平面不要遮挡视野。等待进度条走完大概10到15秒。校准完成后面板会显示新的健康分数和校准结果。如果分数比之前低说明校准成功如果分数反而高了说明场景有问题需要重新布置。校准过程中相机会采集多帧深度图然后跑优化算法。如果中途有物体进入视野、光照突变、或者相机被碰到校准会失败或者结果不准。我试过在校准过程中手不小心晃了一下结果分数从0.42变成了0.61只能重来。3.4 校准后的验证方法校准完不能直接信得验证一下。我的验证方法是拿一个已知尺寸的物体比如一个30厘米的纸盒放在相机前方1米处用Viewer的测量工具量一下深度值看和实际距离差多少。或者更简单看深度图的平整度对着平面时深度值应该基本一致不应该有明显的起伏。Viewer里有个Depth流的预览窗口把鼠标移到上面会显示该点的深度值。我一般取中心点和四个角共五个点看它们的深度值差异。校准前五个点的差异可能有十几毫米校准后应该降到几毫米以内。4. 三种场景的实测数据与效果对比这部分是我花时间最多的地方。每种场景我都跑了至少三遍取平均值记录校准前后的健康分数和深度误差。4.1 白墙场景能跑但需要加料纯白墙直接跑健康分数基本在0.5以上校准后也降不下来。原因是红外相机在白墙上找不到足够的特征点算法无法准确估计平面。我的改进方法是在白墙上贴了几张画了铅笔线的A4纸分数降到了0.38校准后降到0.26。深度误差方面校准前1米处误差约8毫米校准后约4毫米。改善有但不如纹理纸场景。白墙场景的优点是容易找到缺点是纹理不足需要额外处理。4.2 纹理纸场景效果最稳纹理纸场景是三种里最理想的。健康分数校准前0.42校准后0.19。深度误差从8毫米降到2毫米左右。而且重复性好我连跑三遍结果都在0.19到0.22之间波动很小。纹理纸的关键是纸的颗粒要均匀不能有大的图案或者文字否则算法可能把图案当成平面上的凸起。我用的是纯色带颗粒的素描纸效果很好。贴的时候要尽量平整不能有气泡否则局部不平会影响校准。4.3 任意环境场景方便但看运气普通办公环境对着木质桌面跑。健康分数校准前0.48校准后0.35。深度误差从8毫米降到6毫米左右改善有限。原因是桌面虽然有纹理但不够平整而且视野边缘可能拍到桌面以外的东西干扰算法。如果非要在任意环境下跑我的建议是尽量找一个大面积的平整表面清空表面上的杂物相机正对表面距离控制在0.6到0.8米。这样能提高成功率但效果还是不如专门布置的场景。场景校准前健康分数校准后健康分数校准前1m误差校准后1m误差白墙铅笔线0.380.268mm4mm纹理纸0.420.198mm2mm任意环境0.480.358mm6mm5. 校准过程中容易踩的坑和排查思路自校准看着简单但实际操作中坑不少。我前后跑了十几次失败了好几次总结了一些常见问题和排查方法。5.1 校准失败报错的几种典型情况报错Frame sync failed多半是USB带宽不够或者线缆质量差。换USB 3.0口换原装线关掉其他占用相机的程序。报错Not enough valid frames场景纹理太弱或者太平算法采集不到足够的有效帧。换纹理纸场景或者增加场景纹理。报错Calibration diverged优化算法发散了通常是场景不平或者相机没正对平面。检查平面平整度调整相机角度。校准后分数反而升高场景有问题或者校准过程中有干扰。重新布置场景确保校准过程中环境稳定。5.2 校准后深度图反而更差的处理这种情况我遇到过两次。一次是因为场景太差算法算出了一个错误的修正量另一次是因为校准过程中有人走过遮挡了视野。处理方法是先恢复出厂标定在Viewer里有Reset to Factory Calibration选项然后重新布置场景再跑一次。恢复出厂标定这个操作要慎用因为它会把所有标定参数清掉包括出厂时做的精细标定。如果自校准一直跑不好恢复出厂至少能回到一个可用的状态。5.3 温度对校准结果的影响D435i对温度很敏感。我实测发现冷机状态下跑的自校准等相机跑热了之后深度值又会偏。所以我的做法是先让相机通电跑10到15分钟等温度稳定了再跑自校准。这样校准结果在工作温度下更准。如果你做的是长时间运行的应用比如机器人或者监控建议在设备达到工作温度后再跑一次自校准把工作温度下的偏差也修掉。6. 自校准之外还能做的深度优化自校准只是深度优化的一个环节不是万能的。如果你的应用对深度精度要求很高还可以配合其他手段。6.1 深度滤波和后期处理RealSense SDK里提供了多种深度滤波算法比如Decimation Filter降采样、Spatial Filter空间滤波、Temporal Filter时域滤波、Hole Filling Filter空洞填充。这些滤波可以在自校准的基础上进一步提升深度图质量。我一般会开Spatial Filter和Temporal Filter前者平滑空间噪点后者利用多帧信息减少随机噪声。但要注意滤波会引入延迟实时性要求高的场景要权衡。6.2 定期校准的习惯养成自校准不是一劳永逸的。温度变化、磕碰、长时间使用都会让标定参数漂移。我的习惯是每两周跑一次健康检查分数超过0.35就安排一次自校准。如果是关键项目每次正式使用前都跑一次健康检查确保状态正常。6.3 什么情况下该考虑换设备如果自校准后健康分数还是降不下来深度误差还是很大那可能是硬件老化了。红外相机的传感器、镜头、基线结构都会随时间老化。我手上这台用了两年多自校准后分数只能到0.28左右已经不如新机了。这种情况下如果应用对精度要求极高可能得考虑换新设备。最后分享一个我自己的小习惯每次跑完自校准我都会把校准前后的健康分数、深度误差、场景照片记录在一个表格里。时间长了就能看出设备的漂移趋势也能判断什么时候该校准、什么时候该换设备。这个习惯帮我省了不少排查时间推荐你也试试。