✨ 长期致力于故障重构、卫星姿态控制系统、学习观测器、未知输入观测器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅ 如需沟通交流,点击《获取方式》
(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)
",

544

被折叠的 条评论
为什么被折叠?



