LADRC的学习——用simulink搭建仿真模型

2023-11-03

作者:墨心; 时间:2019.7.25

用simulink搭建仿真模型

前面两篇博客主要讲了ADRC的相关概念和知识,并且尝试着搭建模型和仿真,之后学习了PID的相关知识,了解了Kp,Ki,Kd三个参数的意义。
接下来,主要根据高志强教授的论文,按照其方法来搭建模型。
参考文献:
[1] Zhiqiang Gao. Scaling and bandwidth-parameterization based controller tuning[P]. American Control Conference, 2003. Proceedings of the 2003,2003.

一、LADRC的介绍

LDRC - Linear Active Disturbances Rejection Controller,按照翻译,它就是一个线性的自抗扰控制器,这是ADRC的简化,但是简化不一定功能就很差,而且比PID有着更好的控制效果。原ADRC的结构框如图所示:
在这里插入图片描述
其中LADRC在这个基础上减少了安排过渡过程,非线性反馈改为PD控制,保留ESO,从而达到进行精确控制的效果。

控制对象的表达形式需要化为这样的形式:
在这里插入图片描述
则f为:
在这里插入图片描述
在这里,y和u是输入信号和输出信号,w为外部扰动,a和b是微分方程的y‘和y的系数,我们可以通过控制对象的传递函数来化解为微分方程,从而得到被控对象的标准形式。f 可以被看做一般性扰动,它可以代表未知的内部动态,最后期望是通过ESO观测出来进行补偿。
因为 f 作为扰动,我们最基本的想法是获得 f_ ,用它在控制律里面,从而得到
在这里插入图片描述
这样系统就变为了带增益的双积分器的问题,从而有
在这里插入图片描述
则扰动为 f - f_.

然后系统些为状态方程的形式:
在这里插入图片描述
x3 = f 作为一个增加的扰动, h = f‘(一阶导) 作为未知扰动,则 f 的估计就可以使用状态观测器,如下:
在这里插入图片描述
则状态观测器就可以改写为扩张状态观测器(ESO),其结构如下:
在这里插入图片描述
L 为观测器增益向量,其可以用一些现有的方法来得到,比如极点配置的方法。则控制器可以写为:
在这里插入图片描述
然后忽略z3,这个系统就可以变为带有增益的双积分器,其中 z3 = f ;这样其就可以用PD控制器来控制:
在这里插入图片描述
其中 r 为设定值。注意 -Kdz2 代替了 -Kd(r’ - z2),这样r微分以后为0,这样就有:
在这里插入图片描述

因此下面通过一个具体例子,来搭建simulink。

二、LADRC的模型的搭建

现在举一个例子:
其中被控对象的标准微分方程为:
在这里插入图片描述
其中Td为转矩,为一常量,可以写为:
在这里插入图片描述
LADRC扩张状态观测器的标准型为:
在这里插入图片描述
这里通过 z1 估计 y ,z2 估计 y’ , z3 估计 f ,f 为扰动,如上面说的那样化简。然后PD控制器标准型为:
在这里插入图片描述
其中 omega_c 为可调参数。
通过ESO,PD控制器,被控对象,因此搭建模型如下。

a.LESO模型的搭建
在这里插入图片描述
把它封装为一个子系统,为LESO,如下所示:
在这里插入图片描述

b.加上PD控制器成为LADRC
在这里插入图片描述
接下来得到LADRC, 接下里加入被控对象得到一个整体的系统,通过调节参数来检验系统的情况。

c.整体框图
在这里插入图片描述
这是整体框图,这是加上被控对象以后得到的仿真图。接下来通过调节参数,用不同的信号来看控制效果。

d.控制效果的检验
其中有一些全局参数,用这样的方式来赋值,如图所示:
在这里插入图片描述
这个文件得和仿真图片在同一个文件目录下,先调节参数,再运行这个文件,再运行仿真图。

1.方波,omega_c = 5;

在这里插入图片描述
2.方波,omega_c = 20
在这里插入图片描述
3.方波,omega_c = 40;
在这里插入图片描述
4.正弦波,omega_c = 50;
在这里插入图片描述
5.锯齿波,omega_c = 50;
在这里插入图片描述

