MatlabCode

本站所有资源均为高质量资源,各种姿势下载。

您现在的位置是:MatlabCode > 资源下载 > 一般算法 > 倒立摆平衡控制系统仿真与可视化

倒立摆平衡控制系统仿真与可视化

资 源 简 介

本项目旨在建立单级倒立摆系统的数学模型并设计高效控制算法以实现其动态平衡与抗干扰能力。项目首先基于拉格朗日方程或牛顿-欧拉法推导倒立摆系统的非线性动力学微分方程,并在垂直向上平衡点附近进行线性化处理,构建状态空间模型。核心功能包括实现多种控制策略的对比与应用,具体涵盖传统的PID控制、极点配置法(Pole Placement)以及线性二次型调节器(LQR)最优控制,以解决倒立摆系统的不稳定、非线性和强耦合特性。项目利用Simulink搭建完整的闭环控制仿真模型,能够模拟系统在不同初始倾角下的自动起摆与稳态保持过程,并可以模拟外部扰动(如施加在摆杆或小车上的力)以测试控制系统的鲁棒性。此外,项目编写了专门的可视化脚本,能够生成倒立摆运动的实时动画,反映小车在轨道上的水平移动及摆杆的角度变化,同时自动生成系统响应曲线,用于分析超调量、调节时间和稳态误差等性能指标。

详 情 说 明

基于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 等函数)

使用方法

  1. 确保MATLAB的工作路径包含本项目的脚本文件。
  2. 直接运行主函数。
  3. 程序将依次执行参数定义、模型建立、控制器计算及三次独立仿真(LQR, Pole Placement, PID)。
  4. 运行结束后,会弹出两个窗口:
* 响应对比图:显示三种控制策略下的状态曲线。 * 仿真动画:播放基于LQR策略的动态平衡过程。
  1. 命令行窗口将输出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!" 字样。