MATLAB - 控制小车上的倒立摆

news2024/12/28 19:57:59

系列文章目录

 


前言

 


 

一、小车 - 摆杆

小车 - 摆杆模型如图 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.0495
 
Name: 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);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV】在Linux上使用OpenCvSharp

前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;它具有C&#xff0c;Python&#xff0c;Java和MATLAB接口&#xff0c;并支持Windows&#xff0c;Linux&#xff0c;Android和Mac OS。OpenCvSharp是一个Ope…

Python中类的相关术语(附带案例)

目录 1、面向对象 2、类 3、实例 4、初始化方法 5、魔法方法 6、字符串方法 7、self 8、数据、属性、操作、行为 9、父类、基类、超类 or 子类、派生类 10、多态 11、重载多态 and 重写多态 12、名称解释 1、面向对象 在Python中&#xff0c;面向对象编程&…

由《幻兽帕鲁》私服漏洞引发的攻击面思考

《幻兽帕鲁》私服意外丢档 当了一天的帕鲁&#xff0c;回家开机抓帕鲁的时候发现服务器无法连接。运维工具看了下系统负载发现 CPU 已经跑满。 故障排查 登录服务器进行排查发现存在可疑的 docker 进程。 经过一番艰苦的溯源&#xff0c;终于在命令行历史中发现了端倪 攻击…

深入浅出AI落地应用分析:AI个人助手Monica

前言:铺天盖地的大模型以及所谓的应用到目前为止实际还是很少有像Monica这样贴合个人工作习惯的产品落地,比如像Chatgpt等这样的产品,绝大多数人不会专门买🪜翻墙出去用,而且大多数场景下素人或小白都不知道该怎么用,但是Monica这款产品就很好的以浏览器的插件的形式始终…

[BUUCTF]-PWN:cmcc_pwnme2解析

保护 ida 完整exp&#xff1a; from pwn import* context(log_leveldebug) #premote(node5.buuoj.cn,26964) pprocess(./pwnme2) addhome0x8048644 addflag0x8048682 getfile0x80485CB main0x80486F8 pop_ebp0x8048680 ret0x80483f2 pop_ebx0x8048409 pop_edi_ebp0x804867f st…

贪吃蛇---C语言---详解

引言 C语言已经学了不短的时间的&#xff0c;这期间已经开始C和Python的学习&#xff0c;想给我的C语言收个尾&#xff0c;想起了小时候见过别人的老人机上的贪吃蛇游戏&#xff0c;自己父母的手机又没有这个游戏&#xff0c;当时成为了我的一大遗憾&#xff0c;这两天发现C语…

Unity | 资源热更(YooAsset AB)

目录 一、AssetBundle 1. 插件AssetBundle Browser 打AB包 &#xff08;1&#xff09;Unity&#xff08;我用的版本是2020.3.8&#xff09;导入AssetBundle Browser &#xff08;2&#xff09;设置Prefab &#xff08;3&#xff09;AssetBundleBrowser面板 2. 代码打AB包…

算法:积木游戏学习数学

一、算法描述 小华和小微一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小微找到这排积木中数字相同且所处位置最远的2块积木块&#xff0c;计算他们的…

【LeetCode】每日一题 2024_1_30 使循环数组所有元素相等的最少秒数(哈希、贪心、扩散)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;使循环数组所有元素相等的最少秒数题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天的题目类型差不多是第一次见到&#xff0c;原来题目描述…

【大数据】Flink 架构(四):状态管理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

GPIO中断

1.EXTI简介 EXTI是External Interrupt的缩写&#xff0c;指外部中断。在嵌入式系统中&#xff0c;外部中断是一种用于处理外部事件的机制。当外部事件发生时&#xff08;比如按下按钮、传感器信号变化等&#xff09;&#xff0c;外部中断可以立即打断正在执行的程序&#xff0…

异常——浅析

异常 本人不才&#xff0c;对于异常只能做基本的介绍&#xff0c;无法给出自己的体会以及无法指明易错点 C异常 c语言处理异常的方式有 assert——直接中断程序 返回错误码——需要查找错误码表确定错误 这两种操作都不是很好&#xff0c;如果一个大型程序&#xff0c;为了找…

UE5动画源码剖析

重点剖析的类&#xff1a; UAnimationInstanceFAnimInstanceProxy 参考&#xff1a;https://zhuanlan.zhihu.com/p/405437842 参考&#xff1a;https://blog.csdn.net/qq_23030843/article/details/109103433 参考&#xff1a;https://ikrima.dev/ue4guide/gameplay-programm…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

自建DNS劫持服务器,纯内网劫持PS5,屏蔽更新,自动hen

背景&#xff1a;目前PS5首次折腾必须要连外网&#xff0c;还要改DNS&#xff0c;除非使用ESP8266/32&#xff0c; 本文的方法是完全不改DNS&#xff0c;不使用ESP8266,不连接外网的情况下自动折腾 能实现什么&#xff1a; 1.折腾全程不连接外网 2.完全自建hen服务器&#xff…

Vue(十九):ElementUI 扩展实现树形结构表格组件的勾父选子、半勾选、过滤出半勾选节点功能

效果 原理分析 从后端获取数据后,判断当前节点是否勾选,从而判断是否勾选子节点勾选当前节点时,子节点均勾选全勾选与半勾选与不勾选的样式处理全勾选和全取消勾选的逻辑筛选出半勾选的节点定义变量 import {computed, nextTick, reactive, ref} from vue; import {tree} f…

我该坚持纯正原创?还是随波逐流做搬运作者?

本文可能不是一个热点文章&#xff0c;甚至可能不是一个网创者该关心的文章&#xff0c;但是阿阳真心希望&#xff0c;大家可以静下心来看看。 阿阳在网赚领域混了差不多十年&#xff0c;这么多年也经历不少。我不想吹嘘什么&#xff0c;可能是因为年纪大了&#xff0c;觉得低调…

毕业设计----Ajax请求遇到的问题Uncaught TypeError: Cannot read properties of undefi

目录 问题 问题 总的来说&#xff0c;就是我在form表单新增了一个字段&#xff0c;在表单的验证规则中添加了一个名为 code 的自定义验证规则&#xff0c;但是没有提供该规则的实现代码&#xff0c;validate.js提示报错。 所以为了使验证规则生效&#xff0c;添加自定义验证方…

BODIPY FL NHS,BODIPY FL NHS 活化酯,可以实现对特定生物分子的可视化追踪和定位

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BODIPY FL NHS ester&#xff0c;BODIPY FL NHS&#xff0c;BODIPY FL NHS 活化酯 一、基本信息 产品简介&#xff1a;BODIPY FL NHS ester, by combining BODIPY with NHS ester, this reagent is able to react w…

【CSS】常见

一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题&#xff1a;display:flex 和 ellipsis 冲…