Skip to content

焊锡球体积高度测量

工程背景

测量背景

鉴于焊锡球在芯片封装中的关键作用,其高度、圆度等参数直接影响产品质量。为确保稳定性和可靠性,需高精度测量技术应对反光、精度等挑战,实现全检要求,提升产品质量与生产效率。

本地图片

相机选型

盛相科技 SS081017

测量项

1.焊锡球高度

2.焊锡球体积

检测要求

测量精度 ≤ 0.02mm

测量重复性 ≤ 0.015mm

测量周期 ≤ 600ms

解决方案

AI-Vision使用裁切工具,将焊锡球裁切出来,然后使用Blob工具,找到每个焊锡球的位置,使用高度工具与体积工具一键测量。

设计思路

本地图片

执行效果展示

  • 工程结果展示

    • 体积测量结果

    本地图片

    • 高度测量结果

    本地图片

项目流程

一、初始化

[00] 使用Lua脚本工具,初始化全局变量,同时生成保存数据的csv文件。

lua

-- 生成保存数据与计数的全局变量用于后期调用
SetVariable("Pin1_78_x",{})
SetVariable("Pin1_78_y",{})
SetVariable("Pin1_78_z",{})

SetVariable("Count_Volumn",1)
SetVariable("Count_Height",1)
SetVariable("Volumn_All","")
SetVariable("Height_All","")

-- 生成保存数据的文件
-- 生成用于拼接的字符串
write = ""

-- 判断文件是否存在,如果不存在则生成该文件
if FileSize("./Height.csv") <= 0 then
  write = write .. "Time,"
  for i =1,78,1 do
      write = write .. "Height" .. i .. ","
  end
  -- "\n"表示换行
  write = write .. "\n"
end

-- 拼接时间入字符串中
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
-- 将字符串写入文件中
fprint("./Height.csv", write)


-- 与上一文件生成相同(行13)
write = ""

if FileSize("./Volumn.csv") <= 0 then
  write = write .. "Time,"
  for i =1,78,1 do
      write = write .. "Volumn" .. i .. ","
  end
  write = write .. "\n"
end

write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
fprint("./Volumn.csv", write)

[01] 使用加载点云工具,加载需要处理的点云图。

本地图片

二、初定位

[02] 使用3D裁切工具,将IM1中的点云复制到IM1中,方便后续处理。

[03-04] 使用3D方形探针工具,输出工件的两条边。

本地图片

[05] 使用3D几何交点工具,输出两直线交点。

[06] 使用3D位置调整工具,根据输出的直线交点调整点云位置。

三、拟合平面

[07-08] 使用3D区域工具,选择拟合平面的区域。

本地图片

[09] 使用3D平面工具,根据上个工具选择的区域,拟合平面并将其设置为零平面。

本地图片

四、裁切待测区域

[10-11] 使用3D裁切工具,裁切出待测焊点。

本地图片

[12] 使用3D斑点工具,输出每个焊点的位置信息。

本地图片

[12] 使用Lua脚本工具,保存焊点的位置信息。

lua

-- 获取全局变量的值
Pin1_78_x = GetVariable("Pin1_78_x")
Pin1_78_y = GetVariable("Pin1_78_y")
Pin1_78_z = GetVariable("Pin1_78_z")

-- 使用循环将找到的38个焊锡球的信息保存到数组中
for i =38,0,-1 do
    Pinx,Piny,Pinz = GetPoint(i)
    table.insert(Pin1_78_x,Pinx)
    table.insert(Pin1_78_y,Piny)
    table.insert(Pin1_78_z,Pinz)
end

-- 更新全局变量
SetVariable("Pin1_78_x",Pin1_78_x)
SetVariable("Pin1_78_y",Pin1_78_y)
SetVariable("Pin1_78_z",Pin1_78_z)

[14-15] 使用3D斑点工具Lua脚本工具,输出保存第二部分焊点位置信息。

五、体积测量

[16] 使用标记工具,用于循环跳转。

[17] 使用Lua脚本工具,获取待测区域信息。

lua

-- 获取全局变量信息
count = GetVariable("Count_Volumn")
pinx = GetVariable("Pin1_78_x")
piny = GetVariable("Pin1_78_y")
pinz = GetVariable("Pin1_78_z")

-- 计算待测区域信息
sx = pinx[count] -0.3
sy = piny[count] -0.3
sz = pinz[count] -0.5

ex = pinx[count] +0.3
ey = piny[count] +0.3
ez = pinz[count] +0.5

-- 将待测区域信息推送至寄存器中
PushBox(sx,sy,sz,ex,ey,ez)

-- 将待测区域显示在IM2上
DrawBox(2,sx,sy,sz,ex,ey,ez)

[18] 使用3D体积工具,计算选中焊点体积。

本地图片

[19] 使用Lua脚本工具,进行循环判断。

lua

-- 获取体积测量结果
Volumn = GetMeasure(1)
-- 获取当前循环数
count = GetVariable("Count_Volumn")
-- 获取已测量体积结果
Volumn_All = GetVariable("Volumn_All")
-- 将当前体积测量结果拼接入字符串中
Volumn_All = Volumn_All .. string.format("%.3f,",Volumn)

-- 更新全局变量
SetVariable("Volumn_All",Volumn_All)
SetVariable("Count_Volumn",count+1)

-- 判断是否结束循环
if count+1<79 then
    Jump("Start1")
else
    Jump("End1")
end

[20] 使用标记工具,用于结束跳转。

[21] 使用Lua脚本工具,用于保存数据。

lua

-- 获取已测量的体积结果
Volumn = GetVariable("Volumn_All")
-- "\n"表示换行
Volumn = Volumn .. "\n"

-- 将字符串写入文件中
fprint("./Volumn.csv",Volumn)

六、高度测量

[22] 使用3D裁切工具,将IM1中的点云复制到IM3中,方便后续处理。

[23] 使用标记工具,用于循环跳转。

[24] 使用Lua脚本工具,获取待测区域信息。

lua

-- 获取全局变量信息
count = GetVariable("Count_Height")

pinx = GetVariable("Pin1_78_x")
piny = GetVariable("Pin1_78_y")
pinz = GetVariable("Pin1_78_z")

-- 计算待测区域
sx = pinx[count] -0.3
sy = piny[count] -0.3
sz = pinz[count] -0.5

ex = pinx[count] +0.3
ey = piny[count] +0.3
ez = pinz[count] +0.5

-- 将待测区域推送至寄存器中
PushBox(sx,sy,sz,ex,ey,ez)

-- 将待测区域显示在IM3上
DrawBox(3,sx,sy,sz,ex,ey,ez)

[25] 使用3D高度工具,计算选中焊点高度。

本地图片

[26] 使用Lua脚本工具,进行循环判断。

lua

-- 获取当前高度结果
Height= GetMeasure(0)
-- 获取当前循环数
count = GetVariable("Count_Height")
-- 获取已测量的高度数据
Height_All = GetVariable("Height_All")
-- 将当前高度数据拼接入字符串中
Height_All =Height_All .. string.format("%.3f,",Height)

-- 更新全局变量
SetVariable("Height_All",Height_All)
SetVariable("Count_Height",count+1)

-- 判断是否结束循环
if count+1<79 then
    Jump("Start2")
else
    Jump("End2")
end

[27] 使用标记工具,用于结束跳转。

[28] 使用Lua脚本工具,用于保存数据。

lua

-- 获取已测量的高度结果
Height = GetVariable("Height_All")
-- "\n"表示换行
Height = Height .. "\n"

-- 将字符串写入文件中
fprint("./Height.csv",Height)

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