Skip to content

铜卷位置检测及尺寸测量

项目简介

项目背景

利用云台传感器拍摄图像,对需要进行包装入箱的铜箔卷,检测其在铁托盘上的前后左右及高度位置,为机械臂的抓取提供引导,同时读取产品上的二维码信息以匹配装铜箔的木箱规格; 其次检测木箱规格以及在小车上的左右位置,以核对木箱规格,同时为机械臂抓取铜箔入箱提供位置引导信息。

本地图片

相机选型

SICK云台线扫

检测要求

X向精度 ≤ 0.025mm
Y向精度 ≤ 0.03mm
测量周期 ≤ 2s

解决方案

AI-Vision软件针对3D点云进行处理,首先通过Blob工具进行铜卷定位,输出铜卷的位置等信息,再通过圆柱工具拟合出圆柱,从而进行体积的计算 。

设计思路

本地图片

执行效果展示

  • 工程结果展示:

    本地图片

  • HMI结果展示:

    本地图片

项目流程

一、初始化

[00] 选择Lua脚本语言工具,全局变量初始化,创建待接收数据的csv文件。

lua
--初始化全局变量
SetVariable('CurrentTime',0)


write = ''

--对文件进行判断,如果当前文件不存在,则生成文件
if FileSize("./H.csv") <=0 then  
    write = write .. 'Time,'  
    for i = 1,15,1 do     
        write = write .. 'h' .. i .. ","
    end
    write = write .. '\n'
    --"\n"表示换行
end
-- 每行第一列写入当前时间
write = write .. os.date("%Y_%m_%d %H:%M;%S") .. ","  
-- 将刚才的内容写入csv文件中
fprint("./H.csv",write)     
  
--生成用于拼接的字符串 
write = ''
if FileSize("./Position.csv") <=0 then  
    write = write .. 'Time,'  
    for i = 1,15,1 do     
        write = write .. 'x' .. i .. ","
        write = write .. 'y' .. i .. ","
        write = write .. 'z' .. i .. ","
        write = write .. ','
    end
    write = write .. '\n'
end
-- 每行第一列写入当前时间
write = write .. os.date("%Y_%m_%d %H:%M;%S") .. ","    
-- 将刚才的内容写入csv文件中
fprint("./Position.csv",write)

[01] 选择加载点云工具,获取点云。

二、预处理

[02] 选择3D变换工具,将图像绕x轴反方向旋转90度。

[03] 选择3D剪裁工具,将圆柱切割开并输出到IM1中。

本地图片

[04] 选择3D下采样工具,减少点的个数,方便后续操作。

[05] 选择3D离群点滤波工具,过滤掉杂点。

本地图片

三、圆柱高度与位置测量

[06] 选择3D斑点工具,分割出15个圆柱并将圆柱的位置发送到寄存器中。

本地图片

[07] 选择lua语言脚本,保存圆柱位置至文件中。

lua
-- 生成永远拼接的字符串
write = ""

-- 将位置信息循环拼接入字符串中
for i =1,15,1 do
    x="x"..i  y="y"..i  z="z"..i
    x,y,z = GetPoint(i-1)
    write = write .. string.format("%.3f,",x) .. string.format("%.3f,",y) .. string.format("%.3f,",z) .. ","
end

write = write .. "\n"

-- 将字符串写入表中
fprint("./Position.csv",write)

[08-22] 选择3D圆柱工具,将铜卷拟合成圆柱,通过圆柱的两顶点坐标得到尺寸信息。

本地图片

[23] 选择lua语言脚本,计算铜卷尺寸并保存至文件中。

lua
--生成用于拼接的字符串
write = ""

--循环将测量数据拼接入字符串中
for i = 1,15,1 do
  cx1,cy1,cz1,cx2,cy2,cz2,r = GetCylinder(i-1)
  write = write .. string.format("%.3f,",math.abs(cx2-cx1))
  SetVariable("h" .. i ,tointeger(1000*math.abs(cx2-cx1))/1000)
end

write = write .. "\n"
-- 将数据写入表中
fprint("./H.csv",write)

AI-Vision,让3D测量更简单