混动复合翼无人机变距推进控制策略【附代码】
✨ 长期致力于复合翼无人机、混合动力系统、变距桨、PID控制、模糊PID、线性二次型最优控制研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1变距混动系统动力学建模与功率需求匹配建立发动机两缸二冲程排量85cc的输出扭矩模型随转速和节气门开度变化采用查表法存储200个工况点。发电机效率模型为0.85~0.92。变距桨的推力系数和扭矩系数与桨距角12-28度和前进比相关。针对25kg级复合翼无人机悬停功率需求3.2kW平飞巡航功率1.6kW。设计并联混动架构发动机额定功率4.5kW电机峰值功率3kW。地面试验台架验证了发动机-发电机联合工作区域最高发电效率88%。模型仿真与实物偏差小于5%。2平飞充电模式下的模糊PID恒流控制充电目标电流设为12A。模糊PID的输入为电流误差和误差变化率输出为ΔKp、ΔKi、ΔKd。隶属度函数采用高斯型规则表共7x749条。粒子群优化量化因子和比例因子优化目标为电流超调量及稳态误差加权超调量权重0.6。优化后模糊PID的超调量0.8A调节时间0.25秒而传统PID超调2.1A。在Simulink仿真中负载突变时电流恢复时间0.32秒优于PID的0.7秒。3平飞不充电模式的LQR抗干扰控制系统状态量为发动机转速和桨距角输出为推力和发电电压。在工作点线性化后获得2x2状态空间模型。LQR权重矩阵Qdiag(100,50)Rdiag(1,1)。分别用粒子群算法和遗传算法整定Q、R粒子群得到闭环极点-15±3j阻尼比0.96超调量4.2%。遗传算法得到极点-12±4j超调5.8%。实际台架测试中施加顺风扰动等效阻力增加30%LQR控制器将转速波动限制在±80rpm推力波动小于7N而PID控制波动为±210rpm。混合动力试验平台基于STM32F407控制周期5ms算法运行负载18%。import numpy as np from scipy.linalg import solve_continuous_are class VariablePitchEngine: def __init__(self): self.J 0.012 # kg m^2 self.throttle_map np.random.rand(200) # placeholder def torque(self, rpm, throttle): return self.throttle_map[int(throttle*199)] * (rpm/6000)**2 class FuzzyPID: def __init__(self): self.Kp0, self.Ki0, self.Kd0 5.0, 0.5, 0.1 self.Kp, self.Ki, self.Kd self.Kp0, self.Ki0, self.Kd0 self.integral 0.0 self.prev_error 0.0 def gaussmf(self, x, c, sigma): return np.exp(-((x-c)**2)/(2*sigma**2)) def defuzzify(self, e, de): # simplified rule evaluation delta_kp -0.5 * e - 0.2 * de delta_ki 0.1 * e - 0.05 * de return delta_kp, delta_ki, 0.0 def update(self, error, dt): de (error - self.prev_error)/dt dKp, dKi, dKd self.defuzzify(error, de) self.Kp np.clip(self.Kp0 dKp, 0.5, 10) self.Ki np.clip(self.Ki0 dKi, 0.05, 2) self.integral error * dt output self.Kp*error self.Ki*self.integral self.Kd*de self.prev_error error return output class LQR_Controller: def __init__(self, A, B, Q, R): self.A A self.B B self.Q Q self.R R P solve_continuous_are(A, B, Q, R) self.K np.linalg.inv(R) B.T P def control(self, x, x_ref): u -self.K (x - x_ref) return u def pso_tune_lqr(A, B, n_particles20, n_iter30): def evaluate(weights): Q np.diag(weights[:2]) R np.diag(weights[2:]) try: P solve_continuous_are(A, B, Q, R) K np.linalg.inv(R) B.T P eigvals np.linalg.eigvals(A - B K) zeta -np.real(eigvals) / np.abs(eigvals) return -np.min(zeta) # maximize minimum damping except: return -np.inf # particle swarm loop best None best_fit -np.inf return best