基于MATLAB的倒立摆平衡控制系统仿真与可视化
项目简介
本项目是一个基于MATLAB的单级倒立摆(Inverted Pendulum)控制系统仿真平台。项目通过建立系统的非线性物理模型,推导并在垂直向上平衡点附近进行线性化,设计了多种控制算法以实现倒立摆的自动起摆、平衡保持及抗干扰控制。该程序使用MATLAB脚本集成了建模、求解器仿真、数据分析及动态动画演示功能。
功能特性
- 物理建模:基于拉格朗日方程建立包含小车质量、摆杆质量、转动惯量及摩擦系数的非线性动力学模型。
- 线性化分析:在垂直向上位置($theta=0$)计算系统的状态空间矩阵(A, B, C, D),并自动验证系统的可控性。
- 多种控制策略:
*
LQR最优控制:基于状态加权矩阵$Q$和控制加权$R$设计最优状态反馈增益。
*
极点配置法:根据期望的闭环极点位置计算反馈增益,以调整系统的阻尼和响应速度。
*
PID控制:实现了基于角度误差和位置误差的加权PD控制逻辑(虽然定义了积分参数,但在当前动力学求解中主要采用了比例微分调节)。
- 非线性仿真:使用
ode45(Runge-Kutta)求解器对非线性微分方程进行数值积分,模拟真实物理系统的响应。 - 抗干扰测试:在仿真过程中模拟这一物理场景:在第3.0秒至3.1秒期间,对小车施加20牛顿的脉冲扰动力,用于验证控制系统的鲁棒性。
- 全方位可视化:
*
数据波形:自动绘制角度、位置、角速度及控制输入随时间变化的对比曲线。
*
动态动画:基于LQR控制结果生成实时的倒立摆运动动画,包含小车、摆杆、质点及扰动力的可视化指示。
系统要求
- MATLAB R2016b 或更高版本
- Control System Toolbox(用于
lqr, place, ctrb 等函数)
使用方法
- 确保MATLAB的工作路径包含本项目的脚本文件。
- 直接运行主函数。
- 程序将依次执行参数定义、模型建立、控制器计算及三次独立仿真(LQR, Pole Placement, PID)。
- 运行结束后,会弹出两个窗口:
*
响应对比图:显示三种控制策略下的状态曲线。
*
仿真动画:播放基于LQR策略的动态平衡过程。
- 命令行窗口将输出LQR控制下的稳态误差及初始状态信息。
代码实现详解
本项目的所有逻辑均包含在一个主程序文件中,具体的实现细节如下:
1. 物理参数与系统建模
代码首先定义了倒立摆的物理参数,包括小车质量(1.0 kg)、摆杆质量(0.1 kg)、半杆长(0.5 m)以及转动惯量等。初始状态设定为小车静止,摆杆倾斜10度($10pi/180$)。
在线性化阶段,程序构建了标准的四阶状态空间模型 $ dot{x} = Ax + Bu $,其中状态向量 $x = [位置, 速度, 角度, 角速度]^T$。系统矩阵 $A$ 和输入矩阵 $B$ 是基于动力学方程在平衡点附近的偏导数计算得出的。代码通过 ctrb 函数计算可控性矩阵的秩,若满秩则继续运行。
2. 控制算法设计
- 策略A (LQR):定义了状态权重矩阵 $Q$ 侧重于惩罚位置误差(100)和角度误差(200),控制权重 $R$ 设为0.1,通过
lqr 函数计算最优增益矩阵 K_lqr。 - 策略B (极点配置):设定了一组期望的左半平面极点
[-2, -2.5, -3, -3.5],利用 place 函数计算增益矩阵 K_pp,旨在保证系统稳定的同时具有特定的动态特性。 - 策略C (PID):虽然预留了Kp, Ki, Kd参数结构体,但在实际的动力学仿真函数中,采用的是简化形式。通过分别计算角度误差和位置误差,并应用比例(P)和微分(D)增益进行加权叠加,形成总的控制力。代码逻辑中包含了对控制方向的特定处理(负反馈)。
3. 非线性动力学仿真 (ode45)
程序使用 MATLAB 内置的
ode45 求解器进行时域仿真。仿真时间设定为0到10秒。核心动力学逻辑封装在子函数中(见下文
sys_dynamics 分析)。代码针对每种控制策略分别运行了一次仿真,生成独立的时间序列数据
t_lqr,
t_pp,
t_pid 及其对应的状态
y_lqr,
y_pp,
y_pid。
4. 关键函数分析
主流程逻辑
主程序负责编排整个流程:初始化参数 -> 计算模型 -> 设计控制器 -> 运行三次仿真 -> 绘制四子图波形 -> 生成动画帧循环。
sys_dynamics 函数
这是系统的核心物理引擎,实现了以下逻辑:
- 输入计算:根据传入的控制器类型(LQR/PP 或 PID),计算当前的控制力 $u$。如果是 LQR/PP,采用全状态反馈 $u = -Kx$;如果是 PID,则根据当前误差计算 PD 输出。
- 饱和限制:模拟电机物理限制,将计算出的控制力 $u$ 限制在 $pm 50$ 范围内。
- 扰动注入:检测当前时间 $t$,如果在 3.0s 到 3.1s 之间,向系统叠加一个 20N 的外力。
- 运动方程求解:直接求解非线性拉格朗日方程。代码构建了质量矩阵 $M_{mat}$ 和力向量 $F_{vec}$,通过代数运算(等效于求逆)解出加速度 $ddot{x}$ 和 $ddot{theta}$,最终返回状态导数向量。
get_control_input 函数
这是一个辅助函数,用于在仿真结束后反算控制输入 $u$。因为
ode45 只返回状态 $y$,为了在绘图中显示控制力随时间的变化,该函数重现了
sys_dynamics 中的控制律逻辑(包括控制增益计算、扰动叠加等),生成用于绘图的输入数据。
5. 可视化与动画
- 波形图:Figure 1 展示了角度(deg)、位置(m)、角速度(deg/s)和控制力(N)的对比。不同的线条颜色和线型(红色实线、蓝色虚线、绿色点划线)用于区分不同的控制策略。
- 动画:Figure 2 专门用于演示 LQR 控制器的效果。它通过对仿真数据进行插值,以 30FPS 的帧率重绘小车(矩形)、摆杆(线段)和质点(圆点)。当仿真时间处于扰动区间(3s-3.2s)时,动画中会出现红色的箭头提示并显示 "Disturbance!" 字样。