状态观测器ESO说明

状态观测器ESO

当我们需要对一个系统进行控制时,我们通常需要知道系统的输入和输出之间的关系。然而,实际系统中的输入信号可能受到噪声和干扰的影响,这使得我们无法准确地知道系统的真实输入信号。扩张状态观测器(ESO)算法的目标是通过建立一个状态观测器来估计输入信号中的扰动和噪声,从而去除它们,获得更准确的系统输出。

ESO算法的工作原理如下:

我们假设系统的输入信号由一个未知的扰动项和真实的输入信号组成。我们的目标是估计这个未知扰动项。
ESO算法通过构建一个状态观测器来实现这个目标。状态观测器由一组状态变量和一些参数组成。状态变量用于表示系统的状态,而参数用于根据系统的动态特性来估计输入信号中的扰动。
我们利用系统的动态特性,通过观测系统的输出和之前的状态估计来更新状态观测器的参数。具体来说,我们通过计算观测误差(实际输出与状态观测器估计的输出之间的差异),并使用这个误差来调整参数,从而使状态观测器能够更准确地估计出输入信号中的扰动。
通过不断迭代和更新,状态观测器可以逐渐优化其参数,从而不断提高对输入信号中扰动和噪声的估计精度。最终,我们可以通过减去状态观测器估计的扰动信号,去除输入信号中的干扰和噪声,得到更准确的系统输出信号。
简而言之,扩张状态观测器(ESO)算法利用系统的动态特性和观测误差来估计输入信号中的扰动和噪声,并将其从观测信号中滤除,从而得到更准确的系统输出。这种算法能够对系统进行自适应估计和补偿,提高系统的性能和控制效率。

PID+ESO抗扰动算法

