Appearance
Type-C连接器引脚段差测量
项目简介
项目背景
通过准确测量引脚段差,及时发现并排除不良品,降低不良品率。
相机选型
LMI激光线扫相机 Gocator2510
检测要求
测量精度 ≤ 0.02mm
测量重复性 ≤ 0.015mm
测量周期 ≤ 200ms
解决方案
AI-Vision软件对3D点云进行处理,产品定位后拟合基准平面,使用循环测量上下两端高度再取差的方式进行测量。该项目相比于转2D的方法,流程大大简化,在处理速度与精度上都有了一定提高。
设计思路
执行效果展示
工程结果展示:
HMI结果展示:
项目流程
一、初始化
- 使用
Lua脚本
工具
设置currentPin全局变量用于计数判断,设置hDiff全局变量用于拼接高度信息字符串
拼接表头字符串,保存到csv文件
经验
.. 用于string类型字符串拼接
part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 输出: Hello, world!
,
作为分隔符,分割每个数据项
lua
-- 变量初始化
SetIntVariable("currentPin", 0)
SetStringVariable("hDiff", "")
-- csv文件初始化
-- 生成表头
csvHead = "Time,"
for i=1,14,1 do
csvHead = csvHead .. "diff" .. i .. ","
end
-- "\n"换行
csvHead = csvHead .. "OK/NG" .. "\n"
-- 创建文件,脚本第一次运行时,没有就创建
if FileExists("./E85hDiff.csv") == false then
PrintToFile("./E85hDiff.csv", csvHead)
end
- 使用
加载点云
工具,加载需要处理的点云图。
二、预处理
位置调整
使用
3D方形探针
工具,得到工件的两条边。使用
3D几何交点
工具,绑定上一步算子变量输出的两条边作为输入几何,输出两直线交点。使用
3D位置调整
工具,绑定上一步算子输出输出的直线交点作为新原点调整点云XY位置。
拟合平面
使用
3D区域
工具,选择拟合平面的区域。使用
3D平面
工具,绑定上一步算子输出的变量区域作为输入区域,拟合平面并将其设置为零平面。
裁切待测区域
选择3D裁切
工具,裁切需要测量的部分至IM1中。
图像预处理
选择3D离群点滤波
工具,将IM1中的点云进行滤波,过滤掉干扰点。
三、循环计算引脚段差
选择
3D方形探针
工具,分别找出上,下部分起始点。使用
标记
工具,设置startLoop
用于循环跳转。选择
lua语言脚本
工具
绑定
3D方形探针
工具输出变量中点作为上下边测量起始点计算出下一待测点的位置,将待测点的测量box输出到算子输出变量。
循环计数加1
lua
--取出基准坐标
cx1 = start1.X
cy1 = start1.Y
cz1 = start1.Z
cx2 = start2.X
cy2 = start2.Y
cz2 = start2.Z
--计算每个针的y值
boxy1 = cy1 + pinCount * 0.5
boxy2 = cy2 + pinCount * 0.5
--向寄存器推送用于测高的盒子
SetBox("box1",cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
SetBox("box2",cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--在IM上绘制box
DrawBox(1, "green",cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
DrawBox(1, "green",cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--循环次数加1
SetIntVariable("currentPin", pinCount + 1)
选择
3D高度
工具,绑定lua语言脚本
工具算子输出变量(当前待测点测量box),测量得到高度值。选择
lua语言脚本
工具
绑定两个
3D高度
工具输出的高度值编辑脚本计算得出高度
保存pin高度数据到数组全局变量,拼接pin高度数据到字符串
并进行判断是否循环。
经验
string.format 用于格式化字符串 %.nf表示将浮点数格式化为保留 n 位小数。
pi = 3.14159 str = string.format("Pi is approximately %.3f", pi) print(str) -- 输出: Pi is approximately 3.141
lua
--计算高度差
heightdiff = height2 - height1
--保存到字符串中,后面直接写csv文件
SetStringVariable("hDiff", hDiff .. "," .. string.format("%.3f", heightdiff))
--保存到数组中,后面使用
table.insert(hdiff, heightdiff)
SetFloatArrayVariable("hdiff", hdiff)
if currentPin < 14 then
Jump("startLoop")
else
Jump("stopLoop")
end
- 使用
标记
工具,设置stopLoop
用于结束跳转。
四、结果保存至数据库与csv文件中
选择lua语言脚本
工具
绑定全局变量(是否保存csv文件),保存pin高度数据的数组全局变量,保存pin高度数据的字符串全局变量。
编辑脚本根据pin高度数组判断结果是否满足条件且将结果显示在IM上,将判断结果拼接到字符串全局变量
将数据保存至数据库和csv文件中。
经验
table.insert 是 Lua 中用于向表中插入元素的函数 table.insert(table1, [pos,] value) table1:需要插入元素的表。 pos(可选):插入位置。如果不提供,默认将值追加到表的末尾。 value:要插入的值。
local table1 = {"w", "b"} table.insert(table1, "v") -- 在末尾插入 "v" print(table1) -- 输出: ["w","b","v",] print(table1[1]) -- 输出: w
lua
-- 结果判断
Judge = true
for i = 1,14,1 do
if hdiff[i] < 1.52 or hdiff[i] > 1.55 then
Judge = false
break
end
end
-- 显示结果
if Judge == false then
DrawText3D(1,"red",1, 8, 1.5, 32,"检测结果:" .. "NG")
elseif Judge == true then
DrawText3D(1,"green",1, 8, 1.5, 32,"检测结果:" .. "OK")
end
-- 保存csv文件
if save == 1 then
--获取高度差的结果
if Judge == true then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. hDiff .. "," .. "OK"
elseif Judge == false then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. hDiff .. "," .. "NG"
end
WriteLineToFile("./E85hDiff.csv", hDiff)
end
-- 保存数据库
-- 接收变量的数组
fileds = {}
sqlData = {}
-- 向表中插入数据
for i = 1, 14, 1 do
table.insert(fileds,"hDiff"..i)
table.insert(sqlData, hdiff[i])
--保留3位小数
variable = "hdiff" .. tostring(i)
SetStringVariable(variable, string.format("%.3f", hdiff[i]))
end
table.insert(fileds,"OKNG")
if Judge == true then
table.insert(sqlData, 1)
elseif Judge == false then
table.insert(sqlData, 0)
end
-- 将数据写入数据库中
WriteHmiData("HDIFF", fileds, sqlData)