✨ 长期致力于故障重构、卫星姿态控制系统、学习观测器、未知输入观测器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)改进P型学习观测器反作用飞轮失效故障重构:
针对微小卫星反作用飞轮失效故障(故障表现为输出力矩下降),设计一种改进P型学习观测器。将飞轮故障建模为效率因子乘性故障,系统状态方程扩展引入故障参数。学习观测器结构为:dx_hat/dt = Ax_hat + Bu + L1(y-Cx_hat) + L2*f_hat,其中f_hat通过迭代学习律更新:f_hat(k+1)=f_hat(k)+Γ(y-Cx_hat)。采用线性矩阵不等式求解观测器增益L1和L2,使得估计误差系统稳定。在MATLAB/Simulink中仿真,当飞轮效率在5秒内从1线性下降到0.6时,学习观测器在2秒内重构出故障值,误差小于0.02。与传统自适应观测器相比,重构速度提高30%且无需持续激励条件。
(2)增广PD型学习观测器用于陀螺故障重构:
将敏感器故障(恒偏差、漂移)转化为增广系统中的执行器故障。设计增广状态向量包含原状态和故障参数,然后构造PD型学习观测器,即输出估计包含比例项和微分项。观测器增益通过极点配置获得。针对三轴陀螺的常值漂移故障(0.1°/h),增广PD观测器在0.5秒内重构出故障值,而传统P型观测器需要1.2秒且存在稳态误差。对时变故障(斜坡漂移0.05°/h/s),PD型观测器估计误差最终小于0.01°/h,P型误差为0.03°/h。将观测器与容错控制结合,在故障发生后在线补偿,卫星姿态精度从0.05°恢复到0.01°。
(3)连续学习未知输入观测器抗干扰故障重构:
同时考虑干扰输入(太阳光压、地磁力矩)和执行器故障。设计未知输入观测器解耦部分干扰,剩余干扰通过H∞优化抑制。学习律采用投影修正保证故障参数有界。针对推力器完全失效故障,在干扰幅值0.01Nm的情况下,LUIO重构故障值的均方根误差为0.018,而常规学习观测器为0.045。在MATLAB仿真中,卫星运行于500km太阳同步轨道,一个推力器故障后,LUIO成功重构故障并切换至冗余推力器,姿态控制精度未受明显影响。算法在星载计算机(LEON3)上单步执行时间0.8ms,满足实时性要求。
import numpy as np from scipy.linalg import solve_continuous_lyapunov, solve import control class PTypeLearningObserver: def __init__(self, A, B, C, L1, L2, Gamma): self.A, self.B, self.C = A, B, C self.L1, self.L2, self.Gamma = L1, L2, Gamma self.x_hat = np.zeros((A.shape[0],1)) self.f_hat = np.zeros((L2.shape[1],1)) def step(self, y, u, dt): y_hat = self.C @ self.x_hat e = y - y_hat self.x_hat += dt * (self.A @ self.x_hat + self.B @ u + self.L1 @ e + self.L2 @ self.f_hat) self.f_hat += self.Gamma @ e return self.f_hat def design_pd_observer(A, C, Q, R): # PD observer gains via pole placement n = A.shape[0] p = C.shape[0] A_aug = np.block([[A, np.zeros((n,p))], [np.zeros((p,n)), np.zeros((p,p))]]) C_aug = np.hstack([C, np.eye(p)]) # place poles at -10 and -15 etc poles = np.concatenate([np.full(n, -10), np.full(p, -15)]) L = control.place(A_aug.T, C_aug.T, poles).T L1 = L[:n, :] L2 = L[n:, :] return L1, L2 class LearningUnknownInputObserver: def __init__(self, A, B, C, D, E, H_inf_gamma=1.0): self.A, self.B, self.C, self.D, self.E = A, B, C, D, E self.gamma = H_inf_gamma # compute UIO gains (simplified) self.N = np.linalg.pinv(self.E) if self.E.shape[0]==self.E.shape[1] else np.linalg.pinv(self.E.T @ self.E) @ self.E.T self.T = np.eye(A.shape[0]) - self.D @ self.N self.A_bar = self.T @ self.A self.C_bar = self.C @ self.T self.L = np.linalg.lstsq(self.C_bar, self.A_bar, rcond=None)[0] def estimate(self, y, u): z_hat = np.zeros((self.A.shape[0],1)) # simplified iteration x_hat = z_hat - self.N @ y f_hat = self.N @ (y - self.C @ x_hat) return x_hat, f_hat if __name__=='__main__': A = np.array([[-0.2,1],[-1,-0.2]]) B = np.array([[0],[1]]) C = np.array([[1,0]]) Gamma = np.eye(1)*0.5 L1 = np.array([[1],[2]]) L2 = np.array([[0.5],[0.5]]) obs = PTypeLearningObserver(A,B,C,L1,L2,Gamma) y = np.array([[1.0]]) u = np.array([[0.1]]) f_est = obs.step(y, u, 0.01) print('Estimated fault:', f_est) ",