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测量更简单