基于MATLAB GUI的倒立摆动画控制仿真系统项目文档
1. 项目简介
本项目是一个基于MATLAB图形用户界面(GUI)开发的交互式倒立摆仿真环境。系统通过集成动力学模型、LQR控制算法与实时图形渲染,直观地展示了倒立摆小车从指定起始位置移动至目标位置并保持平衡的全过程。用户可以通过可视化的控制面板进行参数设置、启停控制和环境复位,是理解控制理论与物理仿真的直观工具。
2. 功能特性
- 参数配置:支持通过下拉菜单自定义小车的起始坐标(范围 -5m 至 5m)和终点坐标。
- 实时仿真:点击启动后,系统实时计算倒立摆动力学并绘制连续平滑的动画。
- 状态反馈控制:内置预计算的LQR控制器(线性二次调节器),自动施加控制力使摆杆维持直立(垂直向上)并驱动小车到达目标位置。
- 交互式流程控制:
*
暂停功能:支持仿真过程中的暂停操作,挂起后台程序。
*
键盘唤醒:在暂停状态下,通过监听键盘事件(WindowKeyPress),按下任意键即可恢复仿真。
*
复位刷新:一键清除当前仿真轨迹和状态,将界面控件重置为默认值。
- 信息可视化:通过静态文本实时显示当前系统状态(就绪、运行中、暂停、完成),并在坐标轴标题栏实时更新仿真时间、小车位置和摆杆角度数据。
3. 系统环境要求
- 软件环境:MATLAB(标准安装即可,依赖基础绘图与数学运算功能)。
- 工具箱:本项目核心算法主要依赖基础矩阵运算,LQR增益矩阵已作为硬编码常量嵌入代码,不强制依赖Control System Toolbox运行仿真。
4. 使用方法
- 运行程序:执行
main 函数,程序将首先清空工作区并打开仿真主窗口。 - 设置参数:
* 在面板左侧的“起始坐标”下拉菜单中选择小车初始位置(默认 -2)。
* 在“终点坐标”下拉菜单中选择目标位置(默认 2)。
- 开始仿真:点击“启动”按钮。此时设置控件将被锁定,倒立摆开始运动。
- 暂停与继续:
* 运动过程中点击“暂停”按钮,仿真停止,状态栏变红提示按键继续。
* 按下键盘上任意键,仿真将继续进行。
- 重置系统:点击“刷新”按钮,仿真立刻终止,画面清空,控件恢复可编辑状态。
- 退出程序:点击“退出”按钮关闭界面。
5. 系统实现逻辑详解
5.1 界面布局与初始化 (create_gui)
- 主窗口:创建一个无菜单栏、固定大小(800x600)的Figure窗口,背景色设为浅灰。
- 绘图区:在中心区域定义了坐标轴(Axes),开启网格,固定X轴范围[-6, 6]和Y轴范围[-2, 4],用于承载动画。
- 控制面板:使用
uipanel 容器在底部区域集中管理控件。 - 控件交互:
*
状态文本:根据程序运行阶段改变文字内容和颜色(蓝/红)。
*
下拉菜单:动态生成-5到5的坐标选项,并通过
Value 属性获取用户选择。
*
按钮组:分别绑定对应的回调函数,通过
Enable 属性控制按钮在仿真不同阶段的可用性(如启动后禁用设置参数)。
5.2 物理引擎 (physics_step)
- 模型参数:定义了小车质量(M=1.0kg)、摆杆质量(m=0.1kg)、杆长(L=1.0m)及重力加速度。
- 动力学方程:采用非线性倒立摆动力学方程。代码中分别计算了水平加速度
ddx 和角加速度 ddtheta。方程考虑了控制力 u、重力分量、科里奥利力/离心力项以及系统耦合效应。 - 数值积分:使用欧拉法(Euler Method)进行离散化求解。根据当前状态微分量乘以步长
dt (0.02s) 来更新下一时刻的状态 [x, dx, theta, dtheta]。
5.3 控制算法 (calculate_control)
- 控制律:采用全状态反馈控制
u = -K * (current_state - target_state)。 - 增益矩阵:代码中硬编码了LQR增益向量
K = [-10.0000, -12.6534, 45.3456, 15.6521],分别对应位置、速度、角度和角速度的反馈权重。 - 执行器饱和:模拟物理电机的输出限制,将控制力
u 强制限制在 +/- 50N 范围内。
5.4 动画渲染机制 (update_animation)
- 对象句柄管理:初始化时创建图形对象(小车Patch、摆杆Line、摆球Marker),并保存其句柄。
- 高效更新:在仿真循环中,不重复创建对象,而是通过
set 函数仅更新现有句柄的 XData 和 YData 属性。 - 可视化几何:小车被绘制为宽1m、高0.5m的矩形块;摆杆随状态角度
theta 实时计算末端坐标。 - 帧率控制:使用
drawnow limitrate 刷新绘图队列,并通过 tic/toc 机制计算计算耗时,若计算快于物理步长 dt,则调用 pause 进行补时,确保动画播放速度贴近真实物理时间。
5.5 流程控制逻辑
- 主循环:在
start_callback 中运行 while 循环,条件包括最大时长(20s)、运行标志位 is_running 和停止标志位 stop_flag。 - 暂停机制:
* 点击暂停时,调用
uiwait(h_fig),这会挂起主线程的代码执行(停在循环内)。
* 设置窗口的
WindowKeyPressFcn 回调,当检测到键盘按键时调用
uiresume(h_fig),从而解除挂起,使主循环继续执行。
- 复位机制:
reset_callback 将 stop_flag 置为 true,强制退出主循环。如果处于暂停状态(程序挂起),复位函数会先调用 uiresume 解锁线程,再执行清理重置操作。
6. 关键函数说明
- main(): 程序入口,定义全局变量、参数及嵌套函数结构。
- create_gui(): 构建所有UI组件,绑定回调,设置初始属性。
- draw_initial_scene(): 首次绘制静态场景(地面、静止的小车和摆杆),用于初始化图形句柄。
- calculate_control(curr_state, target_x): 核心算法函数,输入当前状态向量和目标位置,输出控制力。
- physics_step(curr_state, u): 物理求解器,输入当前状态和控制力,输出下一时刻状态。
- update_animation(x, theta): 视图更新函数,负责将计算出的物理坐标转换为图形坐标并刷新显示。
- start_callback: 包含仿真主循环,协调计算、控制、绘图与时间同步。
- pause_callback: 利用 MATLAB 的
uiwait 功能实现程序执行流的冻结。 - reset_callback: 负责安全中断仿真循环并恢复界面到初始待机状态。