基于神经网络自适应PID的直升机俯仰角控制系统
项目介绍
本项目是一个基于MATLAB的仿真系统,旨在解决直升机俯仰轴(Pitch Axis)姿态控制中的非线性与抗干扰问题。项目核心在于设计并实现了一种基于BP(Backpropagation)神经网络的自适应PID控制器。该控制器能够利用神经网络的自学习能力,根据系统当前的误差状态在线实时调整PID参数(Kp, Ki, Kd),从而在面对模型不确定性和外部干扰时,表现出比传统固定参数PID更优越的控制性能。
系统建立了一个简化的直升机俯仰运动二阶离散模型,并提供了完整的对比仿真环境,直观展示了传统控制算法与智能控制算法在跟踪精度、响应速度及抗干扰能力上的差异。
功能特性
- 二阶系统建模:采用离散差分方程模拟直升机俯仰轴动力学特性,包含惯性与阻尼环节。
- 双控制器对比:
*
传统PID控制器:使用增量式算法,参数固定(通过经验或Ziegler-Nichols方法整定)。
*
神经网络自适应PID控制器:基于单神经元/BP网络结构,实现PID增益的在线自整定。
- 非线性信号追踪:支持阶跃响应测试和复杂的正弦组合波形追踪测试。
- 抗干扰能力测试:模拟飞行过程中的突发气流扰动,验证系统的鲁棒性。
- 可视化分析:提供多维度的图表展示,包括轨迹跟踪、误差分析、参数演化及控制量输出。
- 性能量化:自动计算均方误差(MSE)并统计性能提升百分比。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱(代码仅依赖MATLAB基础函数)
算法实现与逻辑详解
本项目仅包含一个核心脚本文件(main.m),其内部逻辑主要分为参数初始化、主控制循环与结果可视化三大部分。
1. 系统建模与初始化
代码首先定义了仿真步长(0.001秒)和总时长(80秒)。被控对象被建模为一个线性二阶离散传递函数,其差分方程形式为通过前两时刻的输出值和控制量来计算当前输出。
- 输入信号:通过标志位
input_type 选择输入类型。实际代码中实现了从简单的阶跃信号到复杂的正弦/余弦组合信号的切换,用于测试控制器对动态目标的跟踪能力。 - 神经网络结构:构建了一个
4-5-3 结构的BP神经网络:
*
输入层(4节点):接收目标值、上一时刻输出、当前误差以及偏置常量。
*
隐含层(5节点):使用 Tanh 激活函数处理非线性特征。
*
输出层(3节点):对应PID的三个参数。输出经过 Sigmoid 变形函数处理,并分别乘以增益系数(比例/微分项放大20倍,积分项保持原倍率),以确保输出的PID参数始终为正且处于合理物理范围内。
2. 主控制循环机制
仿真循环逐个时间步长执行,并行运行两套控制逻辑以便对比:
A. 传统PID控制回路
- 计算设定值与实际值的误差。
- 采用增量式PID算法计算控制量增量。
- 对总控制量进行限幅处理(模拟舵机物理限制,范围 ±10)。
- 在第40000至42000步(即第40-42秒)期间,向系统叠加幅值为0.5的外部干扰。
- 更新系统状态变量。
B. 神经网络自适应PID控制回路
此部分为核心创新点,包含前向传播与反向传播两个过程:
- 前向计算:根据当前状态输入神经网络,计算出当前时刻最优的 Kp, Ki, Kd 参数。
- 控制量计算:利用生成的动态参数,通过增量式PID公式计算控制动作,同样进行 ±10 的限幅。
- 系统响应:应用控制量并加入与传统PID完全一致的外部干扰,获取系统响应。
- 反向传播(在线学习):
* 利用梯度下降法,以误差平方和最小化为目标。
* 利用被控对象的雅可比符号信息(Jacobian sign)近似替代模型梯度。
* 计算输出层和隐含层的梯度误差(Delta)。
* 引入
动量项(Momentum)更新权重矩阵 $w1$ 和 $w2$,以加快收敛速度并抑制震荡。
3. 未知参数自适应与抗干扰
在仿真过程中,神经网络控制器不依赖被控对象的精确数学模型,而是通过实时误差反馈,自动探索出一组使误差最小化的PID参数。当40秒处发生突发干扰导致误差突变时,网络会迅速调整权重,改变PID增益以产生更强的调节作用,从而比固定参数的PID更快地抑制干扰。
4. 结果可视化与评估
由于代码集成了完整的绘图功能,仿真结束后会自动生成三个图形窗口:
- 跟踪性能对比图:展示目标曲线与两条响应曲线,并附带针对干扰区域(40秒处)的局部放大图,清晰展示抗干扰效果。子图展示误差曲线。
- 参数演化图:分别绘制 Kp、Ki、Kd 三个参数随时间变化的曲线,展示“自适应”过程。
- 控制量对比图:对比两种控制器的输出幅度,观察能量消耗与控制平滑度。
- 控制台输出:代码在命令行窗口打印两种控制器的均方误差(MSE)统计数据,并计算性能提升的具体百分比。
使用方法
- 确保计算机已安装 MATLAB。
- 打开 MATLAB,将工作目录切换至项目所在文件夹。
- 直接运行脚本文件。
- 程序将自动执行仿真,并在结束后弹出3个结果图形窗口,同时在命令行显示性能统计数据。
- (可选)修改代码中的
input_type 变量(1或2)来切换阶跃响应测试或正弦追踪测试。