Appearance
Pin针高度测量
工程背景
测量背景
鉴于PIN针在PCB板中的关键作用及其对精度的严格要求,传统检测方法存在精度不足、效率低等问题。随着智能制造和3D视觉技术的发展,自动化检测成为趋势,旨在提高检测精度与效率,确保产品质量,满足大规模生产需求。
相机选型
盛相科技 S162170
测量项
Pin针高度
检测要求
测量精度 ≤ 0.03mm
测量重复性 ≤ 0.05mm
测量周期 ≤ 2000ms
解决方案
AI-Vision采用区域划分的方法,将三块测量区域分割出来,通过Blob找到每块区域的Pin针,使用多高度测量集成工具一键输出高度。
设计思路
执行效果展示
工程结果展示
- 区域1测量结果
- 区域2测量结果
- 区域3测量结果
项目流程
一、初始化
- 使用
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)
- 使用
加载点云
工具,加载需要处理的点云图。
二、预处理
位置调整
使用
3D方形探针
工具,得到工件的两条边。使用
3D几何交点
工具,绑定上一步算子变量输出的两条边作为输入几何,输出两直线交点。使用
3D位置调整
工具,绑定上一步算子输出输出的直线交点作为新原点调整点云XY位置。
拟合平面
使用
3D区域
工具,选择拟合平面的区域。使用
3D平面
工具,绑定上一步算子输出的变量区域作为输入区域,拟合平面并将其设置为零平面。
裁切待测区域
使用3D裁切
工具,分别裁切出三个待测Pin针至IM2、IM3、IM4。
三、Pin针高度循环测量
使用
3D斑点
工具,得到每个焊点的位置信息。使用
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)