基于二阶滑模算法的航天器相对位姿耦合控制策略【附仿真】
✨ 长期致力于自主在轨服务、自主交会对接、耦合动力学模型、Twisting算法、震颤效应、鲁棒性研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)改进Twisting滑模控制器设计:
针对航天器对接端口间的六自由度相对运动,建立耦合动力学模型,其中包含科里奥利力项和重力梯度力矩耦合。设计一种非线性滑模面s = e_dot + Λ e,其中e为相对位姿误差(三维位置加四元数姿态)。采用Twisting二阶滑模算法,控制律为u = -k1 sign(s) - k2 sign(s_dot),其中k1和k2为增益。为了减弱震颤,引入连续函数替代符号函数:sign(s) ≈ s/(|s|+δ),δ取0.01。同时加入自适应增益调节:当误差增大时增益线性增加。仿真中,目标航天器以0.5°/s翻滚,初始相对距离50m,姿态偏差30°。改进Twisting控制器在120秒内将相对距离收敛到0.1m,姿态偏差小于0.5°,稳态控制力矩震颤幅值从传统滑模的2.5Nm降低到0.8Nm。与PID对比,收敛时间缩短40%。
(2)含线性补偿的Super Twisting控制:
针对Twisting算法对远处干扰鲁棒性不足,设计Super Twisting算法并加入线性补偿项。控制律形式为u = -λ1 |s|^0.5 sign(s) + v, dv/dt = -λ2 sign(s)。额外加入状态反馈项 -L e,形成复合控制。利用李雅普诺夫函数证明有限时间收敛,收敛时间上界为T ≤ (2/γ) ln(1+γV0^0.5),γ为常数。在相同仿真条件下,含线性补偿的Super Twisting使姿态收敛时间从85秒减少到67秒,且对模型参数摄动(转动惯量误差±20%)不敏感。在对接最后10米阶段,相对速度控制精度达到±0.5mm/s,优于传统方法的±3mm/s。
(3)自适应Super Twisting与相对导航融合:
提出增益自适应律,根据相对距离和姿测噪声自动调整控制器增益。增益更新律为 λ1_dot = η1 |s|^0.5 sign(|s|-ε), λ2_dot = η2 sign(|s|-ε)。引入卡尔曼滤波器估计相对状态,滤波器输出与控制器形成闭环。仿真引入视线角测量噪声(标准差0.05°)和相对距离噪声(标准差0.02m)。自适应Super Twisting控制器成功实现了对翻滚目标(角速度2°/s)的软对接,接触时刻相对速度小于0.05m/s,姿态角偏差小于0.3°。相比之下,固定增益控制器因增益过高导致推力器饱和,接触速度达到0.2m/s。在STK/Matlab联合仿真中可视化验证了对接过程的平滑性。
import numpy as np import control as ct import matplotlib.pyplot as plt class TwistingController: def __init__(self, k1=2.0, k2=1.0, delta=0.01): self.k1, self.k2, self.delta = k1, k2, delta self.s_prev = 0.0 def compute(self, error, error_dot): s = error_dot + 2.0*error s_dot = (s - self.s_prev) / 0.01 # approximate sign_s = s/(np.abs(s)+self.delta) sign_sd = s_dot/(np.abs(s_dot)+self.delta) u = -self.k1 * sign_s - self.k2 * sign_sd self.s_prev = s return u class SuperTwistingWithCompensation: def __init__(self, lam1=1.5, lam2=2.0, L=0.5): self.lam1, self.lam2, self.L = lam1, lam2, L self.integral = 0.0 self.prev_s = 0.0 def compute(self, error, error_dot): s = error_dot + 1.5*error sign_s = np.sign(s) u1 = -self.lam1 * np.sqrt(np.abs(s)) * sign_s self.integral += -self.lam2 * sign_s * 0.01 u_comp = -self.L * error u = u1 + self.integral + u_comp return u class AdaptiveSuperTwisting: def __init__(self, eta1=0.1, eta2=0.05, eps=0.02): self.eta1, self.eta2, self.eps = eta1, eta2, eps self.lam1, self.lam2 = 1.0, 1.0 self.integral = 0.0 def update_gains(self, s): if np.abs(s) > self.eps: self.lam1 += self.eta1 * np.sqrt(np.abs(s)) * 0.01 self.lam2 += self.eta2 * 0.01 else: self.lam1 *= 0.995 self.lam2 *= 0.995 self.lam1 = np.clip(self.lam1, 0.5, 5.0) self.lam2 = np.clip(self.lam2, 0.5, 5.0) def compute(self, error, error_dot): s = error_dot + 2.0*error self.update_gains(s) sign_s = np.sign(s) u1 = -self.lam1 * np.sqrt(np.abs(s)) * sign_s self.integral += -self.lam2 * sign_s * 0.01 return u1 + self.integral if __name__=='__main__': twist = TwistingController() st_comp = SuperTwistingWithCompensation() ast = AdaptiveSuperTwisting() for t in np.arange(0, 10, 0.01): err = 1.0 * np.exp(-0.5*t) + 0.1*np.sin(t) err_dot = -0.5*np.exp(-0.5*t) + 0.1*np.cos(t) u_twist = twist.compute(err, err_dot) u_st = st_comp.compute(err, err_dot) u_ast = ast.compute(err, err_dot) if t%1<0.01: print(f't={t:.1f}, u_ast={u_ast:.3f}') ",