Appearance
电池顶盖平面度高度测量
工程背景
测量背景
随着新能源汽车、消费电子和其他依赖高效能电池系统的领域快速发展,对于电池组件的质量要求也日益提高。电池盖板作为电池结构中的关键部件之一,其平面度和高度的精确性直接关系到电池的安全性能、密封效果以及整体装配质量。任何微小的偏差都可能导致电池内部短路、泄漏等严重问题,进而影响产品的可靠性和用户安全。
因此,为了确保每一个出厂的电池都具备最高标准的质量,制造商需要引入一套精准且高效的电池盖板平面度和高度检测系统。该系统旨在通过自动化手段实现对电池盖板关键尺寸参数的严格监控,以保证产品的一致性和可靠性。
相机选型
深视SR7080
测量项
电池盖板表面平面度及正负极高度
解决方案
AI-Vision首先对点云图进行定位,接着确定电池表面基准面之后测量表面平面度,最后分别对正负极高度进行测量。
设计思路
执行效果展示
工程结果展示
- 检测结果
项目流程
一、初始化
使用
加载点云
工具,加载需要处理的点云图。使用
Lua脚本
工具,初始化需要保存的csv文件的表头。
经验
.. 用于string类型字符串拼接
part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 输出: Hello, world!
,
作为分隔符,分割每个数据项
lua
--CSV文件名
local filename = "./Data.csv"
SetStringVariable("DataPath",filename)
-- 生成保存检测数据的csv文件
-- 表头
write = ""
if FileExists(filename) == false then
write = write .. "Time,"
write = write .. "F1" .. ","
write = write .. "NPH1_Mean" .. ","
write = write .. "NPH2_Mean" .. ","
write = write .. "NPH3_Mean" .. ","
write = write .. "NPH4_Mean" .. ","
write = write .. "PPH1_Mean" .. ","
write = write .. "PPH2_Mean" .. ","
write = write .. "PPH3_Mean" .. ","
write = write .. "PPH4_Mean" .. ","
write = write .. "NPH_Max" .. ","
write = write .. "NPH_Min" .. ","
write = write .. "PPH_Max" .. ","
write = write .. "PPH_Min" .. ","
write = write .. "Height_N" .. ","
write = write .. "Height_R"
end
--将表头写入表格
PrintToFile(filename, write.. "\n")
二、预处理
位置调整
使用
3D方形探针
工具,分别找到电池点云下边直线和电池点云左边直线。使用
3D几何交点
工具,根据上一步检测到的直线,计算两直线交点。使用
3D位置调整
工具,调整定位到到两直线交点位置。
平面拟合
使用
3D区域
工具,选择基准区域使用
3D平面
工具,根据上个工具选择的区域,拟合平面并将其设置为零平面。
复制IM用于不同子程序调用
复制IM1到IM2,IM3 :复制IM1到IM2,IM3分别用于盖板平面度及高度的测量。
提示
使用并行调用子程序时,每个子程序需要在不同的IM执行。
三、盖板平面度高度测量
盖板平面度测量
使用
3D平面度
工具,选择19个区域测量平面度使用
Lua脚本
工具,在对应IM显示平面度结果并将平面度信息存到全局变量
绑定
3D平面度
工具输出变量平面度值编辑脚本将平面度信息推送到全局变量并在IM显示平面度结果
经验
string.format 用于格式化字符串 %.nf表示将浮点数格式化为保留 n 位小数。
pi = 3.14159 str = string.format("Pi is approximately %.3f", pi) print(str) -- 输出: Pi is approximately 3.141
lua
--offset_F1: 盖板平面度的补偿值
-- 平面度+补偿值
F1= flatness + offset_F1
SetFloatVariable("Flatness" , math.floor(F1*1000)/1000)
-- 结果判断显示
if 0<F1 and F1<0.8 then
DrawText3D(1,"green",25,54,20,16,"盖板平面度OK:" .. string.format("%3f",F1))
else
DrawText3D(1,"red",25,54,20,16,"盖板平面度NG:" .. string.format("%3f",F1))
end
盖板高度测量
使用
3D高度
工具,选择四个区域测量正极高度;使用
Lua脚本
工具,获取正极高度并求正极平均高度;测量完成之后使用Lua脚本
工具,获取正极高度并求正极平均高度,将高度信息设置到全局变量。
绑定
3D高度
工具输出变量高度值编辑脚本计算正极平均高度
设置高度信息到全局变量
lua
--计算正极高度+补偿值
PPH1_Mean = math.floor(PPH1 + offSet_H_R_Single1*1000)/1000
PPH2_Mean = math.floor(PPH2 + offSet_H_R_Single2*1000)/1000
PPH3_Mean = math.floor(PPH3 + offSet_H_R_Single3*1000)/1000
PPH4_Mean = math.floor(PPH4 + offSet_H_R_Single4*1000)/1000
-- 计算正极平均高度
PPH = (PPH1_Mean + PPH2_Mean + PPH3_Mean + PPH4) / 4 + offset_H_R
PPH = math.floor(PPH*1000)/1000
--高度数据保存到全局变量
SetFloatVariable("PPH1_Mean", PPH1_Mean)
SetFloatVariable("PPH2_Mean", PPH2_Mean)
SetFloatVariable("PPH3_Mean", PPH3_Mean)
SetFloatVariable("PPH4_Mean", PPH4_Mean)
SetFloatVariable("Height_R" , PPH)
负极高度测量
负极高度测量步骤与正极高度测量相同
六、数据保存
使用Lua脚本
工具,获取电池盖板及正负极高度信息并保存到csv文件
lua
--定义个通用的计算限值函数,后面会反复使用
--函数功能:判断输入变量的值是否超出上下限,超出后设置个固定值
-- arg:参数名称
-- minlimit:最小限值
-- maxlimit:最大限值
-- expect:超过限值后的期望值
function CalculationLimit(arg, minlimit, maxlimit, expect)
if arg <= minlimit or arg >= maxlimit then
return expect
else
return arg
end
end
-- 平面度限值计算
F1 = CalculationLimit(F1, 0, 1.0, 0.555)
-- 负极高度限值计算
NPH1_Mean = CalculationLimit(NPH1_Mean, 0, 10.0, 9.999)
NPH2_Mean = CalculationLimit(NPH2_Mean, 0, 10.0, 9.999)
NPH3_Mean = CalculationLimit(NPH3_Mean, 0, 10.0, 9.999)
NPH4_Mean = CalculationLimit(NPH4_Mean, 0, 10.0, 9.999)
--正极高度限值计算
PPH1_Mean = CalculationLimit(PPH1_Mean, 0, 10.0, 9.999)
PPH2_Mean = CalculationLimit(PPH2_Mean, 0, 10.0, 9.999)
PPH3_Mean = CalculationLimit(PPH3_Mean, 0, 10.0, 9.999)
PPH4_Mean = CalculationLimit(PPH4_Mean, 0, 10.0, 9.999)
--负极四个高度的最大值
NPH_Max = math.max(NPH1_Mean,NPH2_Mean,NPH3_Mean,NPH4_Mean)
NPH_Max = CalculationLimit(NPH_Max, 0, 10.0, 9.999)
SetFloatVariable("NPH_Max", NPH_Max)
--负极四个高度的最小值
NPH_Min = math.min(NPH1_Mean,NPH2_Mean,NPH3_Mean,NPH4_Mean)
NPH_Min = CalculationLimit(NPH_Min, 0, 10.0, 9.999)
SetFloatVariable("NPH_Min", NPH_Min)
--正极四个高度的最大值
PPH_Max = math.max(PPH1_Mean,PPH2_Mean,PPH3_Mean,PPH4_Mean)
PPH_Max = CalculationLimit(PPH_Max, 0, 10.0, 9.999)
SetFloatVariable("PPH_Max", PPH_Max)
--正极四个高度的最小值
PPH_Min = math.min(PPH1_Mean,PPH2_Mean,PPH3_Mean,PPH4_Mean)
PPH_Min = CalculationLimit(PPH_Min, 0, 10.0, 9.999)
SetFloatVariable("PPH_Min", PPH_Min)
--负极平均高度限值
Height_N = CalculationLimit(Height_N, 0, 10.0, 9.999)
--正极平均高度限值
Height_R = CalculationLimit(Height_R, 0, 10.0, 9.999)
--整理要发送的字符串
send = string.format("%.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f",
F1, NPH1_Mean, NPH2_Mean, NPH3_Mean, NPH4_Mean, PPH1_Mean, PPH2_Mean,
PPH3_Mean, PPH4_Mean, NPH_Max, NPH_Min, PPH_Max, PPH_Min, Height_N, Height_R)
SetStringVariable("send", send)
--写入表格
write = os.date("%Y_%m_%d %H:%M:%S") .. send
PrintToFile(Filename, write)