小车倒立摆经典PID与模糊控制对比仿真系统 README
项目简介
本项目是一个基于MATLAB开发的倒立摆控制系统仿真程序。项目核心在于构建精确的小车倒立摆非线性数学模型,并在同一仿真环境下,分别实现并对比了
经典的PID控制算法与
模糊控制(Fuzzy Logic Control)算法。
通过本仿真系统,用户可以直观地观察到两种不同控制策略在面对非线性不稳定系统时的动态响应差异,包括摆杆角度的平衡能力和小车位置的控制效果。
主要功能特性
- 高精度动力学建模:基于拉格朗日方程构建了包含小车质量、摆杆质量、摩擦系数等物理参数的非线性微分方程模型。
- 双闭环PID控制:实现了角度环与位置环加权的PID控制策略,包含积分项以消除角度静差。
- Mamdani模糊控制:利用MATLAB Fuzzy Logic Toolbox编程构建了完整的模糊推理系统,包含模糊化、规则推理和解模糊过程。
- 混合控制策略:在模糊控制回路中加入了辅助的位置PD补偿,确保小车在平衡摆杆的同时不会无限漂移。
- 数值积分仿真:采用四阶龙格-库塔(RK4)法进行系统状态的离散化迭代,确保仿真精度。
- 多维度可视化:自动生成波形图,对比角度响应、位移响应及控制输入力的变化情况。
系统要求
- MATLAB R2017b 或更高版本
- Fuzzy Logic Toolbox(模糊逻辑工具箱)
使用方法
- 将代码保存为
main.m。 - 在MATLAB中打开该文件。
- 点击运行(Run),程序将自动执行仿真计算。
- 运行结束后,会弹出一个包含三个子图的窗口,分别显示角度、位移和控制力的对比曲线。
- 命令行窗口(Command Window)将输出两种控制算法的性能指标。
---
代码实现逻辑详解 (基于 main.m)
本项目的 main.m 文件包含了仿真流程的所有核心逻辑,主要分为以下四个阶段:
1. 系统参数与初始化
代码首先定义了倒立摆系统的物理参数,包括:
- 小车质量 ($M=1.0kg$) 和 摆杆质量 ($m=0.1kg$)
- 摆杆半长 ($l=0.5m$) 和 重力加速度 ($g$)
- 小车摩擦系数 ($b=0.1$)
同时设置了仿真时间参数(总时长10秒,步长0.005秒)和系统的初始状态。初始状态设定为
theta = 0.1 rad(约5.7度),模拟小车受到扰动需要恢复平衡的场景。
2. 控制器设计与参数定义
#### PID 控制器
采用加权状态反馈形式的PD控制叠加积分项。代码中硬编码了调试好的参数:
- 角度控制:$Kp_theta=100, Kd_theta=20$
- 位置控制:$Kp_x=2.5, Kd_x=3.5$
- 积分项:$Ki_theta=1.0$(用于消除角度静差)
#### 模糊控制器
调用辅助函数动态创建模糊推理系统(FIS)。同时定义了模糊系统的量化因子:
- $Ke = 60$:误差量化因子
- $Kec = 2$:误差变化率量化因子
- $Ku = 80$:输出比例因子
3. 仿真主循环
程序使用
for 循环模拟时间步进,并行执行两套控制方案:
- PID控制回路:
* 计算角度误差并累积积分项。
* 控制律计算公式体现为:$u = Kp_theta theta + Kd_theta dot{theta} + Kp_x x + Kd_x dot{x} - Ki_theta int theta$。
* 通过
max(min(...)) 函数模拟执行器饱和(限制在 ±30N)。
* 调用数值积分函数更新下一时刻状态。
- 模糊控制回路:
* 计算输入变量 $E$ (角度误差) 和 $EC$ (角度变化率)。
* 调用
evalfis 函数执行模糊推理。
*
混合控制逻辑:为了公平对比,模糊控制部分主要负责平衡(Angle),代码额外叠加是一个弱位置PD控制
(2.0*x + 2.0*dx) 辅助小车定位。
* 同样施加 ±30N 的力饱和限制并更新状态。
4. 结果可视化
仿真结束后,代码绘制一个包含三个子图的窗口:
- 子图1(角度):对比PID(蓝实线)与模糊控制(红虚线)的摆杆角度恢复过程。
- 子图2(位移):对比小车为了保持平衡移动的距离。
- 子图3(输入):显示电机输出力 $u$ 的变化,反映控制的能耗与平滑度。
---
关键算法与函数细节
Mamdani 模糊控制器构建 (create_fuzzy_controller)
该函数完全通过代码构建了一个 Mamdani 型模糊推理系统,主要细节如下:
*
E (误差):定义域 [-6, 6],包含 NB, NM, ZE, PM, PB 五个隶属度函数。
*
EC (误差变化率):定义域 [-6, 6],同样包含五个隶属度函数。
*
U (控制力):定义域 [-6, 6]。
* 构建了完整的 $5 times 5 = 25$ 条规则库。
* 规则逻辑基于经验:例如,当误差为正大(PB)且变化率为正大(PB)时,控制力输出正大(PB)以追赶倒下的摆杆。
倒立摆动力学模型 (pendulum_dynamics)
该函数实现了非线性倒立摆的微分方程。
- 输入:当前状态向量、控制力 $u$、物理参数 $p$。
- 输出:状态导数 $[dot{x}, ddot{x}, dot{theta}, ddot{theta}]$。
- 核心算法:直接根据拉格朗日力学推导出的公式计算 $ddot{x}$ (小车加速度) 和 $ddot{theta}$ (角加速度),考虑了耦合的非线性项(如 $sin(theta)^2$, $dtheta^2$项)。
数值积分
虽然具体的 RK4 实现函数
runge_kutta_step 在提供的代码段外部(或基于上下文假设存在),但代码逻辑明确在每个时间步调用此方法来解算微分方程,保证了比欧拉法更高的仿真精度。