✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)电液负载敏感先导控制系统的硬件设计与参数匹配:
针对履带式工程机械底盘,设计了一款单泵驱动双马达的电液负载敏感先导控制系统。系统核心元件包括永磁同步电机、变量柱塞泵、电磁比例减压阀、主控换向阀、电磁比例压力补偿阀以及摆线马达。双马达回路采用并联供油方式,通过压力补偿阀保证两马达入口压差恒定,从而实现负载无关的流量分配。根据底盘直行时速18km/h和转向时内外侧轮速差等指标,计算了马达最大转矩需求为450Nm,并据此选择了排量为80cc/rev的马达和额定压力28MPa的泵。电磁比例减压阀的控制电流设定在200mA到800mA范围对应先导压力0-3MPa,死区电流为180mA,增益系数经实测为0.006MPa/mA。整个系统的AMESim仿真模型经过部件标定后,与实测数据在稳态点误差小于3%。
(2)模糊PID控制器设计与联合仿真:
针对底盘直行时左右马达转速同步与转向时的轨迹跟踪问题,分别设计了模糊PID控制器。模糊PID的输入为转速误差和误差变化率,输出为PID三个参数的增量。隶属度函数采用三角形分布,每个输入划分为七个模糊子集(NB,NM,NS,ZO,PS,PM,PB)。模糊规则库基于69条经验规则,比如当误差大且误差变化率为正大时,大幅度增加比例系数并减小积分系数。在Simulink中搭建了模糊PID控制模块并将其与AMESim液压模型联合仿真。直行工况下分别测试并行式、主从式和交叉耦合式三种同步控制结构。交叉耦合式将左右马达的误差差值也纳入控制回路,使得同步误差峰值从并行式的45rpm降低到12rpm。加入模糊PID后超调量从传统PID的23%降至8%,负载突变时转速最低点提高了17%。
(3)四种控制算法的对比与最优策略确定:
对比了PID、模糊PID、BP神经网络PID以及麻雀搜索算法优化的PID共四种控制器。BP神经网络采用3-6-3结构,在线调整PID参数;麻雀搜索算法以ITAE指标为目标函数在参数空间寻找最优组合。仿真结果显示在直行阶跃响应中,模糊PID的上升时间0.32s,调节时间0.54s,均优于BP-PID(0.38s/0.71s)。在转向工况下,模糊PID在小半径转向时的路径跟踪偏差平均为0.18m,而BP-PID为0.26m。最终选择模糊PID作为主控制器,并为其增加了负载前馈补偿模块,在负载从0突加至满负载时转速波动小于5%,验证了该策略在工程底盘行驶控制中的优越性。
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl import matplotlib.pyplot as plt # 模糊PID控制器定义 error = ctrl.Antecedent(np.arange(-100, 101, 1), 'error') error_dot = ctrl.Antecedent(np.arange(-200, 201, 1), 'error_dot') kp_out = ctrl.Consequent(np.arange(0, 10.1, 0.1), 'kp') ki_out = ctrl.Consequent(np.arange(0, 1.01, 0.01), 'ki') kd_out = ctrl.Consequent(np.arange(0, 2.01, 0.01), 'kd') error['NB'] = fuzz.trimf(error.universe, [-100,-100,-50]) error['ZO'] = fuzz.trimf(error.universe, [-10,0,10]) error['PB'] = fuzz.trimf(error.universe, [50,100,100]) error_dot.automf(3) kp_out.automf(3); ki_out.automf(3); kd_out.automf(3) rule1 = ctrl.Rule(error['NB'] & error_dot['NB'], kp_out['NB'], ki_out['ZO'], kd_out['PS']) rule2 = ctrl.Rule(error['ZO'] & error_dot['ZO'], kp_out['ZO'], ki_out['ZO'], kd_out['ZO']) rule3 = ctrl.Rule(error['PB'] & error_dot['PB'], kp_out['PB'], ki_out['NB'], kd_out['NB']) pid_ctrl = ctrl.ControlSystem([rule1,rule2,rule3]) fuzzy_pid = ctrl.ControlSystemSimulation(pid_ctrl) def compute_pid_gains(e, ed): fuzzy_pid.input['error'] = e fuzzy_pid.input['error_dot'] = ed fuzzy_pid.compute() return fuzzy_pid.output['kp'], fuzzy_pid.output['ki'], fuzzy_pid.output['kd'] # 联合仿真中的调用示例 class HydraulicPlant: def step(self, u): return np.random.randn() # 简化模型 plant = HydraulicPlant() pid_state = {'integral':0.0, 'prev_error':0.0} for t in range(1000): ref = 1000.0 if t<500 else 500.0 meas = plant.step(pid_state.get('u',0)) e = ref - meas; ed = e - pid_state['prev_error'] kp,ki,kd = compute_pid_gains(e, ed) pid_state['integral'] += e * 0.01 u = kp*e + ki*pid_state['integral'] + kd*ed u = np.clip(u, -10, 10) pid_state['u']=u; pid_state['prev_error']=e如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