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

相关文章

用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

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC