openpnp - Camera model failed to converge. Try increasing the number of Radial Lines Per Cal Z.

概述

设备收拾完了. 在做最后一次标定.
在底部相机高级矫正时, 弹框报错如下:

Camera model failed to converge. Try increasing the number of Radial Lines Per Cal Z.

因为设备在调试中, 设备标定自己也做了很多次. 头一次遇到这个错误.
比较硬件的变化, 和相机有关的部分.
我这次将顶部相机和底部相机, 都换成了1600W像素的USB相机. 只要曝光小于-6, 测速时, 都可以达到30FPS.
正好报错也是和相机有关.
虽然现在已经在用自己修正源码后编译的输出, 但是也不想就直接去看源码, 没心情.
根据提示, 尝试在底部相机设置中, 增加Z轴径向线的数量, 默认是32, 改成64, 再次进行底部相机高级矫正, 成功了.

修改底部相机默认的径向线数量

在这里插入图片描述
此图是底部相机高级矫正完成时的截图.
在未作底部相机高级矫正或者底部相机高级矫正失败时, 第1步的勾没勾, 也就改不了Z轴默认的径向线数量.

操作:

  • 先勾选第1步的勾, 这时, 就可以编辑Z轴径向线了.
  • 将径向线数量由32改为64
  • 去掉第1步的勾
  • 在向导中运行底部相机高级矫正, 此时应用的底部相机Z轴的径向线已经为64.
  • 等待底部相机高级矫正成功完成.

报错猜测

可能采用像素更高的底部相机硬件, 需要的Z轴径向线就要越多.
以前用官方推荐的100W像素USB相机时, 用默认的32条Z轴径向线, 从没见过这个报错.

看看代码, 报错提示在哪里?

    public static double computeBestCameraParameters(double[][][] testPattern3dPoints,
            double[][][] testPatternImagePoints, double[][][] modeledImagePoints,
            List<Integer> outlierPointList, double[] parameters, int flags) throws Exception {
        numberOfTestPatterns = testPattern3dPoints.length;
        // ...
                    try {
                optimum = optimizer.optimize(lsp);
            }
            catch (TooManyEvaluationsException e) {
                throw(new Exception("Camera model failed to converge. Try increasing the number of "
                        + "Radial Lines Per Cal Z.")); // error at here
            }

去看看 optimizer.optimize

public Optimum optimize(final LeastSquaresProblem problem) {
// ...
                // tests for termination and stringent tolerances
                if (FastMath.abs(actRed) <= TWO_EPS &&
                    preRed <= TWO_EPS &&
                    ratio <= 2.0) {
                    throw new ConvergenceException(LocalizedFormats.TOO_SMALL_COST_RELATIVE_TOLERANCE,
                                                   costRelativeTolerance);
                } else if (delta <= TWO_EPS * xNorm) {
                    throw new ConvergenceException(LocalizedFormats.TOO_SMALL_PARAMETERS_RELATIVE_TOLERANCE,
                                                   parRelativeTolerance);
                } else if (maxCosine <= TWO_EPS) {
                    throw new ConvergenceException(LocalizedFormats.TOO_SMALL_ORTHOGONALITY_TOLERANCE,
                                                   orthoTolerance);
                }

从上面实现可以看出, 相机像素大了之后, 如果还采用默认分割的份数, 图像的精度判断, 就不满足条件了.
没单步调试或者日志打印调试. 能大概看出, 图像越大, 要分割的份数要越多, 否则用于判断的精度就不满条件.

备注

底部相机高级矫正用的时间是真长.
不过底部相机高级矫正, 是修正底部相机机械安装的垂直度用的, 能给出补偿. 谁又能保证相机安装的绝对垂直呢?
设备在生产前, 或者底部相机变动后(更换了底部相机, 拆卸了底部相机, 导致底部相机中心点变了, 镜头高度变了), 就必须重新进行一次底部相机高级矫正.

备注

出现这个报错,主要原因是相机的视野不够。
根本处理方法是,去调整相机和目标(吸嘴(板子高度),或者主基准点)中间的距离。
最好还是用默认的32线的设置。

END

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