電池頂蓋平面度高度測量
工程背景
測量背景
隨著新能源汽車、消費電子和其他依賴高效能電池系統的領域快速發展,對於電池元件的質量要求也日益提高。電池蓋板作為電池結構中的關鍵部件之一,其平面度和高度的精確性直接關係到電池的安全效能、密封效果以及整體裝配質量。任何微小的偏差都可能導致電池內部短路、洩漏等嚴重問題,進而影響產品的可靠性和使用者安全。
因此,為了確保每一個出廠的電池都具備最高標準的質量,製造商需要引入一套精準且高效的電池蓋板平面度和高度檢測系統。該系統旨在通過自動化手段實現對電池蓋板關鍵尺寸引數的嚴格監控,以保證產品的一致性和可靠性。
相機選型
深視SR7080
測量項
電池蓋板表面平面度及正負極高度
解決方案
Vision-Studio首先對點雲圖進行定位,接著確定電池表面基準面之後測量表面平面度,最後分別對正負極高度進行測量。
設計思路

執行效果展示
工程結果展示
- 檢測結果

專案流程
一、初始化

使用
加载点云工具,載入需要處理的點雲圖。
使用
Lua脚本工具,初始化需要儲存的csv檔案的表頭。
經驗
.. 用於string型別字串拼接
part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 輸出: Hello, world!
,作為分隔符,分割每個資料項
--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
--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高度工具輸出變數高度值編輯指令碼計算正極平均高度
設定高度資訊到全域性變數
--计算正极高度+补偿值
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檔案
--定义个通用的计算限值函数,后面会反复使用
--函数功能:判断输入变量的值是否超出上下限,超出后设置个固定值
-- 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)