可以看出,LADRC在这个被控对象的情况下,与输入基本重合,控制效果特别好,而且只用调节一个omega_c 参数,一般在一定范围内往大了调效果会比较好。

接下来准备看清华大学 陈星 的硕士论文,自抗扰控制器参数整定方法及其在热工过程中的应用,通过换被控对象来看控制效果,并且深入理解ADRC,为以后用程序变成得到通过的控制算法做准备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LADRC的学习——用simulink搭建仿真模型 的相关文章

  • matlab中的mod和rem的异同

    rem和mod是求余的 但是算法不同 差异在哪呢 就在于分别使用了fix和floor 函数fix和floor都是圆整用的 fix是向0的方向圆整 如fix 1 5 1 fix 1 5 1 而floor是向下圆整 如floor 1 5 2 f
  • LADRC的离散化实现(Mark一下,重新开始)

    LADRC的离散化实现 一 感慨 上一次写博客是两年前了 现在已经过了那么久 期间经历了许多事 有好有坏 不多大多时候是丧的 到了现在 终究让我相通了一件事情 深刻理解并追求自己想要做的事情是会幸福的 通过读了许多书 在b站上看了许多视频
  • simulink仿真 adc 采样ePWM输出例程

    新建文件夹并用matlab打开 写入这两个模块 配置 ADC 配置ePWM 不使能B 关了就行 其他的默认即可 配置烧录 连线 示波器接pwma1 和地 adc chanl1接 3 3v或者 0 3 3 都行 转化是 x 3 3 2 12
  • PID控制算法01

    PID控制算法 PID控制算法公式 原理 参数作用 PID算法及改进 两个基本类型 位置型PID控制 增量型PID控制 积分环节改进的PID控制 积分分离的PID控制 变速积分的PID控制 抗积分饱和的PID控制 微分环节改进的PID控制
  • PID控制算法(PID控制原理与程序流程)

    PID控制算法 PID控制原理与程序流程 暗影玄极 博客园 cnblogs com
  • 如何以编程方式获取 OS X 上给定 PID 的打开文件描述符列表?

    我所看到的一切都说要使用lsof p 但我正在寻找不需要 fork exec 的东西 例如 在 Linux 上 人们可以简单地步行 proc pid fd You can use proc pidinfo与PROC PIDLISTFDS枚举
  • multiprocessing.Pool 与 maxtasksperchild 产生相同的 PID

    我需要在一个与所有其他内存完全隔离的进程中运行一个函数多次 我想用multiprocessing为此 因为我需要序列化来自函数的复杂输出 我设置了start method to spawn 并使用一个游泳池maxtasksperchild
  • 在 Unix 环境中检测过时的 pid 文件

    在 Unix 环境中检测陈旧 pid 文件的标准 跨平台方法是什么 假设我想终止应用程序的旧实例 但如果该应用程序已经退出 我当然不想破坏具有相同 PID 的不相关进程 现在我找到了一种在我的 Ubuntu 也可能是其他基于 GNU Lin
  • 如何在不使用绘图的情况下将范围保存到图像文件?

    这个条件非常重要 因为绘图以不可接受的方式拉伸我的图表 如果 MikeT 的评论是正确的 并且您正在尝试保存 Scope 块中显示的图像 则可以通过以下几种方法来执行此操作 打印示波器窗口的内容通过单击Print图标 范围工具栏上最左边的图
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • 以编程方式获取另一个进程的父进程pid?

    我尝试谷歌 但发现getppid 它获取的父pidcurrent过程 我需要类似的东西getppid some other pid 有这样的事吗 基本上获取某个进程的 pid 并返回父进程的 pid 我认为最简单的事情是打开 proc 并解
  • 识别 DNS​​ 请求的 PID 源 (Windows XP)

    我希望确定发出 DNS 请求的进程 查看查询给了我一个线索 但并不能帮助我确定确切的过程 我可以在 Wireshark 中看到本地端口号 但请求太短暂 无法被 TCPView 接收 有没有可以捕获 DNS 请求和 PID 的日志记录工具 过
  • mac os x 下进程使用的内存

    给定PID 如何获取进程当前使用的内存 具体来说 我正在寻找 进程使用的私有物理内存 RAM 进程使用的交换空间 但我对映射文件和共享内存不感兴趣 简而言之 我想确定通过终止 PID 将释放多少内存 RAM 和交换 这有用吗 您可以使用ps
  • 确定监听某个端口的进程pid

    正如标题所示 我正在运行多个游戏服务器 并且每个服务器都有相同的name但不同PID和port数字 我想匹配PID正在监听某个端口的服务器 然后我想终止这个进程 我需要它来完成我的 bash 脚本 这可能吗 因为在网上还没有找到解决方案 您
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • 是否可以通过编程方式运行 Simulink 模型并测量其状态?

    我希望为现有 Simulink 模型设置一个测试集 理想情况下 我可以完全控制模型 明确地步进并测量模型中任何总线上任何信号的状态 正如可能已经收集到的 这是该模型的单元测试系统的前身 因此 我不能真正证明更改模型以适应测试是合理的 测试必
  • 在 python 中,是否有跨平台的方法来确定哪个进程正在侦听给定端口?

    在linux下 我可以使用lsof i如以下函数所示 def FindProcessUsingPort portnum import os fp os popen lsof i s portnum lines fp readlines fp
  • 将直流电机添加到 Simscape 多体旋转关节

    我有以下直流电机模型和 2 轮机器人的 Simscape 多体模型 DC Motor with Torque Output Simscape Multibody Model of my Robot 我想控制机器人的速度 Simscape 多
  • 从 Python 访问/调用 Simulink

    我想在 Simulink 中对系统进行建模 然后从 python 程序访问该模拟以为其提供新的条件或输入 我知道有一个模块允许您从 Python 访问 Matlab 引擎 但这有点不同 我想要一个在 Simulink 中建模的系统 并使用
  • 以编程方式连接两个子系统

    我正在尝试以编程方式重用我之前开发的一些自定义块 模型来构建一个复杂的模型 但我无法设法连接两个 PMC Port 这就是我所拥有的 Main system sys name model sys new system sys name op

