本文是机器视觉2D引导定位的第五篇。本文讲述的核心内容是,综合之前的理论知识,练习使用VisionMaster进行单点抓放偏移计算,并用VisionPro自定义工具实现同样的功能。

标定

根据之前讲述的方法,执行12点标定(9点平移+3点旋转),并收集相应照片和对应的物理坐标:

VPro和VMaster交叉验证-采样图片截图.PNG

Hik VisionMaster 得到的标定文件为:

<?xml version="1.0" encoding="UTF-8"?>
<CalibInfo>
    <CalibInputParam>
        <CalibParam ParamName="CreateCalibTime" DataType="string">
            <ParamValue>2023-10-14 17:21:38</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibType" DataType="string">
            <ParamValue>NPointCalib</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CameraMode" DataType="int">
            <ParamValue>CameraStatic</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransNum" DataType="int">
            <ParamValue>9</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotNum" DataType="int">
            <ParamValue>3</ParamValue>
        </CalibParam>
        <CalibParam ParamName="CalibErrStatus" DataType="int">
            <ParamValue>0</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransError" DataType="float">
            <ParamValue>0.39129567</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotError" DataType="float">
            <ParamValue>0.16232356</ParamValue>
        </CalibParam>
        <CalibParam ParamName="TransWorldError" DataType="float">
            <ParamValue>0.041157886</ParamValue>
        </CalibParam>
        <CalibParam ParamName="RotWorldError" DataType="float">
            <ParamValue>0.017073777</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionX" DataType="float">
            <ParamValue>0.10520318</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecisionY" DataType="float">
            <ParamValue>0.10516406</ParamValue>
        </CalibParam>
        <CalibParam ParamName="PixelPrecision" DataType="float">
            <ParamValue>0.1051836</ParamValue>
        </CalibParam>
        <CalibPointFListParam ParamName="ImagePointLst" DataType="CalibPointList">
            <PointF>
                <X>2853.4529</X>
                <Y>1789.2111</Y>
                <R>-62.977718</R>
            </PointF>
            <PointF>
                <X>2378.116</X>
                <Y>1789.76</Y>
                <R>-62.988041</R>
            </PointF>
            <PointF>
                <X>2377.769</X>
                <Y>1314.527</Y>
                <R>-63.038883</R>
            </PointF>
            <PointF>
                <X>2853.155</X>
                <Y>1314.152</Y>
                <R>-62.960419</R>
            </PointF>
            <PointF>
                <X>3328.948</X>
                <Y>1314.569</Y>
                <R>-62.866886</R>
            </PointF>
            <PointF>
                <X>3329.251</X>
                <Y>1790.2</Y>
                <R>-62.844543</R>
            </PointF>
            <PointF>
                <X>3328.3669</X>
                <Y>2265.4641</Y>
                <R>-62.833302</R>
            </PointF>
            <PointF>
                <X>2852.7241</X>
                <Y>2265.137</Y>
                <R>-62.88105</R>
            </PointF>
            <PointF>
                <X>2378.125</X>
                <Y>2264.73</Y>
                <R>-62.940441</R>
            </PointF>
            <PointF>
                <X>3022.7019</X>
                <Y>1480.066</Y>
                <R>-72.890045</R>
            </PointF>
            <PointF>
                <X>2853.3931</X>
                <Y>1789.679</Y>
                <R>-62.955139</R>
            </PointF>
            <PointF>
                <X>2632.2439</X>
                <Y>2065.634</Y>
                <R>-52.959534</R>
            </PointF>
        </CalibPointFListParam>
        <CalibPointFListParam ParamName="WorldPointLst" DataType="CalibPointList">
            <PointF>
                <X>-318.22</X>
                <Y>-542.19</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-268.22</X>
                <Y>-542.19</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-268.22</X>
                <Y>-592.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-318.22</X>
                <Y>-592.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-368.22</X>
                <Y>-592.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-368.22</X>
                <Y>-542.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-368.22</X>
                <Y>-492.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-318.22</X>
                <Y>-492.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-268.22</X>
                <Y>-492.20001</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-318.22</X>
                <Y>-542.19</Y>
                <R>166.19</R>
            </PointF>
            <PointF>
                <X>-318.22</X>
                <Y>-542.19</Y>
                <R>156.19</R>
            </PointF>
            <PointF>
                <X>-318.22</X>
                <Y>-542.19</Y>
                <R>146.19</R>
            </PointF>
        </CalibPointFListParam>
    </CalibInputParam>
    <CalibOutputParam>
        <CalibParam ParamName="RotDirectionState" DataType="int">
            <ParamValue>-1</ParamValue>
        </CalibParam>
        <CalibParam ParamName="IsRightCoorA" DataType="int">
            <ParamValue>-1</ParamValue>
        </CalibParam>
        <PointF ParamName="RotCenterImagePoint" DataType="CalibPointF">
            <RotCenterImagePointX>1168.2183</RotCenterImagePointX>
            <RotCenterImagePointY>665.98157</RotCenterImagePointY>
            <RotCenterImageR>-999</RotCenterImageR>
        </PointF>
        <PointF ParamName="RotCenterWorldPoint" DataType="CalibPointF">
            <RotCenterWorldPointX>-122.94308</RotCenterWorldPointX>
            <RotCenterWorldPointY>69.991859</RotCenterWorldPointY>
            <RotCenterWorldR>-999</RotCenterWorldR>
        </PointF>
        <CalibFloatListParam ParamName="CalibMatrix" DataType="FloatList">
            <ParamValue>-0.10520317</ParamValue>
            <ParamValue>-6.4284381e-005</ParamValue>
            <ParamValue>122.94308</ParamValue>
            <ParamValue>-3.8910599e-005</ParamValue>
            <ParamValue>0.10516404</ParamValue>
            <ParamValue>-69.991859</ParamValue>
            <ParamValue>0</ParamValue>
            <ParamValue>0</ParamValue>
            <ParamValue>1</ParamValue>
        </CalibFloatListParam>
    </CalibOutputParam>
