Skip to content

Pin针高度测量

工程背景

测量背景

鉴于PIN针在PCB板中的关键作用及其对精度的严格要求,传统检测方法存在精度不足、效率低等问题。随着智能制造和3D视觉技术的发展,自动化检测成为趋势,旨在提高检测精度与效率,确保产品质量,满足大规模生产需求。

本地图片

相机选型

盛相科技 S162170

测量项

Pin针高度

检测要求

测量精度 ≤ 0.03mm

测量重复性 ≤ 0.05mm

测量周期 ≤ 2000ms

解决方案

AI-Vision采用区域划分的方法,将三块测量区域分割出来,通过Blob找到每块区域的Pin针,使用多高度测量集成工具一键输出高度。

设计思路

本地图片

执行效果展示

  • 工程结果展示

    • 区域1测量结果

    本地图片

    • 区域2测量结果

    本地图片

    • 区域3测量结果

    本地图片

项目流程

一、初始化

  1. 使用Lua脚本工具,生成保存数据的csv文件。
  • 设置int类型全局变量用于循环计数,设置string类型全局变量用于拼接高度字符串,设置数组类型全局变量用于高度显示

  • 拼接表头字符串,保存到csv文件

经验

.. 用于string类型字符串拼接

part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 输出: Hello, world!

,作为分隔符,分割每个数据项

lua
-- count用于区域pin针高度检测循环计数
SetIntVariable("count1", 1)
SetIntVariable("count2", 1)
SetIntVariable("count3", 1)
-- 参数用于拼接高度字符串存入csv
SetStringVariable("Height1","")
SetStringVariable("Height2","")
SetStringVariable("Height3","")
-- 创建数组用于最后显示高度
SetFloatArrayVariable("HeightArray1",{})
SetFloatArrayVariable("HeightArray2",{})
SetFloatArrayVariable("HeightArray3",{})
SetFloatArrayVariable("posX1",{})
SetFloatArrayVariable("posY1",{})
SetFloatArrayVariable("posZ1",{})
SetFloatArrayVariable("posX2",{})
SetFloatArrayVariable("posY2",{})
SetFloatArrayVariable("posZ2",{})
SetFloatArrayVariable("posX3",{})
SetFloatArrayVariable("posY3",{})
SetFloatArrayVariable("posZ3",{})

-- 生成保存检测数据的csv文件
-- 生成用于拼接的字符串
write = ""
-- 判断是否存在该文件,若不存在,生成该文件
if FileExists("./Height1.csv") == false then
  write = write .. "Time,"
  for i= 1,22,1 do
      write = write .. "Height" .. i ..","
  end
  -- "\n"表示换行
  write = write .. "\n"
end
-- 将时间拼接入字符串中
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
-- 将字符串写入文件中
PrintToFile("./Height1.csv", write)


-- 生成保存检测数据的csv文件

write = ""

if FileExists("./Height2.csv") == false then
  write = write .. "Time,"
  for i= 1,8,1 do
      write = write .. "Height" .. i ..","
  end
  write = write .. "\n"
end

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


-- 生成保存检测数据的csv文件

write = ""

if FileExists("./Height3.csv") == false then
  write = write .. "Time,"
  for i= 1,8,1 do
      write = write .. "Height" .. i ..","
  end
  write = write .. "\n"
end

write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
PrintToFile("./Height3.csv", write)
  1. 使用加载点云工具,加载需要处理的点云图。

二、预处理

本地图片

位置调整

  1. 使用3D方形探针工具,得到工件的两条边。

    本地图片

  2. 使用3D几何交点工具,绑定上一步算子变量输出的两条边作为输入几何,输出两直线交点。

  3. 使用3D位置调整工具,绑定上一步算子输出输出的直线交点作为新原点调整点云XY位置。

拟合平面

  1. 使用3D区域工具,选择拟合平面的区域。

    本地图片

  2. 使用3D平面工具,绑定上一步算子输出的变量区域作为输入区域,拟合平面并将其设置为零平面。

裁切待测区域

使用3D裁切工具,分别裁切出三个待测Pin针至IM2、IM3、IM4。

三、Pin针高度循环测量

本地图片

  1. 使用3D斑点工具,得到每个焊点的位置信息。

    本地图片

  2. 使用3D高度工具,绑定上一步3D斑点工具输出变量焊点区域信息作为输入区域,测量所有Pin针高度。

四、数据保存

使用lua脚本工具

  • 绑定3D高度工具输出变量高度数组

  • 编辑脚本循环拼接高度值到字符串

  • 保存数据到csv文件。

经验

string.format 用于格式化字符串 %.nf表示将浮点数格式化为保留 n 位小数。

pi = 3.14159 str = string.format("Pi is approximately %.3f", pi) print(str) -- 输出: Pi is approximately 3.141

lua
-- 用于拼接高度的字符串
writeH1 = ""
writeH2 = ""
writeH3 = ""

writeH1 = writeH1 .. os.date("%Y_%m_%d %H:%M:%S") .. ","
writeH2 = writeH2 .. os.date("%Y_%m_%d %H:%M:%S") .. ","
writeH3 = writeH3 .. os.date("%Y_%m_%d %H:%M:%S") .. ","

-- 循环拼接高度到字符串
for i=1,22,1 do     
    writeH1 = writeH1 .. string.format("%.3f,",Height1[i])

end

for i=1,8,1 do
    writeH2 = writeH2 .. string.format("%.3f,",Height2[i])
end

for i=1,8,1 do
    writeH3 = writeH3 .. string.format("%.3f,",Height3[i])
end

WriteLineToFile("./Height1.csv",writeH1)
WriteLineToFile("./Height2.csv",writeH2)
WriteLineToFile("./Height3.csv",writeH3)

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