自抗扰控制ADRC原理解析及案例应用

news2024/12/26 15:16:19

1. ADRC基本原理

1.1 ADRC的基本概念

自抗扰控制(Active Disturbance Rejection Control,ADRC)是一种先进的控制策略,由韩京清研究员于1998年提出。ADRC的核心思想是将系统内部和外部的不确定性因素视为总扰动,并通过扩张状态观测器(Extended State Observer,ESO)对其进行估计和补偿。这种方法不依赖于被控对象的精确数学模型,使得ADRC在处理非线性、时变以及存在未知扰动的复杂系统控制中表现出色。

ADRC的基本结构包括三个主要部分:跟踪微分器(Tracking Differentiator,TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(Nonlinear State Error Feedback,NLSEF)。TD用于提取系统输入的连续信号和微分信号;ESO用于估计系统状态和总扰动;NLSEF则根据ESO的输出来设计控制律,实现对系统状态的精确控制。

1.2 ADRC的发展历史

自抗扰控制技术自提出以来,经历了从理论探索到工程应用的逐步发展。最初,ADRC主要在学术界进行研究,随着对其理论的深入理解和技术的进步,ADRC开始被应用于各种工业和工程领域。例如,在电机控制、机器人技术、汽车悬挂系统以及飞行控制系统中,ADRC都展现出了其卓越的控制性能。

随着计算机技术的发展,ADRC的实现变得更加高效和便捷。现代的ADRC控制器可以很容易地集成到各种控制系统中,提供实时的扰动估计和补偿。此外,ADRC的参数整定相对简单,通常只需要调整一个参数——带宽,这大大简化了控制器的设计和调试过程。

ADRC的另一个重要发展方向是与其他控制策略的融合,如模糊控制、神经网络和自适应控制等,以进一步提高系统的鲁棒性和适应性。这些融合策略不仅拓宽了ADRC的应用范围,也提高了其在复杂环境下的性能表现。

2. ADRC的工作原理

2.1 扩张状态观测器ESO

扩张状态观测器(Extended State Observer,ESO)是ADRC中的关键组件之一。ESO的主要任务是估计系统状态和总扰动。在ADRC中,总扰动被视为系统状态的一部分,与系统状态一起被观测和估计。ESO的设计通常基于系统动态方程的线性化或近似模型,其输出包括系统状态的估计值和总扰动的估计值。

ESO的一般形式可以表示为:

\dot{\hat{x_{1}}}=\dot{\hat{x_{2}}}

\dot{\hat{x_{2}}}=\dot{\hat{x_{3}}}+l_{1}(y-\dot{\hat{x_{1}}})

\dot{\hat{x_{3}}}=-l_{2}\dot{\hat{x_{3}}}+l_{1}y

其中,\dot{\hat{x_{1}}}\dot{\hat{x_{2}}}​ 和 \dot{\hat{x_{3}}}分别是系统状态和总扰动的估计值,y 是系统的测量输出,l_{1}​ 和 l_{2}​ 是ESO的参数。

2.2 跟踪微分器TD

跟踪微分器(Tracking Differentiator,TD)用于生成跟踪信号及其微分信号。TD的设计目的是解决传统微分器在处理不连续或带噪声的测量信号时的问题。TD能够提供一个连续且无噪声的信号,同时保持对阶跃输入的快速响应。

TD的数学表达式为:

TD(u(t),y(t),v(t))=\begin{bmatrix} v(t)\\ \dot{v(t)} \end{bmatrix}

其中,u(t) 是控制输入,y(t) 是系统输出,v(t) 是TD的输出,表示跟踪信号,而 \dot{v(t)} 是 v(t) 的导数,即跟踪信号的微分。

2.3 非线性状态误差反馈控制律NLSEF

非线性状态误差反馈控制律(Nonlinear State Error Feedback,NLSEF)是ADRC的最后一个环节,负责根据ESO和TD提供的信息生成控制信号。NLSEF的设计通常基于最速控制理论或非线性控制理论,以实现对系统状态的快速且精确的控制。

NLSEF的控制律可以表示为:

u(t)=-k_{1}e(t)-k_{2}\dot{e(t)}-k_{3}e^{\alpha }(t)

其中,e(t) 是系统输出与期望输出之间的误差,\dot{e(t)} 是误差的导数,k_{1}​、k_{2}​ 和 k_{3}​ 是控制律的参数,\alpha 是非线性项的指数,用于增强控制律的鲁棒性。

3. ADRC的参数设计

3.1 参数整定方法

参数整定是ADRC应用中的关键步骤,它直接影响到控制效果和系统稳定性。ADRC的参数主要包括扩张状态观测器(ESO)的参数和非线性状态误差反馈控制律(NLSEF)的参数。

  • 扩张状态观测器(ESO)参数:ESO的参数决定了对系统状态和扰动的估计精度。参数设计需要考虑观测器的收敛速度和对噪声的抑制能力。一般而言,较大的观测器增益可以加快收敛速度,但同时也可能放大噪声的影响。
  • 非线性状态误差反馈控制律(NLSEF)参数:NLSEF的参数设计涉及到控制律的非线性特性,这些特性可以提供更好的鲁棒性和适应性。参数设计需要平衡系统的超调、稳定性和响应速度。

参数整定方法通常包括基于经验的调整、基于模型的优化以及基于仿真的迭代优化等。在实际应用中,参数整定往往需要结合系统特性和控制需求进行多次调整和验证。

3.2 参数对系统性能的影响

参数的选择对ADRC控制系统的性能有着显著的影响。

  • 收敛速度:参数设置可以影响系统达到稳态所需的时间。较大的ESO增益可以加快收敛速度,但过大可能导致系统过冲。
  • 超调与稳定性:NLSEF的参数可以调整系统的超调量和稳定性。适当的参数设置可以减少超调,提高系统的稳定性。
  • 鲁棒性:ADRC的参数设计需要考虑到系统的不确定性和外部扰动。合理的参数可以提高系统对这些不确定性的抵抗能力。
  • 适应性:参数的调整可以提高系统对参数变化和操作条件变化的适应性,确保在不同工况下都能保持良好的控制效果。

车道保持辅助系统(LKAS)的ADRC实例

自抗扰控制(ADRC)可以应用于自动驾驶汽车的某些控制问题,例如车道保持辅助系统(Lane Keeping Assist System, LKAS)。以下是一个ADRC应用于车道保持辅助系统的例子。假设自动驾驶汽车的横向控制模型可以简化为一个二阶系统,用于描述车辆相对于车道中心的横向位置 y 和横向速度 \dot{y} 的动态行为:

m\ddot{y}+b\dot{y}+ky=u

其中:

  • m 是车辆的质量
  • b 是与横向速度相关的阻尼系数
  • k 是与横向位置相关的弹性系数
  • u 是控制输入,可以是转向角或转向力矩

ADRC控制器的目标是使车辆的横向位置 y 跟踪车道中心线。

ADRC控制器设计

扩张状态观测器(ESO): 用来估计车辆的横向位置 y 和横向速度 \dot{y}​,以及总扰动 d

\dot{\hat{y}}=\hat{\dot{y}}+\hat{d}

\hat{\dot{y}}=-\frac{a_{1}}{m}(\hat{y}-y_{ref})-\frac{a_{2}}{m}\hat{\dot{y_{2}}}+\frac{1}{m}u

其中,y_{ref} 是车道中心线的参考位置。

非线性状态误差反馈控制律(NLSEF):

u=k_{p}(\hat{y}-y_{ref})+k_{i}\int (\hat{y}-y_{ref})dt+k_{d}(\hat{\dot{y}}-\dot{y_{ref}})

其中,k_{p}​,k_{i}k_{d}​ 是控制增益,\dot{y_{ref}}​ 是车道中心线的参考横向速度。

总扰动估计器:

\dot{\hat{d}}=-\frac{a_{3}}{m}(\hat{y}-{y_{ref}})

其中,a_{3}​ 是估计器参数。

C++代码示例

#include <iostream>
#include <cmath>

// 系统参数
const double m = 1500; // 车辆质量,单位:kg
const double b = 100; // 阻尼系数,单位:Ns/m
const double k = 20000; // 弹性系数,单位:N/m
const double a1 = 30; // ESO参数
const double a2 = 5; // ESO参数
const double a3 = 10; // 总扰动估计器参数

// 控制参数
const double kp = 1; // 比例增益
const double ki = 0.1; // 积分增益
const double kd = 0.5; // 微分增益

// 初始状态
double y = 0; // 横向位置
double y_dot = 0; // 横向速度
double y_hat = 0; // 横向位置估计
double y_dot_hat = 0; // 横向速度估计
double d_hat = 0; // 总扰动估计

// 参考轨迹
double y_ref = 0; // 车道中心线的参考位置

// 时间参数
const double dt = 0.01; // 时间步长,单位:s
double t = 0; // 当前时间

// 模拟函数
void simulateADRC() {
    while (true) {
        t += dt;

        // 更新估计值
        y_dot_hat += (-a1 * (y_hat - y_ref) - a2 * y_dot_hat + u / m) * dt;
        y_hat += y_dot_hat * dt;
        d_hat += (-a3 * (y_hat - y_ref)) * dt;

        // 计算控制输入
        double u = kp * (y_hat - y_ref) + ki * (y_hat - y_ref) * dt + kd * (y_dot_hat - 0); // 假设车道中心线速度为0

        // 输出当前状态和控制输入
        std::cout << "Time: " << t << ", y: " << y << ", y_dot: " << y_dot << ", u: " << u << std::endl;

        // 更新车辆的横向位置和速度(这里简化处理,假设车辆响应控制输入)
        y += y_dot * dt;
        y_dot += (u - b * y_dot - k * y) / m * dt;

        // 检查是否达到模拟时间
        if (t > 10) break;
    }
}

int main() {
    simulateADRC();
    return 0;
}

 

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

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

相关文章

AtCoder Beginner Contest 367 A~F

A.Shout Everyday&#xff08;枚举&#xff09; 题意&#xff1a; 在 A t C o d e r AtCoder AtCoder 王国&#xff0c;居民们每天都要在 A A A 点大声喊出他们对章鱼烧的热爱。 住在 A t C o d e r AtCoder AtCoder 王国的高桥每天 B B B 点睡觉&#xff0c; C C C 点…

day17:一文弄懂“无参装饰器”、“有参装饰器”和“叠加装饰器”

目录 一、无参装饰器1. 什么是装饰器2. 为何要用装饰器3. 如何用解决方案一&#xff1a;失败&#xff0c;优化见↓↓↓解决方案二&#xff1a;失败&#xff0c;优化见↓↓↓解决方案三&#xff1a;失败&#xff0c;优化见↓↓↓方案三的优化一&#xff1a;将index的参数写活了方…

重磅发布!天途多自由度无人机调试台

无人机调试、测试和试飞很容易受空域、场地、环境、失控炸机和操作失误等限制。天途TE55多自由度无人机整机调试台应运而生&#xff01; 突破空域限制 天途TE55多自由度无人机整机调试台&#xff0c;突破场地空域限制&#xff0c;不到0.7平米的空间&#xff0c;即可完成小型无人…

[数据集][目标检测]建筑工地楼层空洞检测数据集VOC+YOLO格式2588张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2588 标注数量(xml文件个数)&#xff1a;2588 标注数量(txt文件个数)&#xff1a;2588 标注…

基于vue框架的办公用品管理系统i52wc(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;部门,员工,办公用品,入库记录,出库记录,申领信息 开题报告内容 基于Vue框架的办公用品管理系统 开题报告 一、引言 随着企业规模的扩大和日常运营的复杂化&#xff0c;办公用品的管理成为了一个不容忽视的重要环节。传统的办公用品管…

Java中接口

接口的定义和使用 练习 public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name…

ChatGPT、Claude 和 Gemini 在数据分析方面的比较(第 2 部分)

欢迎来到雲闪世界。欢迎回到我的系列文章的第二部分&#xff0c;ChatGPT、Claude 和 Gemini 在数据分析方面的比较&#xff01;在本系列中&#xff0c;我旨在比较这些 AI 工具在各种数据科学和分析任务中的表现&#xff0c;以帮助其他数据爱好者和专业人士根据自己的需求选择最…

告别图片堆成山, 图片转pdf工具:你的整理小能手来啦!

嘿&#xff0c;各位小伙伴&#xff01;你们有没有觉得&#xff0c;现在拍照比吃饭还日常&#xff0c;手机、电脑里堆满了照片&#xff0c;找起来简直跟大海捞针似的&#xff1f;别急&#xff0c;我今儿个就来给你们支个招——图片转PDF大法&#xff0c;一键变成整整齐齐的PDF文…

【Java-异常】

异常&#xff1a;程序在运行期间产生的一些错误 Java通过API中Throwable类的众多子类描述各种不同的异常。Java异常都是对象&#xff0c;是Throwable子类的实例。 Throwable可以划分为两个大类&#xff1a; Error错误类&#xff1a;会导致JVM虚拟机宕机 Exception异常类&…

Java---二维数组

一.数组的维数 假象&#xff1a;一维数组 二维数组&#xff1a;数组中的元素是一维数组 二.五子棋游戏 import javax.swing.*;public class Array06 {static String[][] matrix new String[15][15];static String black "⚫";static String white "⚪"…

SQL进阶技巧:多维分析之如何还原任意维度组合下的维度列簇名称?【利用grouping_id逆向分析】

目 录 0 需求描述 1 数据准备 2 问题分析 3 小结 0 需求描述 现有用户访问日志表 visit_log ,每一行数据表示一条用户访问日志。 需求: (1)按照如下维度组合 (province), (province, city), (province, city, device_type) 计算用户访问量,要求一条SQL语句统计所所…

[000-01-018].第3节:Linux环境下ElasticSearch环境搭建

我的后端学习笔记大纲 我的ElasticSearch学习大纲 1.Linux系统搭建ES环境&#xff1a; 1.1.单机版&#xff1a; a.安装ES-7.8版本 1.下载ES: 2.上传与解压&#xff1a;将下载的tar包上传到服务器software目录下&#xff0c;然后解压缩&#xff1a;tar -zxvf elasticsearch-7…

logstash入门学习

1、入门示例 1.1、安装 Redhat 平台 rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch cat > /etc/yum.repos.d/logstash.repo <<EOF [logstash-5.0] namelogstash repository for 5.0.x packages baseurlhttp://packages.elasticsearch.org…

以太坊 Pectra 升级四个月倒计时,哪些更新值得期待?

撰文&#xff1a;Ignas&#xff0c;DeFi Research 编译&#xff1a;J1N&#xff0c;Techub News 现在市场有充分的理由看空以太坊。因为自 2023 年初的市场低点以来&#xff0c; SOL 的涨幅比以太坊高 6.8 倍&#xff0c; 过去两年内 ETH/BTC 交易对的跌幅为 47%。 现在是以太…

Maven高级使用指南

在开发大型项目时&#xff0c;Maven作为一个强大的构建和项目管理工具&#xff0c;能显著提升项目管理和构建的效率。然而&#xff0c;随着项目的扩大&#xff0c;维护和管理的复杂性也随之增加。本文将探讨一些高级的Maven用法和解决方案&#xff0c;以帮助你更好地管理大型项…

在ISIS中什么是IP从地址

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

win11安装python及pycharm与webots联合仿真

1、查看Windows系统 是否已安装Python及版本 【冰糖Python】Windows系统 查看已安装的Python版本_怎么确定windows上成功安装python-CSDN博客 好&#xff0c;确认没装下面装python37 2、安装python3.7.9 参考教程Python 3.82安装教程&#xff08;Windows11、超详细版&#x…

Linux Shell 编程基础入门(一)

&#x1f600;前言 本篇博文是关于自动化工具Shell 编程的基本介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

微服务:配置管理和配置热更新

参考&#xff1a;黑马程序员之微服务 &#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、引言 二、配置共享 1. 添加共享配置到nacos &#xff08;1&#xff09;jdbc的共享配置 shared…

点灯案例优化(三)宏定义特定位名称

前面利用位运算对代码进行二次优化以后&#xff0c;确实可读性更好&#xff0c;精确性更高了。但是吧&#xff0c;你乍一看这个代码 你可能一下都反应不过来这些的啥意思了&#xff0c;表达式右边上来就是一顿运算&#xff0c;可能刚开始大多数人都看不懂这写的什么&#xff0c…