激光深熔焊这个领域,做了这么多年工艺开发,我越来越觉得一个道理:焊得稳不稳,很多时候不取决于你参数表里那几档功率和速度,而是焊接过程中那个看不见摸不着的“小孔”到底在干什么。小孔(keyhole)的演化行为——膨胀、收缩、坍塌、喷发——几乎决定了气孔、飞溅、咬边这些现场最头疼的缺陷会不会出现。但传统做法里,小孔状态只能靠老师傅听声音、看熔池、最后切金相来反推,根本谈不上实时干预。我这两年一直在做“激光焊小孔演化的自编程技术”,目标很简单:让系统自己感知小孔动态,自己调整工艺参数,把小孔尽量稳定在理想状态。目前这套思路已经跑通了原型,也经过了不少现场验证,这篇文章把从原理到落地的完整过程梳理一遍,给同样在搞激光焊智能化的朋友做个参考。
1. 为什么激光焊的成败藏在小孔里
1.1 小孔不是“洞”,是一个动态腔体
很多人刚接触激光焊时,容易把小孔想象成一个被激光烧穿的固定“洞”。实际上,激光深熔焊里的小孔,是一个处于高度动态平衡的蒸气腔体:高功率密度的激光束照射到材料表面,金属瞬间汽化形成高压金属蒸气,蒸气反冲压力把熔融金属向四周推开,形成一个细长的孔腔,激光束在这个孔腔内壁发生多次反射吸收,能量利用率大幅提升,焊缝才能打得又深又窄。
但这个腔体从来不是静态的。小孔内部同时存在几股互相较劲的力:金属蒸气反冲压力想把孔撑开,熔融金属的表面张力想把孔口收小,重力和静水压力想把孔壁压塌,而流动的熔池又会不断改变孔口附近的边界条件。这几个力只要稍微失衡,小孔就会发生形态变化。我用一个直白的类比:小孔就像一扇不断被高压气体顶开、又被液体表面张力往回拉的“活门”,焊接过程中它其实一直在高速颤抖。
这就是为什么小孔状态会直接影响焊接质量。小孔开口如果周期性收窄,金属蒸气排出受阻,熔池内的气体就可能来不及逸出而被凝固前沿捕获,形成气孔;如果开口被完全封死,内部压力积累到一定程度再突然释放,就产生飞溅;如果孔壁某个位置发生局部坍塌,焊缝内部就会出现不规则空洞。所以在深熔焊的世界里,焊缝质量问题,本质上大部分是小孔演化问题。
1.2 小孔演化的典型失稳模式与缺陷对应
我这些年通过高速摄影、同轴光电信号和焊缝金相对照,总结了小孔演化的几种典型失稳模式,它们在信号特征和缺陷后果上都有明显区别,这也是后续做自编程判据的基础。
| 失稳模式 | 典型信号特征 | 主要缺陷后果 | 危险程度 |
|---|---|---|---|
| 周期振荡 | 光信号呈现较稳定的低频周期波动 | 熔池波动、焊缝表面纹路粗糙 | 中 |
| 开口收缩/闭口 | 光强均值缓慢下降,方差增大 | 气孔率升高、熔深变浅 | 高 |
| 深部坍塌 | 信号发生台阶式突降,伴有低频扰动 | 内部孔洞、未熔合 | 极高 |
| 开口喷发 | 出现尖锐短脉冲尖峰 | 飞溅、咬边、焊缝成形差 | 高 |
| 高频壁面颤动 | 频谱高频成分能量升高 | 表面波纹、氧化物夹杂翻腾 | 中低 |
需要说明的是,这几种模式往往不是单独出现的。实际焊接过程中,小孔先开始高频颤动,接着开口逐渐收窄,最后某一瞬间发生坍塌或喷发,整个过程可能只有几十到几百毫秒。这就是为什么后置质检甚至普通摄像头监控都来不及——等你从焊缝表面看出问题,小孔早就折腾完一轮了。
这也是我做自编程技术的出发点:既然小孔演化是质量的“第一现场”,那就必须在它演化到恶化阶段之前,通过信号特征判断出趋势,提前把功率、速度、离焦量这些参数做微调。这比等缺陷形成后再去调参数要靠谱得多。
2. 让小孔“开口说话”:可量化的演化特征与传感手段
2.1 能反映小孔状态的物理量有哪些
要实现对“小孔演化”的自动干预,第一步是找到能实时表征小孔状态的物理量。这个环节看起来简单,实际是最考验工程判断力的,因为学术研究里常用的测量手段和工业现场能用的手段,差距非常大。
学术界研究小孔演化,最硬核的工具是同步辐射X射线成像,可以穿透金属直接看到小孔内部的动态过程。但大家都清楚,同步辐射光源是国家级大科学装置,不可能搬到车间里,所以工业可行的小孔状态感知,基本得靠间接信号。
我自己在工程中主要关注的物理量有这几个:
- 小孔开口面积与轮廓:可以通过高速相机同轴或侧向拍摄获得,最直观,但要获得可靠的开口面积需要图像处理,对实时性要求高。
- 同轴光信号强度:小孔内金属蒸气和等离子体发出的光,其强度与蒸气产量、小孔尺寸直接相关。用光电二极管对准焊接点采集,响应速度可以达到微秒级,是工业闭环里最常用的信号。
- 激光反射光的变化:小孔形成后,激光在小孔内部多次吸收,反射光强度会显著下降。通过监测反射光,可以判断小孔是否建立、是否闭合。
- 声发射与结构振动信号:小孔振荡会在工件中激发弹性波,用压电传感器贴在工作台或工件表面可以拾取,但现场噪声污染很严重,信噪比不高。
- 熔池热像:红外热像仪测熔池表面温度场分布,可以间接反映小孔开口附近的热状态,但普通红外相机的帧率往往不够用。
在我的系统里,主信号选择的是同轴光信号,因为它响应快、传感器成本低、安装位置可以集成在焊接头内部,便于工业部署。高速相机则作为辅助手段,主要做离线标定和故障诊断,不参与实时闭环。
2.2 不同传感方案的对比与选择逻辑
为了说清楚为什么这么选,我把几种常见传感方案放在一起做对比:
| 传感方案 | 响应速度 | 工业部署难度 | 信息维度 | 主要问题 |
|---|---|---|---|---|
| 同轴光电二极管 | 微秒级 | 低 | 一维光强 | 信息是积分量,需要频域分析挖掘特征 |
| 高速可见光相机 | 取决于帧率 | 中高 | 二维形貌 | 数据量大、延迟高、光学窗口易污染 |
| 等离子体电荷传感器 | 微秒级 | 中 | 一维电信号 | 对保护气体波动敏感,信号不稳 |
| 激光反射光监测 | 微秒级 | 低 | 一维光强 | 只能反映小孔建立/闭合两类状态,中间过程信息少 |
| 同步辐射X射线 | —— | 极高 | 三维内部结构 | 仅限实验室,工业现场不可能用 |
如果只是要做一个“缺陷报警器”,用反射光或者电荷传感器就够了。但要做自编程,也就是要让系统具备自动调节参数的能力,信息维度必须足够丰富,至少能区分出“开口振荡”“深度变浅”“即将坍塌”这些不同状态。同轴光信号虽然也是一维的,但它的频带很宽,包含了小孔壁振动、开口振荡、蒸气喷发等多种物理过程的频率特征,通过频域分析能拆出不少信息,这也是我最终选择它作为主信号的原因。
在选传感器的时候,有两点现场经验值得提醒:第一,光电二极管的响应带宽至少要到50kHz以上,否则小孔高频颤动的特征会被滤掉;第二,传感器前端的滤光片很重要,需要把1064nm波长的反射激光滤掉,同时让可见光和近紫外波段透过,否则传感器会饱和,动态范围被压缩得很厉害。
2.3 信号特征如何对应小孔演化状态
有了同轴光信号之后,接下来就是怎么从中提取“小孔状态信息”。这一步是整个自编程系统的信号处理核心,我通常从三个维度做特征提取:
时域统计特征。光强信号的均值反映平均蒸气产量,间接对应小孔的平均开口大小。方差或变异系数(CV = 标准差/均值)反映波动剧烈程度。通过滑窗计算这些特征,可以判断小孔处于“相对稳定”还是“剧烈振荡”状态。
频域特征。小孔的不同演化模式,在频谱上有不同的能量分布。比如小孔开口的周期性振荡通常表现为100Hz到几千Hz之间的窄带峰;小孔壁高频颤动则表现为更高频段的宽带能量抬升。具体频率范围与材料热物性、板厚、焊接速度都有关系,不能照搬别人的参数,需要现场标定。但一旦标定好,这个特征就非常稳定可靠。
事件特征。有些小孔失稳会以突变的形式出现,比如开口喷发会产生一个极短的强脉冲,深部坍塌会产生一个较快的台阶式下降。通过在信号中检测这些事件,统计单位时间内的发生次数,可以判断小孔是否处于“危险状态”。
把这些特征综合起来,就可以把小孔演化状态映射成一组数值指标。比如我常用的一个综合指标是“稳定性得分”,它由特征频带能量占比、变异系数和事件发生率三个子项加权组合而成。这个指标就是后面自编程控制器的输入变量。
3. 自编程技术的核心:从特征识别到参数自动闭环
3.1 “自编程”到底是什么:先厘清概念
很多同行听到“自编程”第一反应是数控加工里的自动编程,也就是根据零件模型自动生成G代码加工轨迹。但激光焊小孔演化的自编程,完全是另一回事,它更多指工艺参数的自适应生成与自整定。
简单来说,就是系统通过感知小孔演化状态,自动决定当前应该用多大的激光功率、多快的焊接速度、什么样的离焦量,并且在焊接过程中根据状态变化实时修正这些参数。整个过程不需要工艺人员提前做大量的试焊和参数标定,也不需要操作工盯守调节,系统自己就把参数的“寻优”工作做完了。
我把这个自编程拆成两个层面来理解:
第一层是离线自学习。系统在试焊过程中采集信号,自动识别特征频带、自动评估不同参数组合下的小孔稳定性,把“参数-小孔稳定性”的映射关系建立起来,生成可用的控制规则。传统工艺开发中,这摊子活是靠工艺工程师反复做DOE试验完成的,自编程的意义在于让这个过程的自动化程度更高。
第二层是在线自适应。正式焊接时,系统实时监测小孔状态指标,一旦发现稳定性偏离目标区间,就自动调整功率、速度等参数,把小孔拉回稳定状态。这才是“自编程”最核心的价值,也是实际焊接过程中最需要的功能。
3.2 控制器架构:传感层、特征层、决策层怎么衔接
我的系统在逻辑上分成三层,每层职责清晰,这样分工明确,不管换激光器还是换材料,都只需要调整对应层级的模块。
传感层:负责原始信号采集和预处理。同轴光电信号经过前置放大后,由数据采集卡以50kHz~100kHz的采样率连续采集;同时采集激光器实际输出功率、焊接速度等状态量,用于后续的逻辑判断。这个层面最重要的是保证时间同步,信号和工艺参数的采样时刻必须对齐,否则后续做相关性分析时会得出完全错误的结论。
特征层:负责把原始信号转换成状态指标。滑窗计算时域统计量、频带能量、事件频次,然后融合成稳定性得分。这一步运算量不大,但需要精心设计窗口长度和更新率。窗口太短,特征噪声大,指标抖动剧烈;窗口太长,响应滞后,来不及反应。经过反复试验,我目前用100ms左右的窗口,每20ms更新一次,既能滤掉部分噪声,又能保证对突变事件的响应速度。
决策层:负责根据稳定性指标生成参数调整量。决策逻辑可以是一张查表规则,也可以是一个简单的PID控制器,或者是基于模型预测的优化器。考虑到工业现场的可靠性和可解释性要求,我目前主力采用的是“规则+限幅PID”的混合结构,既保留了逻辑的透明性,又具备连续调节能力。
3.3 稳定性判据与控制规律的设计思路
自编程系统的质量,完全取决于两个核心计算环节:稳定性判据和控制规律。
稳定性判据,本质上是把小孔的“好状态”翻译成数学条件。我的做法是同时定义多个条件,全部满足才算稳定:
- 特征频带能量占比落在标定的正常区间内,既不能过低(可能小孔未充分建立),也不能过高(可能振动过于剧烈);
- 光强变异系数低于阈值;
- 单位时间内喷发/坍塌事件数低于设定值。
这里要特别注意:不同材料、不同板厚,这三个指标的阈值都不一样,不存在“一套参数打天下”的可能性,所以系统必须支持阈值自标定,这也是自编程技术的一部分。
控制规律,简单的说法就是“偏差怎么变成参数增量”。以激光功率为例,当特征频带能量占比低于目标下界时,说明小孔尺寸有收缩趋势,需要适当增加功率或降低速度;当占比偏高时,说明摆动剧烈,需要适当降功率、增大离焦量来缓和。为了防止过调,调整量要限制在安全范围内,比如功率单次调整不超过200W,输出总功率限制在激光器允许范围之内。
另外还有一个非常重要的原则:不要追求对信号的每一次波动都做出响应。小孔本身就是一个高频动态系统,如果控制器的响应带宽做得太高,很容易与过程本身的振荡耦合,产生“控制诱导振荡”。我的经验是把有效控制带宽限制在20Hz以下,让系统只响应趋势性变化,对瞬时噪声不做反应。这个思路有点像开车时看远方而不是盯着车头前的路面看——盯着近处的坑洼猛打方向盘,车反而会失控。
4. 一个可落地的自编程原型系统:搭建与实现
4.1 硬件选型与信号链路配置
下面说一个具体可复用的原型配置,这些硬件都是市面上容易采购的,不一定是最贵或者最先进的,但足够用来跑通小孔演化自编程的闭环。
激光器:以6kW光纤激光器为例,必须具备外部模拟量或数字量控制接口,功率响应时间要短(通常几百微秒到几毫秒),这是做在线功率调节的前提。有些激光器内部有功率闭环,外部给定值变化后不会立刻反应到实际输出,这个延迟需要实测确认。
焊接头:选择带同轴观察窗口的焊接头,比如Precitec的YW系列或同类产品。同轴窗口就是自编程系统的“眼睛”——光电传感器从这个窗口对准焦点区域,采集小孔和等离子体的光辐射。
光电探测器:硅光电二极管配合前置放大电路,带宽做到50kHz以上,输出0~10V模拟信号。安装时加一组可更换的中性密度衰减片和带通滤光片,用于调节进光量,保证在低功率和高功率下都不饱和。
数据采集与控制单元:工业PC加一块多通道同步采集卡,采样率不低于100kS/s。控制指令可以通过模拟量输出口直接送激光器,如果激光器支持现场总线控制(比如EtherCAT),也可以走总线方式,响应更稳定。
辅助监控:一台高速相机(帧率2000fps以上),用于离线标定小孔开口形态与光信号特征的对应关系,不参与在线控制。这个配置能帮你省掉大量盲调时间。
整个信号链路的逻辑顺序:小孔光辐射 → 同轴窗口 → 滤光片 → 光电二极管 → 前置放大 → 采集卡 → 特征提取算法 → 稳定性评估 → 控制指令 → 激光器功率调整 → 小孔状态变化 → 再次被传感器感知。
4.2 核心算法示例:Python原型代码
这部分我提供一个简化但可运行的核心逻辑示例,方便理解特征提取和功率调整是怎么实现的。实际工程中会换成C++或者部署到实时系统,但算法骨架是通用的。
import numpy as np from scipy.signal import butter, sosfilt, find_peaks class KeyholeAutoTuner: """激光焊小孔演化自编程原型:同轴光信号特征提取 + 功率自适应调整""" def __init__(self, fs=50000, target_ratio=0.55, power_min=800, power_max=6000): self.fs = fs self.power_min = power_min self.power_max = power_max # 特征频带:这里以不锈钢中薄板为例,实际需现场标定 band = (300, 2500) self.sos_band = butter(4, [band[0] / (fs/2), band[1] / (fs/2)], btype='bandpass', output='sos') # 慢趋势滤波,用于计算信号均值 self.sos_lp = butter(4, 50 / (fs/2), btype='lowpass', output='sos') # 双缓冲:100ms滑窗,20ms处理一次 self.window = np.zeros(int(fs * 0.1)) self.target_ratio = target_ratio def add_sample(self, value): """每采集一个点调用一次,内部滑动窗口""" self.window[:-1] = self.window[1:] self.window[-1] = value def extract_features(self): """提取当前窗口内的稳定性特征""" sig = self.window # 慢变趋势 trend = np.mean(sosfilt(self.sos_lp, sig)) # 特征频带能量占比 band_sig = sosfilt(self.sos_band, sig) band_energy = np.mean(band_sig**2) total_energy = np.mean(sig**2) + 1e-12 ratio = band_energy / total_energy # 事件检测:基于MAD的鲁棒阈值 med = np.median(sig) mad = np.median(np.abs(sig - med)) + 1e-9 peaks, _ = find_peaks(np.abs(sig - med), height=8*mad, distance=int(self.fs * 0.002)) return trend, ratio, len(peaks) def compute_power_adjust(self, ratio, event_count, base_power, k_p=2000): """根据特征偏差和事件频次计算功率调整量""" err = self.target_ratio - ratio delta = k_p * err # 事件过多时额外降功率,保护焊接过程 if event_count > 3: delta -= 150 * event_count # 限幅,防止参数突变 delta = max(-300, min(300, delta)) return max(self.power_min, min(self.power_max, base_power + delta))这个原型里需要注意的细节是:特征频带能量占比的计算用在线因果滤波实现,不能直接套用离线数据里常用的零相位滤波函数,否则会出现未来信息泄漏的问题,这部分我在下一章踩坑部分详细说。
4.3 参数整定与试运行流程
原型系统搭建完成后,最关键的一步不是写代码,而是整定特征频带、目标区间和控制参数。我整理了一套相对省时间的试运行流程:
第一步,参数扫描试焊。固定焊接速度,功率从低到高按台阶变化,每种功率下焊一段。同步采集同轴光信号,记录功率和信号数据。
第二步,特征带自动识别。对各段信号做频谱分析,找出小孔稳定段与不稳定段差异最大的频带,作为特征频带。也可以让算法自动扫描,选择区分度最高的频带组合,这本身就是一种“自编程”。
第三步,确定目标区间。把低功率段(热传导焊)和高功率喷射段的特征频带能量占比都统计出来,取稳定深熔焊段的占比作为目标值,划定上下限。
第四步,闭环试运行。先用保守的控制参数(较小的Kp)跑一段平焊,观察功率调节过程是否平顺,再逐步加大调节力度,直到发现控制的响应速度和稳定性达到平衡。
整个过程说起来快,实际操作至少需要大半天时间。但好处是一旦标定完成,这套参数可以长期复用,换相同材料相同板厚时几乎不用重新调。而且标定的数据积累下来,还能反过来训练更好的预测模型,让小孔演化的自编程越用越准。
5. 现场实战中的坑:几个差点让系统翻车的案例
5.1 光学窗口被飞溅污染引发的功率疯涨
这套系统第一次上现场做长焊缝试验的时候,出现过一个特别诡异的现象:焊到后半段,系统不断输出提高功率的指令,功率一路顶到设定上限,焊缝表面状态却越来越差,最后保护镜片直接烧裂了。
事后复盘发现问题出在光学窗口污染。同轴观察窗的镜片在焊接过程中被飞溅和金属蒸气污染,透光率持续下降,光电二极管接收到的光强也随之下降。算法把“光强下降”错误地解读为“小孔收缩”,判断需要提功率来重新建立小孔,于是功率被越拉越高,而功率提高带来的飞溅更多,污染更重,形成恶性循环。
这件事给我两个教训。第一,自编程系统的光学链路必须加强抗污染设计,比如窗口前端增加气帘,使用可换式保护玻璃,定期做光学校准。第二,算法里必须加入慢漂移校正机制,用长时间尺度的中位数作为基准,把传感器灵敏度漂移从真正的物理信号变化中剥离出来。从那以后,我在系统里加了一个10s尺度的基准跟踪模块,这类问题就没再发生过。
5.2 飞溅尖峰污染频带能量特征
小孔喷发产生的飞溅,会在光电信号上形成非常尖锐的短脉冲。如果用频谱来分析,这种尖峰脉冲的能量会散布到很宽的频带里,污染特征频带的能量计算,导致“稳定性得分”出现虚假偏高。
第一次遇到这个问题时,我在在线监控界面上看到特征频带能量占比剧烈波动,但对应时间点的焊缝切片并没有发现明显缺陷,说明算法判断出错了。排查了传感器和滤波逻辑,最后才想到是飞溅尖峰在作祟。
解决方案是增加事件脉冲的剔除逻辑:先基于MAD阈值检测尖峰事件,把存在事件污染的窗口段标记出来,在频带能量计算时只使用剔除事件后的信号;或者采用鲁棒统计量作为频带能量估计,降低少数极端值的影响。这个思路也适用于其他强干扰环境,比如焊接接头间隙变化引起的突发信号。
5.3 换材料之后特征频带完全失效
系统在2mm不锈钢上调试得很顺,特征频带设在300Hz~2500Hz,稳定性判据也很可靠。后来直接拿去试8mm碳钢,开焊就乱了,系统一会儿判定“小孔过强”降功率,一会儿判定“小孔收缩”提功率,输出功率来回抖动,焊缝比不用系统时还差。
原因不复杂:小孔的振荡特征和材料的导热系数、表面张力、金属蒸气的电离特性密切相关。铝、钢、镍基合金的导热和蒸发特性差异很大,小孔的固有振荡频带自然不同。在一种材料上标定的特征带,拿到另一种材料上完全不适用。
这提醒我,自编程系统必须自带“初始化标定”流程,不能假设参数可以跨材料复用。所以后来我开发了一个自动频带扫描功能:开始焊接的前2秒,用宽频带频谱分析自动识别当前材料的特征峰,动态确定特征频带,再进行闭环控制。把“人工标定”变成“自动标定”,这才是真正完整的自编程。
5.4 控制带宽过高引发的参数振荡
这个坑比较隐蔽,处理起来花了不少时间。系统在小信号层面一切正常,但把控制带宽调高之后,发现功率输出开始出现周期性振荡,振荡频率在几赫兹到十几赫兹之间,不太快也不太慢,但持续不断。
分析下来,问题出在控制带宽和过程动态特性的耦合上。小孔本身是一个高频振荡系统,而熔池的热惯量和激光器功率响应又引入了中频动态环节。如果控制器的调节频率与这些环节的固有特性发生共振,整个闭环就会进入自激振荡状态,表现为参数输出来回抖动,焊接质量急剧恶化。
解决方法是把控制器设计成“趋势控制”模式:用低通滤波后的慢变量做反馈,设置调节死区,只有当稳定性指标偏离目标超过一定范围时才调整参数;调节量也做平滑处理,避免阶跃式突变。把有效控制带宽压到20Hz以下后,系统立刻稳定下来。这也是一条普适经验:自编程的控制频率,永远不要试图跟小孔自身的动态频率比快,你只需要比它慢半拍地引导它就行。
5.5 在线滤波相位泄漏:一个非常隐蔽的信号处理坑
最后说一个可能只有亲手写过在线信号处理代码的人才能共鸣的坑。我们在调试时发现,系统偶尔会在信号突变发生之前就开始调整参数,表现得很“未卜先知”。刚开始以为是有延迟补偿逻辑起了作用,后来才发现这其实是一个bug。
原因是初期代码里直接使用了离线数据处理的零相位滤波(比如scipy的filtfilt),这种滤波会利用整个序列的未来数据来消除相位偏移。离线分析没问题,但放在在线滑窗里,相当于用了一部分“未来窗口”的信息,导致控制指令比真实物理变化提前了一拍。当时控制周期很短,这个问题没有被立刻察觉,但表现在实际焊接过程中,系统会出现“乱调参数”的现象——信号还没变呢,功率先动了。
正确的做法是在线因果滤波,比如scipy.signal.sosfilt,它引入的相位延迟是固定的,物理上也是合理的。如果你非要补偿相位,也只能用状态观测器或预测算法来做,不能靠引用未来数据来“开挂”。这个细节写出来,是希望后来的人少走这个弯路。
整套系统走到今天,已经能稳定地实现“自动感知小孔演化-自动调整工艺参数-自动恢复稳定状态”的闭环控制。我个人的体会是,激光焊自编程技术的难点,其实不在算法多先进,而在于对物理过程的理解够不够细、对现场干扰的估计够不够充分、对传感器和执行器的“脾性”摸得够不够透。把这几点做到位了,所谓自编程并不是科幻概念,它就是老师傅经验的一种工程化表达。