MATLAB - 控制小车上的倒立摆

2024-01-31 18:20
文章标签 matlab 控制 倒立 小车

本文主要是介绍MATLAB - 控制小车上的倒立摆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

 


前言

 


 

一、小车 - 摆杆

小车 - 摆杆模型如图 1 所示,使用 Simscape™ Multibody™ 在 Simulink® 中建模。

2aa9c9d3b85445028245bc209119d4a4.png

图 1:小车上的倒立摆

72f7995376e5498686211baeb2555d49.png

图 2:Simscape 多体模型

 

该系统通过对小车施加可变力 eq?F 进行控制。控制器需要在将小车移动到新位置或摆锤被推向前方(脉冲干扰 eq?dF)时保持摆锤直立。

二、控制结构

竖直位置是倒立摆的不稳定平衡点。被控对象的不稳定性使控制任务更具挑战性。在本例中,您将使用以下双回路控制结构:

open_system('rct_pendulum.slx')
set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','off');

28b2e17eab1f4a8db3d32c3cdbb32b49.png

内环使用二阶状态空间控制器将摆稳定在竖直位置(eq?%5Ctheta 控制),而外环使用比例-微分 (PD) 控制器控制小车位置。使用 PD 控制器而不是 PID 控制器,是因为被控对象已经提供了一些积分动作。

三、设计要求

使用 TuningGoal 要求指定所需的闭环行为。指定跟踪小车位置 eq?x 设定点变化的响应时间为 3 秒。

% Tracking of x command
req1 = TuningGoal.Tracking('xref','x',3);

为充分抑制摆尖上的脉冲干扰 eq?dF,可使用以下形式的 LQR 惩罚

eq?%5Cint_0%5E%5Cinfty%2816%5Ctheta%5E2%28t%29+x%5E2%28t%29+0.01F%5E2%28t%29%29dt

强调较小的角度偏差 eq?%5Ctheta,并限制控制力度 eq?F。 

% Rejection of impulse disturbance dF
Qxu = diag([16 1 0.01]);
req2 = TuningGoal.LQG('dF',{'Theta','x','F'},1,Qxu);

为确保稳健性,要求设备输入端至少有 6 分贝的增益裕度和 40 度的相位裕度。

% Stability margins
req3 = TuningGoal.Margins('F',6,40);

最后,对闭环极点的阻尼和固有频率进行限制,以防止出现抖动或欠阻尼的瞬态。

% Pole locations
MinDamping = 0.5;
MaxFrequency = 45;
req4 = TuningGoal.Poles(0,MinDamping,MaxFrequency);

四、控制系统调整

闭环系统在 PD 控制器和状态空间控制器的初始值(分别为 1 和 2/s)下是不稳定的。您可以使用 systune 对这两个控制器进行联合调整。使用 slTuner 界面指定可调块,并将工厂输入 F 注册为分析点,以测量稳定裕度。

ST0 = slTuner('rct_pendulum',{'Position Controller','Angle Controller'});
addPoint(ST0,'F');

接下来,根据上述性能要求,使用 systune 调整 PD 和状态空间控制器。优化跟踪和干扰抑制性能(软要求),但必须符合稳定性裕度和极点位置约束条件(硬要求)。

rng(0)
Options = systuneOptions('RandomStart',5);
[ST, fSoft] = systune(ST0,[req1,req2],[req3,req4],Options);
Final: Soft = 1.37, Hard = 0.99968, Iterations = 320
Final: Soft = 1.44, Hard = 0.99917, Iterations = 266
Final: Soft = 1.26, Hard = 0.99907, Iterations = 351
Final: Soft = 1.37, Hard = 0.99934, Iterations = 311
Final: Soft = 1.27, Hard = 0.99903, Iterations = 281
Final: Soft = 1.37, Hard = 0.99911, Iterations = 274

最佳设计的软要求值接近 1,同时满足硬要求 (硬<1)。这意味着调整后的控制系统几乎达到了跟踪和干扰抑制的目标性能,同时满足了稳定性裕度和极点位置约束。

五、验证

使用 viewGoal 进一步分析最佳设计如何满足各项要求。

figure('Position',[100   100   575   660])
viewGoal([req1,req3,req4],ST)

7e239c5b266749b8a720a1280cd5daa6.png

这些曲线图证实,前两个要求几乎得到了满足,而后两个要求则得到了严格执行。接下来,绘制小车对位置阶跃变化和力脉冲的响应图。 

T = getIOTransfer(ST,{'xref','dF'},{'x','Theta'});
figure('Position',[100   100   650   420]);
subplot(121), step(T(:,1),10)
title('Tracking of set point change in position')
subplot(122), impulse(T(:,2),10)
title('Rejection of impulse disturbance')

dfc960abee77475faf31255f283806d3.png

响应平稳,达到预期的稳定时间。检查控制器的调整值。 

C1 = getBlockValue(ST,'Position Controller')
C1 =s    Kp + Kd * --------Tf*s+1 with Kp = 5.74, Kd = 1.77, Tf = 0.0495Name: Position_Controller
Continuous-time PDF controller in parallel form.
C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 =-1600.6 (s+13.05) (s+4.14)--------------------------(s+134.7) (s-14.2)Name: Angle_Controller
Continuous-time zero/pole/gain model.

请注意,角度控制器有一个不稳定极点,它与被控对象的不稳定极点配对,以稳定倒立摆。要了解这一点,请获取被控对象输入端的开环传递并绘制根位置图。

L = getLoopTransfer(ST,'F',-1);
figure
rlocus(L)
set(gca,'XLim',[-25 20],'YLim',[-20 20])

7dcc5a2b21df4e69a369b75f06263f47.png

为完成验证,将调整值上传到 Simulink,并模拟小车/摆锤组件的非线性响应。下面是模拟结果的视频。 

writeBlockValue(ST)
055bfc2415c94896bbd2b91e521a2e18.gif

图 3:使用调谐控制器的小车/摆仿真

模拟结束后关闭模型。 

set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','on');
close_system('rct_pendulum',0);

 

这篇关于MATLAB - 控制小车上的倒立摆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664665

相关文章

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth