1. 倒立摆控制与TS模糊模型概述
倒立摆作为控制理论中的经典实验对象,本质上是一个非线性、不稳定系统。其控制目标是通过对底座的力或力矩输入,使摆杆保持垂直平衡状态。传统PID控制虽然简单直接,但在处理非线性系统时往往需要复杂的参数整定过程。而TS(Takagi-Sugeno)模糊控制则提供了一种将非线性系统分解为多个线性子系统的有效方法。
TS模糊模型的核心思想是"分而治之"——将整个非线性系统的工作区间划分为多个局部区域,在每个区域内用线性模型近似描述系统行为。这种方法的优势在于:
- 不需要精确的数学模型
- 对参数变化和外部扰动具有较强鲁棒性
- 控制规则具有明确的物理意义
在MATLAB/Simulink环境下实现TS模糊控制时,我们主要使用Fuzzy Logic Toolbox提供的功能模块。整个控制系统的构建流程可以分为三个主要阶段:模糊化、规则库构建和解模糊化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TS模糊控制器设计与实现
2.1 模糊化过程配置
模糊化是将精确的输入变量转换为模糊集合的过程。对于一阶倒立摆系统,我们通常选择摆杆角度(θ)和角速度(dθ/dt)作为输入变量。以下是典型的模糊化配置代码:
matlab复制fis = newfis('pendulum','prod','sum','prod','min','centroid');
% 角度输入变量定义
fis = addvar(fis,'input','angle',[-30 30]*pi/180);
fis = addmf(fis,'input',1,'Negative','gaussmf',[0.1 -0.5]);
fis = addmf(fis,'input',1,'Zero','gaussmf',[0.1 0]);
fis = addmf(fis,'input',1,'Positive','gaussmf',[0.1 0.5]);
% 角速度输入变量定义
fis = addvar(fis,'input','angular_velocity',[-5 5]*pi/180);
fis = addmf(fis,'input',2,'Slow','gaussmf',[0.2 -0.8]);
fis = addmf(fis,'input',2,'Medium','gaussmf',[0.2 0]);
fis = addmf(fis,'input',2,'Fast','gaussmf',[0.2 0.8]);
关键参数说明:
gaussmf函数的第二个参数决定隶属函数的中心位置- 第一个参数(如0.1)控制曲线宽度,直接影响控制灵敏度
- 角度范围[-30,30]度转换为弧度值,符合物理系统实际工作范围
实际调试中发现:当高斯函数的宽度参数小于0.05时,系统会变得过于敏感;大于0.3时则响应迟钝。0.1-0.2是最佳取值范围。
2.2 规则库构建技巧
TS模糊模型的规则库采用"if-then"形式,但then部分不是模糊集合而是线性函数。以下是典型的规则定义方式:
matlab复制% 输出变量定义(控制力)
fis = addvar(fis,'output','force',[-10 10]);
% TS型规则的后件是线性函数
rule1 = [1 1 1 1 1]; % if angle is Negative AND velocity is Slow then force = a1*angle + b1*velocity + c1
rule2 = [2 2 2 1 1];
rule3 = [3 3 3 1 1];
fis = addrule(fis,[rule1; rule2; rule3]);
% 为每个规则指定后件参数
fis.rule(1).consequent = [0.5 0.3 0]; % 线性组合系数
fis.rule(2).consequent = [0.2 0.1 0];
fis.rule(3).consequent = [-0.5 -0.3 0];
规则矩阵说明:
- 前两列对应输入变量的隶属函数索引
- 第三列是输出隶属函数索引(TS模型中通常设为1)
- 第四列是规则权重(通常为1)
- 第五列1表示用OR连接,2表示AND连接
调试经验:当系统出现振荡时,可以尝试减小规则后件中的角度系数(如从0.5降到0.3),同时适当增加角速度系数,这相当于增加了系统的阻尼效果。
3. Simulink仿真环境搭建
3.1 系统整体架构
在Simulink中搭建的一阶倒立摆TS模糊控制系统主要包含以下模块:
- 倒立摆非线性模型
- TS模糊控制器
- 信号观测与扰动注入模块
- 离散/连续模式切换接口

关键连接技巧:
- 在Fuzzy Logic Controller模块后添加Zero-Order Hold模块实现离散控制
- 采样时间设为0.01秒(对应100Hz)可平衡精度和计算负担
- 使用Band-Limited White Noise模块注入扰动时,噪声功率建议设置在0.01-0.05之间
3.2 离散与连续控制模式切换
通过配置Zero-Order Hold模块的参数,可以轻松实现离散与连续控制模式的切换:
-
离散控制模式:
- 设置采样时间(如0.01秒)
- 启用Zero-Order Hold模块
-
连续控制模式:
- 将采样时间设为0
- 或直接旁路Zero-Order Hold模块
实际测试表明:离散模式下采样时间超过0.05秒时,系统稳定性会显著下降;而连续模式对计算资源要求较高,适合在性能强大的硬件上运行。
4. 系统调试与性能优化
4.1 稳定性分析方法
在Simulink中可以通过多种方式评估系统稳定性:
-
相轨迹法(XY Graph):
- 横轴:摆杆角度
- 纵轴:角速度
- 稳定系统应呈现向原点收缩的螺旋轨迹
-
阶跃响应分析:
- 给系统施加小的阶跃扰动
- 观察恢复时间和超调量
- 理想情况下应在2-3秒内恢复平衡
-
频域分析:
- 使用Bode图或Nyquist图
- 检查相位裕度和增益裕度

4.2 常见问题及解决方案
-
问题:摆杆持续振荡不收敛
- 可能原因:规则库中存在矛盾规则
- 解决方案:检查规则后件符号是否一致,确保大角度偏差时控制力方向正确
-
问题:响应过于迟钝
- 可能原因:隶属函数覆盖范围过大
- 解决方案:将高斯函数的σ参数减小20%-30%
-
问题:抗扰动能力差
- 可能原因:角速度项的规则权重不足
- 解决方案:增加规则后件中角速度的系数(如从0.1提高到0.3)
-
问题:离散模式下系统不稳定
- 可能原因:采样时间过长
- 解决方案:将采样时间减半,或增加规则库的精细程度
调试小技巧:当系统表现不理想时,可以先将扰动设为0,观察理想条件下的响应,再逐步增加扰动强度,这样可以隔离问题来源。
5. 高级应用与扩展
5.1 自适应模糊控制实现
基础TS模糊控制器可以通过以下方式升级为自适应系统:
-
在线调整隶属函数参数:
matlab复制% 根据误差调整隶属函数宽度 if abs(error) > threshold fis.input(1).mf(1).params(1) = fis.input(1).mf(1).params(1)*0.9; end -
规则权重动态调整:
- 根据系统状态实时计算规则激活强度
- 对贡献大的规则增加权重
-
后件参数自适应:
- 使用梯度下降法在线优化线性组合系数
- 结合RLS(递归最小二乘)算法进行参数估计
5.2 硬件在环测试
将Simulink模型部署到实际硬件平台的步骤:
- 使用Simulink Coder生成C代码
- 配置硬件支持包(如Arduino、STM32)
- 设计信号调理电路:
- 编码器信号转换为角度值
- 电机驱动电路
- 实时性优化:
- 简化模糊推理算法
- 使用查表法替代实时计算
硬件实现时需要注意:实际电机存在死区和饱和特性,需要在模糊控制器前加入补偿环节,我通常在输出端添加一个死区补偿模块,补偿值通过实验测定。
