很多搞结构强度的人,第一次接触结构健康监测(SHM)时,总会先问一句:这玩意和传统的无损检测到底差在哪?传统NDT(无损检测)是拿着超声/射线设备去做"定期体检",结构停用、探头接触、人工判读,一样都不能少。而SHM要解决的是"随飞行器一起服役"的原位监测,传感器贴上之后就不拆下来,实时看着损伤从萌生到扩展。这个转变听着简单,真正做起来,难点全在"怎么从大把信号里稳稳地把损伤位置和程度提取出来"。
我这些年做过不少基于振动、阻抗和导波的监测试验,最后发现最适合工程落地、也最容易做到"数据驱动"的一条路线,就是用兰姆波(Lamb波)响应来做损伤识别。原因后面会细说。这篇文章以"航空航天结构高效损伤检测"为背景,完整梳理一套基于选定位置引导式兰姆波响应的数据驱动SHM方法,包括原理、特征提取、损伤定位建模,以及Matlab代码实现。适合正在做健康监测课题、想从理论快速过渡到试验数据处理,或者需要在一堆实测信号里找到损伤判据的工程师和研究生参考。
1. 为什么航空航天结构健康监测要选中兰姆波这条路
1.1 从定期体检到原位监测的转变
传统无损检测最大的问题不是灵敏度不够,而是"测一次太麻烦"。大型飞机蒙皮、复材壁板、蜂窝夹层结构,表面大、曲率复杂,每次都要人工逐点扫查,不但费时,很多部位还根本够不着。SHM的思路是让结构自己"带传感器上岗",把传感器网络永久集成在关键区域,通过长期对比响应信号的变化来判断结构有没有异常。
原位监测看起来只是换了个测试方式,实际上改变了整个数据分析的逻辑。传统NDT每次检测都是独立事件,超声回波走到哪、反射多强,直接对应缺陷在哪、多大。而SHM必须依赖"时间维度上的前后对比",传感器粘贴位置固定以后,结构健康时有一批基准信号,后续采集的信号和基准产生偏差,这个偏差才是损伤的"指纹"。
1.2 兰姆波的两个独特优势
兰姆波是在板类结构里传播的弹性导波,非常适合大范围薄壁结构。它的好处有两个:
- 覆盖面大:一次激励产生的兰姆波可以沿板面传播几十厘米甚至更远,一个传感器对能覆盖大片区域,这对航空航天的大面积薄板结构太友好了。
- 对损伤敏感:结构上出现裂纹、腐蚀、脱粘,哪怕是截面尺寸上很小的变化,都会改变波的传播路径、散射、模式转换和能量衰减。所以兰姆波响应里携带的损伤信息量非常丰富。
但是兰姆波也有让人头疼的毛病:多模态、频散、边界反射、环境扰动敏感。同一个频率下可能同时存在S0和A0两种对称/反对称模式,不同频率传播速度还不一样。直接看原始波形很难判断哪段是损伤散射,哪段是边界反射。所以就有了"数据驱动"的用武之地——不再人工去细扣每一个波包,而是把大量传感响应的统计特征交给模型去学,让模型自动发现"健康"和"损伤"之间的非线性关系。
1.3 数据驱动在这里解决什么问题
传统特征提取方法一般只盯着一到两个参数,比如飞行时间或幅值衰减。但实际结构中,损伤散射信号常常和边界反射、模式转换混在一起,单一特征很容易被环境噪声带偏。数据驱动的方法则把多个传感通道、多个特征同时纳入,形成一个高维损伤指纹向量,再通过回归或分类模型从高维特征映射到损伤位置和程度。
换句话说,数据驱动不是把物理机理丢掉,而是"物理机理提供特征方向,模型负责拟合复杂映射"。兰姆波传播的全部复杂性,最终体现在响应波形数据上;模型要学的,就是波形数据里哪些指标组合最能说明问题。
2. 损伤位置和程度怎么从波形里“算”出来
2.1 损伤敏感特征的选择
从每一条兰姆波响应里,我一般先提取五类特征。这个组合不是拍脑袋定的,而是综合了文献和多次试验经验,覆盖了波的"幅值、相位、能量、形态"四个维度的变化:
| 特征类别 | 具体计算方式 | 对损伤的敏感性 |
|---|---|---|
| 幅值类 | 响应峰值、峰值与基线峰值之比 | 损伤遮挡/散射导致幅值下降 |
| 能量类 | 时域能量、均方根RMS | 能量衰减,和损伤大小相关度高 |
| 到时类 | 包络峰值对应的到达时间差 | 损伤引起的波速变化/散射路径变化 |
| 相关类 | 响应与基线的互相关系数 | 波形形态改变,相关系数下降 |
| 频带类 | 特定频带能量占比、谱质心偏移 | 损伤处的频散/模式转换 |
提取时域能量时要注意积分窗口的选择。我通常取激励信号中心频率对应周期的3到5倍作为窗长,窗太大容易把后续边界反射的能量也包进去,窗太小又会漏掉损伤散射的主要成分。这个细节决定特征稳定性,后面还会再说。
2.2 基线对比与特征向量构造
数据驱动SHM里,"基线"是绕不开的概念。实际结构在健康状态下采集一批响应信号,这些信号就是基线。之后任意时刻采集的响应,减去基线响应的残差里就包含了损伤带来的新增散射。但直接做时间域相减有个前提:信号要对齐。如果两次测量的触发时刻有微小的漂移,相减结果会出现巨大的假峰。
所以我在构造特征前,会用互相关做延迟对齐。以激励触发点为参考,把健康基线和当前响应的互相关峰值点对齐,再做相减。这一步虽然简单,却能滤掉大量由数据采集不同步引起的伪损伤特征。
经过对齐和相减后,对每一对激励-传感组合,我得到一个损伤特征向量:
D_i = [E_res, RMS_res, A_ratio, t_change, R_coeff, f_shift]如果结构上有M对收发组合,最终的特征向量就是M个D_i拼接起来的高维向量。这个向量就是数据驱动模型的输入。要注意的是,不同传感器组合的损伤敏感性差异很大,距离损伤近的通道特征变化剧烈,远的通道则基本没什么变化。这种"空间不均"恰恰是定位损伤的关键信息。
2.3 回归模型的输入输出设计
损伤定位和程度评估,我习惯建一个回归模型:输入是多通道特征向量,输出是二维坐标(x, y)和损伤程度d。损伤程度可以用实际缺陷的等效尺寸或面积来标注,试验中用冲击损伤、模拟裂纹时,标注值可以从试件破坏后解剖测得。
这里有一个容易犯的错误:把损伤位置当作分类问题。如果结构上损伤可能出现在任意位置,分类标签是有限的点,模型只能输出离训练点最近的标签,定位精度天然受限。回归输出连续坐标才是正确的打开方式。
对于训练数据,可以用有限元仿真(比如用ABAQUS模拟兰姆波传播)补充大量损伤工况,也可以用试验件打一批不同位置、不同尺寸的损伤,将响应特征和对应的标定位置组合成数据集。仿真数据和试验数据混用时要小心,后面有一节专门讲这个问题。
3. Matlab实现:从激励信号到损伤特征
3.1 激励信号生成
兰姆波的激励信号不能像锤击那样用宽频冲击,否则会产生一堆模式,后面数据处理会非常痛苦。工程上最常用的是汉宁窗调制的正弦猝发(tone burst)信号。窄带激励能把能量集中在某个中心频率,尽量只激发S0或A0中一种优势模式。
生成信号的Matlab代码很简单:
fs = 10e6; % 采样率 10 MHz fc = 150e3; % 中心频率 150 kHz ncyc = 5; % 周期数 t_signal = (0:1/fs:ncyc/fc - 1/fs).'; win = hanning(length(t_signal), 'periodic'); excite = sin(2*pi*fc*t_signal) .* win;周期数的选择是个权衡。周期少,频带更宽,有利于时间分辨率,但频散影响变大;周期多,频带窄,模式更纯,但时域上脉冲更长,损伤散射容易被激励波包本身淹没。我用5~8个周期的经验比较多,中心频率则根据结构厚度和激励传感器的谐振特性来选。
3.2 传感响应预处理
试验采集到的原始信号,第一步是去均值、去高频噪声。去均值可以用detrend,去噪声我用巴特沃斯带通滤波器,带宽取中心频率两侧各约0.5倍,既能保留兰姆波有效成分,又能去掉电磁干扰。
[b_f, a_f] = butter(4, [0.6*fc, 1.4*fc]/(fs/2), 'bandpass'); resp_f = filtfilt(b_f, a_f, resp_raw); base_f = filtfilt(b_f, a_f, base_raw);注意要用filtfilt做零相位滤波。普通filter会有相位延迟,损伤特征里"到达时间"这一项会因此跟着偏移,虽然基线相减后偏移可能被部分抵消,但做高精度定位时,这种相位误差本身就是不可接受的。
3.3 损伤特征提取代码段
下面这段是我常用的核心特征提取函数,输入是滤波后的当前响应和基线响应,输出是这一通道上的特征值:
function DI = extract_feature(resp_f, base_f, fs, fc) % 延迟对齐 [r_corr, lags] = xcorr(resp_f, base_f, 'coeff'); [~, idx] = max(abs(r_corr)); shift = lags(idx); resp_al = circshift(resp_f, shift); % 残差和窗 nwin = round(5/fc*fs); % 5个中心频周期的窗长 res = resp_al - base_f; E_res = sum(res(1:nwin).^2) / fs; RMS_res = rms(res(1:nwin)); A_ratio = max(abs(resp_al(1:nwin))) / max(abs(base_f(1:nwin))); R_coeff = corrcoef(resp_al(1:nwin), base_f(1:nwin)); R_coeff = R_coeff(1,2); [~, lags_s] = envelope_match(resp_al, base_f); t_change = lags_s / fs; % 包络峰到时差 DI = [E_res, RMS_res, A_ratio, t_change, R_coeff]; end这里的envelope_match是我自己封装的希尔伯特包络互相关函数,核心逻辑是先用hilbert求包络,再对两段包络做互相关找时延。用包络算到时比直接用原始波形更稳健,因为兰姆波信号经过频散后载波相位的过零点对齐意义不大,包络峰才是能量传播到达的真正标志。
4. 损伤定位与程度评估的建模细节
4.1 网格化成像的思路
拿到每条传感路径的特征后,要做成可视化程度高的损伤概率图,我一般用网格化概率成像的思路。把监测区域划分成网格,每个网格点计算一个"该点存在损伤的可能性"数值,最后用热力图呈现。
最基础的做法是椭圆加权成像:对每一对收发组合,损伤位于某网格点时,会增加该组合的信号残差;残差越大,该网格点的概率权重越高。但这种方法对交叉传感路径较少的结构,成像结果会出现明显的伪影。
后来我改用数据驱动模型输出位置坐标后,再进行高斯核叠加得到概率图。模型先给出一个坐标估计,然后在这个坐标周围按不确定性叠加高斯分布,这样比单纯椭圆法更接近实际情况,特别是在边界区域,不会出现概率弥散到结构外部的情况。
4.2 数据集的划分与训练
回归模型的训练数据,我建议按"位置、程度、环境因素"三个维度来设计。位置要在整个监测区域均匀分布,不能只集中在中间区域;损伤程度要从微小损伤到大损伤都包含;环境因素里至少要有不同温度工况,否则模型在实验室正常温度下好用,结构服役温度一变就失灵。
损伤位置和程度的数据,可以通过三种来源获取:
- 有限元仿真:建立结构的兰姆波传播模型,批量模拟不同位置的散射信号,生成大量带标签数据。
- 试验件预制损伤:在结构上布置传感网络,用冲击、钻孔、开槽等方式制造已知损伤,实测采集响应。
- 逐步扩展损伤:模拟裂纹扩展过程,每扩展一次记录一次响应,这种数据对"程度评估"尤其宝贵。
模型选择上,我推荐先试高斯过程回归(GPR)。原因很实际:SHM的试验数据通常不会太多,GPR在小样本下表现稳定,还能给出预测置信区间。如果你的数据量到了几千组,再上神经网络也不迟。输入特征维度高时,先做标准化和主成分压缩,不然很多回归模型的收敛会受无关特征干扰。
X_train = Zscore(X_train_raw); % 特征标准化 X_test = Zscore(X_test_raw); mdl = fitrgp(X_train, Y_train, 'KernelFunction', 'squaredExponential', ... 'Standardize', false, 'Verbose', 1); [predY, predSD] = predict(mdl, X_test);标准化的均值和方差必须只用训练集计算,再把同样的参数应用到测试集。如果拿全部数据一起做标准化,测试集信息已经泄漏进了模型,最后评估出来的精度会虚高,这是很多人容易忽略的坑。
4.3 结果验证指标
损伤定位的结果,一般用定位误差来评估:
定位误差 = sqrt((x_pred - x_true)^2 + (y_pred - y_true)^2)损伤程度评估,则看预测尺寸和实测尺寸的相对误差。但要注意,损伤尺寸的定义会影响结果。兰姆波响应对"损伤引起的截面刚度变化"敏感,而不是对视觉上的裂纹长度敏感,同一长度的裂纹,开口宽度不同,响应特征可能差很多。因此数据标注最好用等效损伤面积,或者用超声C扫描实测的损伤区域边界来定义,比较可复现。
评估模型时我还会看预测置信区间。GPR给出的置信区间如果在大损伤时变宽,这说明数据里大损伤样本太少,需要补充样本,而不是模型本身差。置信区间的变化本身就是数据质量的晴雨表。
5. 真正上结构之前必须踩过这些坑
5.1 温度变化伪装成损伤
这是SHM落地的第一杀手。兰姆波传播速度随温度变化很明显,温度升高,波速降低,传播到时变长。如果基线是20度采集的,结构到40度时,信号会出现明显的相位偏移和幅值变化,特征提取后就和"损伤"非常像。
我处理过的最典型情况:结构没损伤,温度变了20度,残差能量直接翻了十几倍。解决思路有三个:
- 温度补偿:建立温度-特征变化曲线,把当前温度下的响应先"归一化"到基线温度。
- 水印方法:在激励信号前加一个低频"水印"信号,通过水印的到时变化估计温度影响,再从损伤特征里扣除。
- 环境特征协同输入:把温度传感器读数作为模型的一个输入特征,让模型自己学会区分"温度变化"和"损伤变化"。
第三种方法在数据驱动框架下最自然,也最省事,前提是你的训练数据必须包含足够宽的温度变化范围。
5.2 模式混叠与传感器布置
兰姆波最讨厌的问题是A0和S0模式混叠。同样的传播距离,两种模式波速不同,先后到达传感器,测试者如果把两种模式一起当作特征,不同模式对温度、损伤的响应规律也不同,模型很难学。
所以传感器布置要考虑截止频率和激励选择。薄板中,A0模式波速低、幅值大,能量集中在低频,对表面损伤和裂纹非常敏感;S0模式波速快、频散小,对厚度减薄和脱粘更敏感。实际应用里不要贪心一次激发两到三种模式,就盯住一种优势模式处理,另一个模式的波包在特征提取阶段用时间窗尽量排除掉。
传感器数量也不是越多越好。过多传感器让特征维数剧增,训练数据需求量随之大增。我常用的做法是先做灵敏度分析:逐个统计每条传感通道对已知损伤的响应幅值变化,把那些对损伤不敏感、只对边界反射敏感的通道剔除,保留8到16条高价值通道,足够覆盖一块常见尺寸的蒙皮面板。
5.3 训练数据不足怎么兜底
航空航天结构上做大量破坏性损伤试验,成本极高。训练数据不足是常态,不是例外。兜底策略我从两个方向走:
一是仿真与实验混合扩充。先用有限元仿真批量生成覆盖各种损伤位置的响应特征,训练一个"粗模型";再用少量试验数据对粗模型做迁移校准,把仿真和试验之间的系统偏差修正掉。这种方法比直接只用仿真数据靠谱得多,因为纯仿真模型的精度受边界条件、传感器耦合一致性影响太大。
二是半监督思路。在没有损伤标签的服役响应数据里,先用无监督异常检测挑出"和健康基线差异明显"的信号,再对这些疑似损伤信号打标签。这虽然不能直接定位,但能节省大量排查时间。
5.4 从实验室试件到实际部件
实验室里的平板试件和真实机翼壁板差别巨大。真实结构上有铆钉、加强筋、变厚度区、开口,兰姆波在这些结构特征上一样会产生散射和模式转换。同一个损伤特征,在平板上很好定位,上真实结构后误报率可能高到没法用。
我参与的某次验证试验就是从平板结构转到带加强筋的模拟壁板,一开始直接套用平板训练好的模型,定位误差大了将近一倍。后来重新梳理了传感路径,把经过加强筋区域的通道单独建模,不把它们和普通区域混在一起训练,效果才明显改善。
所以我的建议是:在做系统方案时,预留"区域化建模"的余地。传感器网络要按结构特征分区,铆接区、无筋区、缘条区各自独立建模,不要指望一个全局模型吃遍全部真实结构。因为兰姆波传播路径上每遇到一个结构特征就会发生一次散射,不同结构区域的转换规律完全不同,全局模型容量再大也学不过来。
最后再分享一个调试小技巧:所有特征提取代码,在最初联调阶段先不要追求复杂的机器学习模型。用最简单的"健康-损伤二分类逻辑"把所有通道特征画一遍散点图,看看损伤样本和健康样本是不是可分。如果可视化的第一步就分不开,那后面上什么模型都是白搭;只有先确认特征本身有区分度,再用数据驱动模型去逼近损伤位置和程度,整个流程才有意义。