ROV液压推进系统非线性特性及抗干扰控制【附代码】
✨ 长期致力于深海作业型ROV、液压推进系统、推力分配、模糊系统、干扰力补偿研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1分段逼近与初始压强注入的非线性校正针对比例阀压差控制型液压推进系统在小输入信号下存在的死区和滞环非线性提出添加初始压强方法。在马达两端并联两个先导式单向阀预设0.3MPa的初始压差使得阀芯零位附近仍然产生流动。将推力-控制电压特性曲线分为三段:0~0.8V为微推力区采用指数拟合;0.8~3V为线性区;3V以上为饱和区。使用分段最小二乘法确定各段参数。在深海模拟舱测试校正后最小可控推力从原来的120N降低至28N死区宽度缩小67%。对于伺服阀排量控制型系统采用脉冲宽度调制启动策略当指令信号低于死区阈值时输出一系列占空比从10%递增的脉冲使马达逐步克服静摩擦死区时间从0.8s缩短到0.2s。2正反向等比例推力分配与基于遗传算法的死区补偿考虑到螺旋桨正反向最大推力不相等(正向850N反向620N)提出改进的伪逆推力分配算法在分配矩阵中加入非对称饱和约束。设计正反向等比例分配策略当总推力需求为正时优先正向螺旋桨负时优先反向避免反向螺旋桨饱和。对于由死区引起的分配误差利用遗传算法离线优化补偿参数将死区模型近似为一阶惯性环节反向传播补偿值到控制量。在六自由度ROV仿真中分配误差从15%降至3.2%。同时考虑推进器布局的非正交性采用加权伪逆法实现力矩优先分配保证横摇和纵摇控制优先于航向。3模糊逻辑系统干扰力补偿与水池实验将ROV动力学模型中未知水动力系数、缆绳干扰、洋流扰动集总为干扰项利用模糊逻辑系统在线逼近。设计两个模糊系统一个用于逼近时变干扰力另一个用于逼近科里奥利向心力不确定性。输入变量为速度误差和速度误差积分每个输入定义5个高斯隶属度函数规则库通过自适应律在线更新。控制器采用反步法设计稳定性分析证明跟踪误差最终有界。在深海高压舱(压力10MPa)进行推进器性能测试并搭建ROV水池实验平台。在模拟1节流速干扰下传统PID深度误差达到±0.35m本控制器误差±0.08m。航向控制实验中加入推力分配后艏向角震荡幅度减少52%。实验验证了模糊系统能够补偿约78%的未知干扰。import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl class ThrustAllocation: def __init__(self, max_thrust_fwd850, max_thrust_rev-620): self.max_fwd max_thrust_fwd self.max_rev max_thrust_rev def allocate_pseudo_inv(self, tau, config_matrix): # tau: [surge, sway, yaw] desired forces B config_matrix # 3x4 matrix B_pinv np.linalg.pinv(B) u_raw B_pinv tau for i in range(len(u_raw)): if u_raw[i] 0: u_raw[i] min(u_raw[i], self.max_fwd) else: u_raw[i] max(u_raw[i], self.max_rev) return u_raw def equal_ratio_allocation(self, tau_surge): if tau_surge 0: ratio np.clip(tau_surge/self.max_fwd, 0, 1) return np.array([ratio*self.max_fwd, 0, ratio*self.max_fwd, 0]) else: ratio np.clip(tau_surge/self.max_rev, -1, 0) return np.array([0, ratio*self.max_rev, 0, ratio*self.max_rev]) class FuzzyCompensator: def __init__(self): self.error ctrl.Antecedent(np.arange(-1,1,0.01), error) self.error_dot ctrl.Antecedent(np.arange(-0.5,0.5,0.01), error_dot) self.comp ctrl.Consequent(np.arange(-100,100,1), compensation) self.error[N] fuzz.trimf(self.error.universe, [-1,-0.5,0]) self.error[Z] fuzz.trimf(self.error.universe, [-0.5,0,0.5]) self.error[P] fuzz.trimf(self.error.universe, [0,0.5,1]) self.error_dot[N] fuzz.trimf(self.error_dot.universe, [-0.5,-0.25,0]) self.error_dot[Z] fuzz.trimf(self.error_dot.universe, [-0.25,0,0.25]) self.error_dot[P] fuzz.trimf(self.error_dot.universe, [0,0.25,0.5]) self.comp[NL] fuzz.trimf(self.comp.universe, [-100,-75,-50]) self.comp[NS] fuzz.trimf(self.comp.universe, [-60,-30,0]) self.comp[Z] fuzz.trimf(self.comp.universe, [-20,0,20]) self.comp[PS] fuzz.trimf(self.comp.universe, [0,30,60]) self.comp[PL] fuzz.trimf(self.comp.universe, [50,75,100]) rules [ ctrl.Rule(self.error[N] self.error_dot[N], self.comp[NL]), ctrl.Rule(self.error[P] self.error_dot[P], self.comp[PL]), ctrl.Rule(self.error[Z] self.error_dot[Z], self.comp[Z]), ] self.ctrl_sys ctrl.ControlSystem(rules) self.sim ctrl.ControlSystemSimulation(self.ctrl_sys) def compensate(self, e, ed): self.sim.input[error] e self.sim.input[error_dot] ed self.sim.compute() return self.sim.output[compensation] if __name__ __main__: alloc ThrustAllocation() B np.array([[1,1,1,1],[0,1,0,-1],[0.2,-0.2,0.2,-0.2]]) # example config matrix tau np.array([300, 50, 20]) u alloc.allocate_pseudo_inv(tau, B) print(fAllocated thrusts: {u}) fuzzy FuzzyCompensator() comp fuzzy.compensate(0.15, 0.02) print(fFuzzy compensation: {comp:.2f} N)