随机推荐

  • C语言实现多级反馈队列调度算法

    include
  • java架构师进阶之路

    Java架构师 应该算是一些Java程序员们的一个职业目标了吧 很多码农码了五六年的代码也没能成为架构师 那成为Java架构师要掌握哪些技术呢 总体来说呢 有两方面 一个是基础技术 另一个就是组织能力和提出解决方案能力了 如果你是想成为Ja
  • Netty入门-Channel

    目录 Channel详解 Channel的特点 Channel接口方法 ChannelOutboundInvoker接口 AttributeMap接口 ChannelHandler接口 ChannelInboundHandler接口 Cha
  • 请取件

    Part1前言 最常见的鼠标平移算法是平行于水平面 地面 的 无论相机视角如何 平移时 相机的世界Z值始终不变 因为绝大多数场景都是在观察地面上的物体 而人类的行走总是平行于地面的 但是本文要介绍的另一种小众的平移算法则平行于视锥体的截面
  • JPA使用审计功能新增时, 不自动更新@LastModifiedDate和@LastModifiedBy字段

    JPA使用审计功能新增时 不自动更新 LastModifiedDate和 LastModifiedBy字段 疑问 查询源码 解决方案 疑问 JPA使用审计功能 网上有一大堆demo 但是使用时 会发现创建的时候会自动填写 LastModif
  • Mac安装homebrew报错curl: (7) Failed to connect to raw.githubusercontent.com port 443: Operation

    homebrew安装时 一般直接在终端直接输入命令 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install master install 但是这个方
  • Numpy/Pytorch之数据类型与强制类型转换

    目录 1 数据类型简介 Numpy Pytorch 2 Python的type 函数 3 Numpy Pytorch的dtype属性 4 Numpy中的类型转换 先聊聊我为什么会用到这个函数 不看跳过 astype 函数 输出 4 Pyto
  • 【线性表的原地逆置】

    目录 前言 一 顺序表 数组 一 双指针 二 单链表 一 模拟顺序表的双指针 交换的节点的值域 二 头插法 改变节点的指针域 三 递归实现 将整体链表反向 整体代码 总结 前言 打怪升级第一天 大家好 今天我们来了解一下数组和单链表的原地逆
  • (mybatis驼峰命名导致映射错误)

    今天在复习mybatis时遇到这样的一个问题 我数据库表的字段和我定义的实体类名不一致 中间有下划线 如下图 实体类 数据库字段 结果会导致部分查询数据是null 于是我首先想到了自己定义一个resultmap映射 给数据库字段取一个别名
  • Android 学习之多状态布局的一种实现方案

    开发应用的过程中 首页的控件越来越多 布局文件的代码已经到了爆表的程度 而且不同状态下首页各个控件的 Visibility 不同 每次新增状态都是一件头疼的事情 时常遗漏控件导致出错 和 YYY 大佬交流讨论后他给出了一种巧妙的方案 特此学
  • 人工智能数学基础:费马引理、罗尔定理、拉格朗日微分中值定理、柯西中值定理

    一 费马 Fermat 引理 费马 Fermat 引理 设函数f x 在点x0的某邻域U x0 内有定义 并且在x0处可导 如果对任意的x U x0 有f x f x0 或f x f xo 那么f x0 0 老猿认为费马引理就是说明 对于某
  • 简单通俗易懂:一个小例子完美解释Naive Bayes(朴素贝叶斯)分类器

    更多深度文章 请关注 https yq aliyun com cloud 最简单的解决方案通常是最强大的解决方案 而朴素贝叶斯就是一个很好的证明 尽管机器学习在过去几年取得了巨大的进步 但朴素贝叶斯已被证明不仅简单 而且快速 准确 可靠 它
  • 从原理到代码实践

    文章目录 1 损失函数原理 1 1 Classification Error 分类错误率 1 2 均方差损失 1 3 交叉熵损失函数 1 3 1 数学原理 1 3 2 代码实现 对于图像分类任务 模型最终是通过softmax操作输出一个概率
  • Java: String与其他数据的相互转化

    1 java lang包中的Byte Short Long Float Double类调用相应的类方法 将由 数字 字符组成的字符序列转化为相应的基本数据类型 public static byte parseByte String s th
  • 如何制作点餐小程序?

    随着移动互联网的发展 点餐小程序的出现越来越受到大家的欢迎 它方便快捷 可以随时随地点餐 特别是在疫情期间更受到了用户的喜爱 那么 如何制作一个点餐小程序呢 下面将会简单介绍一下步骤 并通过一个具体案例来解析运用了哪些技巧提升了效果 一 确
  • 容器 - unordered_map

    unordered map是C Boost库中的内容 这里的unordered指的是散列式的存储方式 unordered库提供了两个散列映射表 unordered map和unordered multimap 利用散列表代替了二叉树的实现
  • 11. Leaf-segment 分布式ID

    Spring Cloud 微服务系列文章 点击上方合集 1 开头 当应用程序只使用单个数据库时 可以使用数据库自增的方式来生成id 这种方式既简单 查询又快 然而 当应用程序需要进行分库分表时 即将数据分散到多个数据库和数据表中 使用数据库
  • catia如何将曲面加厚变为实体_CATIA如何将片体转换为实体?

    下面介绍一种在CATIA中将片体转换为实体的方法 1 首先打开CATIA软件 再打开需要曲面操作的模型零件 2 然后进入创成式外形设计模块 在软件界面的开始菜单栏中点击开始 形状 创成式外形设计 3 接下来从实体中提取面 先使用 提取 命令
  • 设计规范-导航、弹窗、视图

    常见导航样式 根据产品的特性 导航可以混合使用 体现形式多样化 不能为了追求多样化 滥用导航类型 扁平式导航 在一级页面提供导航栏 一般处于顶部 底部 适合频繁切换的模块 方便用户在不同的模块间操作 例 微信的底部导航栏 小红书的顶部 底部
  • LADRC的学习——用simulink搭建仿真模型

    作者 墨心 时间 2019 7 25 用simulink搭建仿真模型 前面两篇博客主要讲了ADRC的相关概念和知识 并且尝试着搭建模型和仿真 之后学习了PID的相关知识 了解了Kp Ki Kd三个参数的意义 接下来 主要根据高志强教授的论文