#include <stdio.h>// 控制器状态结构体
typedef struct {float Kp;           // 比例系数float Ki;           // 积分系数float Kd;           // 微分系数float ESO_a0;       // ESO参数a0float ESO_a1;       // ESO参数a1float ESO_b0;       // ESO参数b0float last_z1;      // ESO上次观测的z1float last_z2;      // ESO上次观测的z2float last_e;       // PID上次误差float integral;     // PID积分项} ControllerState;// 更新扩张状态观测器
void updateESO(ControllerState *controller, float y, float u) {float z1 = controller->last_z1;float z2 = controller->last_z2;float error_z1 = y - z1;float z1_dot = controller->ESO_b0 * u + z2 + controller->ESO_a0 * error_z1;float z2_dot = controller->ESO_a1 * error_z1;// 采样周期T需要设定const float T = 0.01; // 示例采样周期controller->last_z1 += T * z1_dot;controller->last_z2 += T * z2_dot;
}// 更新PID控制器
float updatePID(ControllerState *controller, float setpoint, float measured) {float error = setpoint - measured;controller->integral += error;float derivative = error - controller->last_e;float output = controller->Kp * error + controller->Ki * controller->integral + controller->Kd * derivative;controller->last_e = error;// 校正输出,加上ESO估计的未知扰动output -= controller->last_z2;return output;
}int main() {ControllerState controller = {0.5, 0.1, 0.2, -1, -0.5, 1, 0, 0, 0, 0};float setpoint = 30.0;  // 目标值float measured_value = 25.0; // 实测值float control_input = 0.0; // 控制输入for (int t = 0; t < 100; t++) {// 更新ESOupdateESO(&controller, measured_value, control_input);// 更新PIDcontrol_input = updatePID(&controller, setpoint, measured_value);// 实际系统调用硬件相关的代码来更新控制输出,这里进行简单模拟measured_value += control_input * 0.1; // 假设系统的响应是线性的// 输出控制信息(实际使用时可能要发送给执行器设备)printf("Time: %d, Setpoint: %.2f, Measured: %.2f, Control Input: %.2f\n", t, setpoint, measured_value, control_input);}return 0;
}

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

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

相关文章

Hive学习(14)json解析get_json_object()函数

一、语法 目的&#xff1a;在一个标准JSON字符串中&#xff0c;按照指定方式抽取指定的字符串。 string get_json_object(string <json>, string <path>) 参数说明 json&#xff1a;必填。STRING类型。标准的JSON格式对象&#xff0c;格式为{Key:Value, Key:Val…

Vim基础操作

参考B站UP&#xff1a;正月点灯笼 vim入门教程&#xff08;共3讲&#xff09; 以下总结&#xff0c;部分搬运自评论区&#xff0c;楼主&#xff1a;-不是飞鱼QAQ&#xff0c;修改部分内容。 vim分为 命令 和 编辑 模式 i进入编辑模式&#xff08; - - INSERT - - &#xff09;…

Python多线程同步锁

Python同步锁 多线程是共用一个进程空间的&#xff0c;当多个线程要用到相同的数据&#xff0c;那么久会存在资源竞争和锁的问题。 锁是用来实现共享资源的同步访问。为每一个共享资源创建一个Lock对象&#xff0c;当需要访问共享资源的时候&#xff0c;调用acquire方法来获取…

目标检测再升级!YOLOv8模型训练和部署

YOLOv8 是 Ultralytics 开发的 YOLO&#xff08;You Only Look Once&#xff09;物体检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的SOTA模型&#xff0c;它建立在先前YOLO成功基础上&#xff0c;并引入了新功能和改进&#xff0c;以进一步提升性能和灵活性。它可…

Linux文件目录结构解析

一、前言 Linux操作系统采用了一种层次化的文件目录结构&#xff0c;这种结构为系统提供了良好的组织和管理文件的方式。下面是一个简单的Linux文件目录结构树&#xff0c;以便更直观地理解 / |-- bin |-- boot |-- dev |-- etc |-- home | |-- user1 | |-- user2 |-- lib…

chromium通信系统-ipcz系统(十)-chromium通信系统-ipcz系统(十一)-mojo binding

关于mojo binding的官方文档为mojo docs。 由于比较复杂&#xff0c;这里只做简单源码分析。 我们知道要实现rpc&#xff0c;必须实现客户端和服务端。 mojo 实现了一套领域语言&#xff0c;通过领域语言描述接口和数据&#xff0c; 再通过特有编译器编译成c代码。 这个过程会…

帮贡排序#洛谷

题目背景 在 absi2011 的帮派里&#xff0c;死号偏多。现在 absi2011 和帮主等人联合决定&#xff0c;要清除一些死号&#xff0c;加进一些新号&#xff0c;同时还要鼓励帮贡多的人&#xff0c;对帮派进行一番休整。 题目描述 目前帮派内共最多有一位帮主&#xff0c;两位副…

springboot集成cas客户端

Background 单点登录SSO(Single Sign ON)&#xff0c;指在多个应用系统中&#xff0c;只需登录一次&#xff0c;即可在多个应用系统之间共享登录。统一身份认证CAS&#xff08;Central Authentication Service&#xff09;是SSO的开源实现&#xff0c;利用CAS实现SSO可以很大程…

【Python学习】Python学习8-Number

目录 【Python学习】Python学习8-Number 前言在变量赋值时被创建Python支持四种不同的数据类型整型(Int)长整型(long integers&#xff09;浮点型(loating point real values)复数(complex numbers) Python Number 类型转换Python math 模块、cmath 模块Python数学函数Python随…

以太网交换基础

0x00 前言 以为主要的作用的笔记的记忆&#xff0c;所以多为问答的形式进行记录。 什么是以太网&#xff1f; 以太网是一种局域网技术&#xff0c;用于链接终端&#xff0c;进行网络通信。 什么是冲突域&#xff1f; 冲突域是指连接在同一公共介质上的所有节点的集合。 就…

【Leetcode】 447. 回旋镖的数量

文章目录 题目思路代码 题目 447. 回旋镖的数量 思路 问题要求计算平面上所有回旋镖的数量&#xff0c;即找到满足题设条件的点组合 (i, j, k)。回旋镖的定义是指有两个相同的距离&#xff0c;分别从点 i 到 j 和点 i 到 k。具体思路是&#xff1a; 遍历每个点&#xff0c…

Android将自定义View保存为Bitmap图片

Android将自定义View保存为Bitmap图片 private void createPdfImg() {//创建待分享的viewView view LayoutInflater.from(getContext()).inflate(R.layout.ecg_pdf_view, null);PdfEcgWaveView waveView view.findViewById(R.id.ecg_wave_view2);PdfEcgWaveView.DATA_PRE_SEC…

【数据结构 | 二叉树入门】

数据结构 | 二叉树入门 二叉树概念&#xff1a;二叉树特点&#xff1a;二叉树的基本形态特殊二叉树满二叉树完全二叉树 二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历 计算二叉树的节点个数计算叶子节点的个数树的高度求第k层节点个数 二叉树概念&#xff1a; 如下图…

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格&#xff1f; 1、方便管理&#xff1a;将营业执照转为excel格式&#xff0c;可以方便地进行管理和整理&#xff0c;快速查找需要的信息。 2、数据处理&#xff1a;Excel可以提供丰富的计算和数据分析功能&#xff0c;转化为excel后方便数据…

解决递归问题的六种方法

许多软件工程师在编程面试中遇到递归问题。 如果你想成为善于解决递归问题&#xff0c;学习这6个模板&#xff1a; 1.迭代 任何可以用循环解决的问题也可以用递归解决。 有时候递归提供了一个更简洁和优雅的解决方案&#xff0c;即使效率较低。 范例&#xff1a; - 按逆序遍…

12.字符串和正则表达式

使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要&#xff0c;正则表达式就是用于描述这些规则的工具&#xff0c;换句话说正则表达式是一种工具&#xff0c;它定义了字符串的匹配模式&#xff08;…

Ubuntu上安装VMware+win11系统手册

Ubuntu安装vmware 下载&#xff1a; Linux 版下载地址&#xff1a;https://www.vmware.com/go/getworkstation-linux 安装&#xff1a; sudo chmod x VMware-Workstation-Full-17.5.0-22583795.x86_64.bundle 执行安装命令&#xff1a; sudo ./VMware-Workstation-Full-17.5.0…

pytorch 分布式 Node/Worker/Rank等基础概念

分布式训练相关基本参数的概念如下: Definitions Node - A physical instance or a container; maps to the unit that the job manager works with. Worker - A worker in the context of distributed training. WorkerGroup - The set of workers that execute the same f…

AArch64 memory management学习(二)

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。AArch64 memory management学习一共分为两章&#xff0c;这是第二章。…

python基础教程八(循环1)

1. while循环 为避免多次重复的代码&#xff0c;我们会用到循环 while (condition): 执行语句 while循环的结构非常简单只要条件满足就一直循环直到&#xff0c;条件不满足为止。 例子如下&#xff1a; x1 while x<100:print(x)x1结果就是最简单的输出1-100的数字 while…