基于电液负载敏感的工程底盘行驶模糊PID控制【附代码】
✅博主简介擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导毕业论文、期刊论文经验交流。✅ 如需沟通交流扫描文章底部二维码。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 t500 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如有问题可以直接沟通