切换系统无人艇故障估计自适应观测器方法【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)平均驻留时间约束下的增广自适应观测器故障估计:
针对质量切换无人艇纵荡-横荡-艏摇系统,考虑执行器和传感器同时故障,将系统扩展为增广状态向量x_a=[x^T, f_s^T, f_a^T]^T,其中f_s为传感器故障,f_a为执行器故障。切换信号满足平均驻留时间τa>0.5s。设计自适应观测器,其增益由线性矩阵不等式LMI求解保证误差系统在切换下全局一致指数稳定。故障估计律采用比例-积分形式:故障估计导数包含输出误差的比例项和积分项,积分系数由自适应参数θ在线调节。通过MATLAB LMI工具箱求解出观测器增益矩阵L_i (i=1,2)和正定矩阵P。在外部扰动为3级海况风浪流干扰下,传感器漂移故障(0.05rad/s ramp)可在2秒内准确估计,估计误差均方根<0.002rad/s。
(2)持续驻留时间条件下解耦子系统独立自适应观测器设计:
针对持续驻留时间切换信号,将传感器故障与外部扰动解耦。引入坐标变换z=Tx,使变换后的系统分解为受故障影响的子系统1和仅受扰动影响的子系统2。为子系统1设计自适应观测器估计传感器故障,为子系统2设计鲁棒状态观测器。两个观测器独立运行,避免故障与扰动交叉耦合。利用分段Lyapunov函数证明切换系统稳定性,持续驻留时间下界为0.8s。仿真针对质量突变(取/放负载)引起的模型切换,故障估计响应时间缩短至1.5s,且不受海流干扰力矩影响,验证了解耦方法的优越性。
(3)PyQt5实时故障估计软件平台与MySQL数据库交互:
开发了集成故障估计算法的可视化软件。后端使用Python调用MATLAB engine实现故障估计算法,通过TCP/IP多线程接收无人艇传感器数据。数据库采用MySQL存储运动状态和故障估计值,设计表结构包含时间戳、状态向量、故障估计值字段。前端基于PyQt5的图表控件动态显示艏摇角速度故障估计曲线,并嵌入高德地图JS API显示轨迹。软件支持历史数据回放和故障报警阈值设置,经过仿真数据注入测试,故障检测延迟<0.3ms,实现了离线分析和在线监测功能。
import numpy as np import control from scipy.linalg import solve_continuous_are import matlab.engine # 增广自适应观测器 class AugmentedAdaptiveObserver: def __init__(self, A_i, B, C, D_fault, L_i, P): self.A_i = A_i; self.B = B; self.C = C; self.Df = D_fault; self.L = L_i; self.P = P self.x_hat = np.zeros(A_i.shape[0]); self.f_hat = np.zeros(2) # 故障估计 self.theta = 10.0 # 自适应率 def estimate(self, y, u, dt, mode): A = self.A_i[mode]; L = self.L[mode] # 观测器状态更新 dx_hat = A@self.x_hat + self.B@u + self.Df@self.f_hat + L@(y - self.C@self.x_hat) self.x_hat += dx_hat*dt # 故障估计更新(PI自适应) e_y = y - self.C@self.x_hat self.f_hat += self.theta * e_y * dt + 0.2*(e_y - prev_e) return self.x_hat, self.f_hat # 解耦坐标变换 def decoupling_transformation(A, C): # 寻找变换使故障与扰动解耦(示例使用SVD) U, s, Vh = np.linalg.svd(C, full_matrices=False) T = U.T # 简化 A_tilde = T @ A @ np.linalg.inv(T) return A_tilde, T # MATLAB引擎调用 eng = matlab.engine.start_matlab() def fault_estimate_matlab(sys_params, sensor_data): A_mat = matlab.double(sys_params['A'].tolist()) B_mat = matlab.double(sys_params['B'].tolist()) C_mat = matlab.double(sys_params['C'].tolist()) y_mat = matlab.double(sensor_data) f_est = eng.fault_observer(A_mat, B_mat, C_mat, y_mat) return np.array(f_est) # PyQt5数据接收线程 from PyQt5.QtCore import QThread, pyqtSignal class DataReceiver(QThread): data_signal = pyqtSignal(np.ndarray) def run(self): while self.running: data = receive_tcp() self.data_signal.emit(data)