Skip to content

Type-C连接器引脚段差测量 ​

项目简介 ​

项目背景 ​

通过准确测量引脚段差,及时发现并排除不良品,降低不良品率。

本地图片

相机选型 ​

LMI激光线扫相机 Gocator2510

检测要求 ​

测量精度 ≤ 0.02mm
测量重复性 ≤ 0.015mm
测量周期 ≤ 200ms

解决方案 ​

AI-Vision软件对3D点云进行处理,产品定位后拟合基准平面,使用循环测量上下两端高度再取差的方式进行测量。该项目相比于转2D的方法,流程大大简化,在处理速度与精度上都有了一定提高。

设计思路 ​

本地图片

执行效果展示
​

  • 工程结果展示:

    本地图片

  • HMI结果展示:

    本地图片

项目流程 ​

一、初始化 ​

  1. 使用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
  1. 使用加载点云工具,加载需要处理的点云图。

二、预处理 ​

本地图片

位置调整 ​

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

    本地图片

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

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

拟合平面 ​

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

    本地图片

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

裁切待测区域 ​

选择3D裁切工具,裁切需要测量的部分至IM1中。

本地图片

图像预处理 ​

选择3D离群点滤波工具,将IM1中的点云进行滤波,过滤掉干扰点。

本地图片

三、循环计算引脚段差 ​

本地图片

  1. 选择3D方形探针工具,分别找出上,下部分起始点。

    本地图片

  2. 使用标记工具,设置startLoop用于循环跳转。

  3. 选择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)
  1. 选择3D高度工具,绑定lua语言脚本工具算子输出变量(当前待测点测量box),测量得到高度值。

  2. 选择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
  1. 使用标记工具,设置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)

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