</CalibInfo>

生产过程

在生产阶段,我们将针对如下来料图片,计算机器人的单点抓放相对偏移。

VPro和VMaster交叉验证-生产截图.PNG

我们会分别使用海康的Vision Master和Cognex的VisionPro进行计算。

  • 由于海康的VisionMaster已经内置了单点抓放功能,我们直接使用现成的工具模块
  • Cognex的VisionPro并没有提供单点抓放功能,但是由于Cognex允许我们直接编写C#代码,我们可以按照前几篇文章中推导的理论,自己编程实现。(此处,我编写了自己的VisionPro单点抓放工具)

我针对10组来料图像,分别使用VisionMaster自带的单点抓放功能和我自定义的VisionPro单点抓放工具,进行了交叉验证。比对显示,二者结果几乎一致(参见如下截图)。

第一组

VisionMaster结果:
VMaster-0.PNG

VisionPro结果:
VPro-0.PNG

第二组

VisionMaster结果:
VMaster-1.PNG

VisionPro结果:
VPro-1.PNG

第三组

VisionMaster结果:
VMaster-2.PNG

VisionPro结果:
VPro-2.PNG

第四组

VisionMaster结果:
VMaster-3.PNG

VisionPro结果:
VPro-3.PNG

第五组

VisionMaster结果:
VMaster-4.PNG

VisionPro结果:
VPro-4.PNG

第六组

VisionMaster结果:
VMaster-5.PNG

VisionPro结果:
VPro-5.PNG

第七组

VisionMaster结果:
VMaster-6.PNG

VisionPro结果:
VPro-6.PNG

第八组

VisionMaster结果:
VMaster-7.PNG

VisionPro结果:
VPro-7.PNG

第九组

VisionMaster结果:
VMaster-8.PNG

VisionPro结果:
VPro-8.PNG

第十组

VisionMaster结果:
VMaster-9.PNG

VisionPro结果:
VPro-9.PNG

标签: 视觉, 引导定位, VisionMaster, VisionPro

添加新评论