LADRC的学习——总概

2023-05-16

作者:墨心; 日期:2019.7.25;

学习LADRC结构:

1.学习PID的相关知识,作为学习ADRC的基础铺垫,在simulink中搭建模块,通过调节参数,看调节效果,分析Kp,Ki,Kd参数对系统的影响。
2. 介绍ADRC的一些相关知识及其理解LADRC相关的参数及其意义,用Simulink对模型进行搭建,进行仿真测试。
3. 然后通过对论文的阅读,在Simulink中换被控对象,调节参数,看LADRC控制器是否满足控制要求。
4. 接下来理解LADRC的基本思路,通过Matlab编程,来理解实现离散LADRC功能,为以后在其他仿麦呢应用作为铺垫。(难点—需要时间会长一些)
5. 在以后项目中,利用实际工程来利用LADRC。(可能以后会有更新)

LADRC介绍

1.引用论文及其作者介绍

引用文献作者:
韩京清:韩京清,系统与控制专家,我国控制理论和应用的早期开拓者之一。用最优控制理论提出了拦截问题中新的制导概念和方法;在国内率先推动控制系统计算机辅助设计软件的开发和研究;创造性地提出了计算人口“总和生育率”的“生育基数法”;创建了自抗扰控制技术,为我国控制理论与应用的发展作出了重要贡献。(这里来自百度百科,具体作者信息大家可以自己百度,韩老师是ADRC方法的提出者)

高志强:高志强于1987年和1990年在美国圣母大学分别获得电机工程的硕士和博士学位,从1995年起与韩京清研究员长期合作,全面开展自抗扰控制技术的应用研究,使其突破了参数整定的瓶颈口,以高效、鲁棒、节能、简单易行的特点成为工业控制除PID外又一用途广泛的有力工具。自抗扰技术近年来在国内外学术界也受到了普遍的关注。

参考文献:

[1]韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002(03):13-18.

[2]Zhiqiang Gao. Scaling and bandwidth-parameterization based controller tuning[P]. American Control Conference, 2003. Proceedings of the 2003,2003.

2.ADRC结构及其分析介绍

从传统 PID 的原理出发 , 分析了它的优缺点,利用非线性机制来开发了一些具有特殊功能的环节 : 跟踪微分器 (TD) , 扩张状态观测器 (ESO) , 非线性 PID(NPID) 等,并以此组合出高品质的新型控制器 - 自抗扰控制器 (ADRC - Active Disturbances Rejection Controller) , 从而形成了新的“自抗扰控制”技术。

PID 的优点 : 靠控制目标与实际行为之间的误差来确定消除此误差的控制策略。
PID 的缺点 : ①误差的取法 ; ②由误差 e 提取de/dt 的办法 ; ③“加权和”策略不一定最好 ; ④积分反馈有许多副作用。

ADRC结构如下:
在这里插入图片描述
其结构分为这几个部分,安排过渡过程,非线性反馈,扩张状态观测器(ESO - Extended state observer),被控对象等这几个主要部分,接下来按照引文文献1[1],一一讲解。

a.安排过渡过程
因为直接用误差的方法不一定好,因为e = r - y这样的方法容易出现超调,这样对于低扰动-高精度控制不能满足要求。
因此安排一个过渡过程v1(t),v2(t)为微分信号,采用的是e = v1(t) - y,有跟踪微分器的阶跃响应为:
在这里插入图片描述
其中变量h为步长,上式中x1,x2为输入向量,r决定跟随速度,h0决定滤波作用,fst(v1,v2,h,r,h)为:
在这里插入图片描述
其中a,d,a0按照系统调节的参数,sgn为符号函数。

b.扩张状态观测器(ESO)
在这里插入图片描述
这里为扩张状态观测器,其中beta01,beta02,beta03,alpha1,alpha2.,epsilon1都为参数然后z的一阶导和z都为状态变量,其中fal函数为:
在这里插入图片描述

c.非线性PID
利用跟踪微分器 ( TD) , 把经典 PID 改造成“非线性 PID ”,如图所示:
在这里插入图片描述
这里TD(跟踪微分器)给出跟踪输出y的量 z1及其微分z2; 误差、积分、微分是由安排的过渡过程和TD
的输出 z1 , z2 来产生的。
在这里插入图片描述
把原先的“加权和”改成“非线性组合”而得“非线性 PID ”。 采用上面提到的fal 函数具有:小误差 , 大增益 ; 大误差 , 小增益的特性。
在这里插入图片描述

3.ADRC算法

这里也是完全采用韩京清老师的算法思路进行介绍,上面介绍的部分是从数学上推导出来的连续的表达式,但是我们在计算机处理中,或者在现实生活中应用采用的是离散的形式。下面部分是韩老师给出的离散算法部分截屏:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.Matalb编程实现并且检验(这个部分不完善,我个人理解仅仅完成一部分,希望能够有人指正和讨论)

在这里以上内容完全是根据韩老师的论文,见引用文献1截屏抄录,仅仅只加上一个自我的浅薄理解。接下来的部分是个人自己按照韩老师论文的自己用matlab编程实现(是否正确还不太确定,希望大家讨论指正),里面注释用中文再次打开会乱码,因此用自己的Chinglish作为注释,还望不要嘲笑。

代码部分:
a.fst函数代码实现:

%%%
%Input Parameter:
%x1: Input vector1
%x2: Input vector2
%r : The speed of element;It up to tracking speed
%h : The filter of element;It determines the strength of filt.
%x : This is input vector.
%
%Output Parameter:
%y : Function output value.
%%%
function y = fst_function(x1,x2,r,h)

Length1 = length(x1);
% Length2 = length(x2);

% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length1);
a0 = zeros(1,Length1);
a = zeros(1,Length1);

% These two parameters are constants.
d  =  r*h;  % This parameter is known.
d0 =  d*h;  % Known.

  for i = 1:Length1
     % This part can get the value of three parameters.
     % get y a0 a,respectively.
     y(i)  =  x1(i) + h*x2(i);  
     a0(i)  = power(d.^2 + 8*r*(abs(y(i))),1/2);
     if abs(y(i)) > d0
       a(i) = x2(i) + (a0(i) - d)./2;
     end
     if abs(y(i)) <= d0
       a(i) = x2(i) + y(i)./h;
     end
     
     %This is fst function.
     if abs(a(i)) <= d
        y(i) = -r*a(i)./d;
     end
     if abs(a(i)) > d
        y(i) = -r*sign(a(i));    
     end
  end
end

这里是fst函数的fst_function函数,里面参数为随意设置来检验,如下在command windows窗口输入部分:

>> x1 = 0.1:0.2:10;
>> x2 = x1 + 0.01*rand;
>> r = 4;
>> h = 3;
>> y = fst_function(x1,x2,r,h);
>> plot(x1,y);

得到结果为:
在这里插入图片描述
b.fal函数实现

%This function is fal function
%Input Parameter:
%alpha  : Parameter1
%delta  : Parameter2
%epsilon: Input Vector
%
%Output Parameter:
%y : Function output value.
%%%
function y = fal_function(alpha,delta,epsilon) 

Length = length(epsilon);

% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length);

if delta <= 0
   error("Delta must greater than to zero"); 
end

for i = 1:Length

    if abs(epsilon(i)) > delta 
       y(i) = (abs(epsilon(i)).^alpha)*sign(epsilon(i));
    end
    if abs(epsilon(i)) <= delta && delta > 0
       y(i) = epsilon(i)./(delta.^(1 - alpha));
    end

end
end

这里是fst函数的fal_function函数,里面参数为随意设置来检验,如下在command windows窗口输入部分:

>> alpha = 3;
>> delta = 7;
>> epsilon = -19.9:0.1:20;
>> y = fal_function(alpha,delta,epsilon);
>> plot(epsilon,y);

得到结果为:
在这里插入图片描述

c.根据上述描述的算法,整体总的编程(没有实现成功,希望可以和大家讨论)

% TD + ESO + NLSEF = ADRC
function y = ADRC_Algorithm(Length)

% Call fst and fal function below.
fst = @fst_function;
fal = @fal_function;

% define the length of the variables.
% This can achieve smooth operation.
v1 = zeros(1,Length + 1);
v2 = zeros(1,Length + 1);
Z1 = zeros(1,Length + 1);
Z2 = zeros(1,Length + 1);
Z3 = zeros(1,Length + 1);
epsilon1 = zeros(1,Length + 1);
u0 = zeros(1,Length + 1);
e1 = zeros(1,Length + 1);
e2 = zeros(1,Length + 1);
u = zeros(1,Length + 1);

% Set System Parameters.
r = 0.1;      % r :Speed factor ;It depends on the tracking speed.
h0 = 4;       % h :Filter factor;It determines the strength of the filter.

% Set initial value.
v1(1) = 0.1;  % This is v1(0)
v2(1) = 0.2;  % This is v2(0)
Z1(1) = 0.5;  % This is Z1(0)
Z2(1) = 0.1;  % This is Z2(0)
Z3(1) = 0.7;  % This is Z3(0)
v0 = 8; %This is the Pro_Set or expectation value.(vital)

beta01 = 0.2;
beta02 = 0.3;
beta03 = 0.4;
b = 0.4;
delta = 3.5;

alpha1 = 0.5; %
alpha2 = 0.25; %

% Implemente algorithms and updates the data of parameters in the loop.
for i = 1:Length  
   
    %Arrange the Transition Process
    v1(i+1) = v1(i) + h*v2(i);
    v2(i+1) = v2(i) + h*fst(v1(i) - v0,v2(k),r,h0);
    
    %Evaluate the state and total disturbance.
    %ESO Equation
    epsilon1(i) = Z1(i) - y(i);
    
    %f0(i) = z1(k) + z2(k);   %This function is known,but I don't know its expression.
    %u(i) = u0 - (z3(i) + f0(i))./b;
   
    %Control yolume formation 
    u0(i) = beta01*fal(e1(i),a1pha1,delta) + beta02*fal(e2(i),alpha2,delta);
    u(i) = u0(i) + Z3(i)/b;
    
    Z1(i+1) = Z1(i) + h*(Z2(i) - beta01*epsilon1(i));
    Z2(i+1) = Z2(i) + h*(Z3(i) - beta02*fal(epsilon1(i),alpha1,delta)) + b*u(i);
    Z3(i+1) = Z3(i) - h*beta03*fal(epsilon1(i),alpha2,delta);
    
    %Control yolume formation
    e1(i) = v1(i) - Z1(i);
    e2(i) = v2(i) - Z2(i);
    
    %data update
    v1(i) = v1(i+1);
    v2(i) = v2(i+1);
    
    Z1(i) = Z1(i+1);
    Z2(i) = Z2(i+1);
    Z3(i) = Z3(i+1);
    
end
end

%This function is fst function
%%%
%Input Parameter:
%x1: Input vector1
%x2: Input vector2
%r : The speed of element;It up to tracking speed
%h : The filter of element;It determines the strength of filt.
%x : This is input vector.
%
%Output Parameter:
%y : Function output value.
%%%
function y = fst_function(x1,x2,r,h)

Length1 = length(x1);
% Length2 = length(x2);

% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length1);
a0 = zeros(1,Length1);
a = zeros(1,Length1);

% These two parameters are constants.
d  =  r*h;  % This parameter is known.
d0 =  d*h;  % Known.

  for i = 1:Length1
     % This part can get the value of three parameters.
     % get y a0 a,respectively.
     y(i)  =  x1(i) + h*x2(i);  
     a0(i)  = power(d.^2 + 8*r*(abs(y(i))),1/2);
     if abs(y(i)) > d0
       a(i) = x2(i) + (a0(i) - d)./2;
     end
     if abs(y(i)) <= d0
       a(i) = x2(i) + y(i)./h;
     end
     
     %This is fst function.
     if abs(a(i)) <= d
        y(i) = -r*a(i)./d;
     end
     if abs(a(i)) > d
        y(i) = -r*sign(a(i));    
     end
  end
end

%This function is fal function
%Input Parameter:
%alpha  : Input vector1
%delta  : Input vector2
%epsilon:
%
%Output Parameter:
%y : Function output value.
%%%
function y = fal_function(alpha,delta,epsilon) 

Length = length(epsilon);

% define the length of the variables.
% This can achieve smooth operation.
y = zeros(1,Length);

if delta <= 0
   error("Delta must greater than to zero"); 
end

for i = 1:Length

    if abs(epsilon(i)) > delta 
       y(i) = (abs(epsilon(i)).^alpha)*sign(epsilon(i));
    end
    if abs(epsilon(i)) <= delta && delta > 0
       y(i) = epsilon(i)./(delta.^(1 - alpha));
    end

end
end

在这里,存在的问题是f0在论文中没有找到其表达式,随意的添加了一个式子,还有存在参数调整的问题还有初始值设定的问题。这些都需要在接下来学习中理解和加入实际的一些工程进行调节,来理解其中意义。
这是学习的开端,接下来是进行PID理解的学习,作为理解ADRC的开始,这是我的第一篇博客,自己以后将会以自己的理解,学习后分享自己的成果,然后大家一起讨论进步。

如果在文章有哪里提到,没有标注来源的请评论我,我一定补充上来源,如果有侵权的地方也请联系我,我尽快删除。

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

LADRC的学习——总概 的相关文章

  • 视觉SLAM理论——位姿的理解与间接求解

    目录 xff1a 位姿的定义位姿与变换矩阵的区别与联系位姿的求解方法 位姿的定义 在SLAM中 xff0c 位姿是世界坐标系到相机坐标系的变换 xff0c 包括旋转与平移 根据以上定义可以衍生以下几个问题 xff1a 1 世界坐标系在哪 x
  • 线性最小均方误差算法(LMSE),最小二乘法(LS)

    目录 背景正交投影引理LMSE算法LS算法直线拟合 背景 对于一个系统 xff0c 在给予一定的输入 xff0c 那么通常都会产生相对应的输出 在实际的系统中 xff0c 这样的输出必然伴随着噪声 xff0c 这样被噪声污染的输出通常是传感
  • 无人机,动力系统建模

    建模目的 无人机动力系统包括 xff1a 螺旋桨 电机 电调及电池 建模流程图如下 xff08 图片来源 多旋翼飞行器设计与控制 M 全权 xff09 xff1a 经过误差结算后 xff0c 将误差信息转换为螺旋桨的升力与转矩 xff0c
  • 寻找APM中EKF的五大公式

    EKF核心代码位置 AP NavEKF2 cpp 进入该函数 进入该函数 xff0c 然后可以看到关键部分 xff0c 也即卡尔曼五个公式的地方 下面介绍每个公式的具体位置 28状态值 首先要知道选用的状态值有哪些 xff0c 28状态值
  • 【PX4 EKF simulink仿真程序解析】(一)初始化

    PX4 EKF simulink仿真程序解析 xff08 一 xff09 初始化 整体框架如下 xff1a 进入InertialNavFliter xff0c 整体框架如下 xff1a 初始化过程包括协方差初始化 状态向量初始化 其中包括测
  • C++——三种继承方式与三种访问权限的相互组合

    三种访问权限 public 可以被任意实体访问 protected 只允许子类及本类的成员函数访问 private 只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 private 继承 组合结果 基类中 继
  • 小米路由器部分机型刷原生Openwrt系统

    小米路由器的部分机型在官网没有开发版的固件 xff0c 不支持直接开启ssh xff0c 可以通过OpenWRTInvasion工具解决 本文以小米路由器4为例 xff1a 在openwrt官网的设备列表中找到对应型号 xff0c 按照页面
  • qt的安装与卸载

    通常情况下 xff0c 有两种安装方法 xff1a 1 直接在命令行安装 sudo apt span class hljs keyword get span install qt5 span class hljs keyword defau
  • 固件提取

    前言使用工具识别芯片一 摘取芯片二 制作U盘编程器三 RT809H编程器读取eMMC芯片数据四 总结 前言 无处不在的物联网设备 xff0c 也可能成为无所不在的安全隐患 xff0c 物联网安全问题一直是困扰物联网快速发展的一大难题 作为安
  • xshell评估过期解决办法,非常简单

    首先 xff0c 你的xshell不要卸载 xff0c 不需要动任何地方 进官网 https www netsarang com zh xff0c 翻到最下面 xff0c 下载那里点家庭 学校免费 然后会跳转到下面这个界面 xff0c 按图
  • vscode配置markdown,安装插件

    一 概述 最近迷上了MarkDown xff0c 所以进行了学习 xff0c 首先是编辑器的选择 xff0c 可以参考这篇文章 xff1a 好用的MARKDOWN编辑器一览 我本人并没有选择其中的任意一款进行尝试 xff0c 因为我个人十分
  • Vs2019重新生成解决方案时报错

    解决办法 xff1a Release模式下 gt 属性 gt 高级 gt 高级属性 gt 全程序优化 将这里的默认项 使用链接时间代码生成 改为 无全程序优化 xff0c 接下来就可以运行了
  • 指针常量和常量指针

    参考 xff1a C语言 常量指针 指针常量以及指向常量的指针常量三者区别详解 望崖的博客 CSDN博客 常量指针和指针常量的区别
  • LW_OOPC 宏配置及使用指南

    LW OOPC 宏配置及使用指南 摘抄 xff1a https github com Akagi201 lw oopc LW OOPC 是一套轻量级的面向对象 C 语言编程框架 它是一套 C 语言的宏 xff0c 总共 1 个 h 文件 如

随机推荐

  • 十个值得学习的c开源项目(嵌入式)

    开源世界有许多优秀的开源项目 xff0c 我选取其中十个最优秀的 最轻量级的C语言的项目 xff0c 希望可以为C语言开发人员提供参考 十个最值得阅读学习的C开源项目代码 1 Webbench 2 Tinyhttpd 3 cJSON 4 C
  • 树莓派开机无法进入桌面的解决办法

    1 初次开机会出现 34 raspi config 34 这个界面 xff0c xff08 如下图 xff09 如果不是初装的系统 xff0c 也可以输入命令 xff1a sudo raspi config xff0c 调出此界面 2 如果
  • Xshell 6, 7 已过期的解决方案

    公开版的Xshell一段时间后就评估失效 xff0c 很麻烦 xff0c 下面的方法可以在官网下载个人免费版本 xff0c 常用功能都有亲测有效 xff01 就算之前安装过已经过期的Xshell也没关系 1 首先进入 xff1a https
  • C语言网络编程(1)— UDP通信

    C语言网络编程 xff08 1 xff09 UDP通信 一 socket 我们要进行网络通信 xff0c 那么就要用到socket xff0c socket即网络套接字 xff0c 应用程序可以通过它发送或接收数据 xff0c 可对其进行像
  • C语言网络编程(2)— TCP通信

    C语言网络编程 xff08 2 xff09 TCP通信 一 TCP客户端 1 建立连接 我们要使用到socket xff0c 首先首先我们添加要使用的头文件 span class token macro property span clas
  • 搭建kubernetes v1.21.5 和 kubesphere v3.2.1

    一 准备一台干净的centos7 6机器 二 关闭防火墙打上相关补丁和相关系统软件 systemctl stop firewalld yum span class token function install span openssh op
  • js定时器

    一 定时器概述 开发时用到的js定时器主要分为两种 xff1a 1 一次性的定时器setTimeOut方法 xff0c 通过设置一定的时间 xff0c 时间到就执行 var timer 61 setTimeout fun 毫秒数 清除的方法
  • UNIX 环境高级编程

    与你共享 xff0c 与你共舞 xff01 UNIX环境高级编程 xff08 第3版 xff09 是被誉为UNIX编程 圣经 xff1b 书中除了介绍UNIX文件和目录 标准I O库 系统数据文件和信息 进程环境 进程控制 进程关系 信号
  • ROS的CMakeList编写

    参考这位博主 我的cmakelist包 在 home xxx catkin Drone src Flight Control ROS CMakeLists txt cmake minimum required span class toke
  • Ubuntu18.04 NX下用ZED2 双目立体相机进行SLAM

    NX下的ZED2开发 安装流程问题开始了看效果安装ZED2 ROS工具 新故事篇章 zed2测距开始实现 安装流程 了解zed参数 因为网上的安装流程还是不太完整 xff0c 我补充一下 希望对其他人也有帮助 部分流程参考这位 xff1a
  • ubuntu16.04备份和迁移

    ubuntu16 04备份和迁移 背景实践1 备份整个系统2 重装Ubuntu16 043 恢复系统 题外话 xff1a 修改主机名参考文章 背景 此文用来快速记录备份和恢复的过程步骤 xff0c 具体命令意思不做过多介绍 因为不想新设备重
  • Ubuntu apt-get报错

    昨天晚上更新源 xff0c 居然报错了 zcidcs 64 ubuntu sudo apt get upgrade sudo password for zcidcs Reading package lists Done Building d
  • 2014阿里巴巴面试总结

    刚结束的一面 xff0c 可能昨天笔试题目做得还行 xff0c 今天中午电话我叫我1 30去面试 xff0c 时间紧急 xff0c 我吃完饭赶紧回宿舍小休息一会儿 xff0c 然后奔赴文三路的华星时代大厦 人太多了 xff0c 等到了2 2
  • 基类指针,子类指针,虚函数,override与final

    一 xff1a 基类指针与子类指针 span class token macro property span class token directive keyword include span span class token strin
  • web开发中实现页面记忆的几种方式

    一 前言 在前段时间公司有个需求是对前一个页面的操作进行记忆 xff0c 例如分页的样式 xff0c 选中的条件等 之前是用的session去存储记忆数据 xff0c 老大让我调研一下目前比较合理的方式然后分析一下 xff0c 这里以本篇博
  • 基于VINS与FastPlanner的无人机自主飞行Gazebo仿真

    项目来源及展示 xff1a https www bilibili com video BV1WK4y1V7um from 61 search amp seid 61 12548150687335659873 基本思路 xff1a 采用Gaz
  • RGB-D SLAM 相关总结

    目录 一 RGB D SLAM是什么 xff1f 二 D435i说明 三 RGB D SLAM研究现状 1 现有的RGB D SLAM方法 1 1 前端 1 2 后端 1 3 闭环检测 1 4 制图 2 优秀RGB D SLAM介绍 2 1
  • VINS-Mono学习(一)——数据预处理

    void push back double dt const Eigen Vector3d amp acc const Eigen Vector3d amp gyr dt buf push back dt acc buf push back
  • VINS-Mono学习(四)——回环检测与重定位

    目录 1 闭环检测常用方法有哪些 xff1f 2 ORB SLAM2中Loop Closing的具体实现流程是怎样的 xff1f 3 VINS回环检测与重定位 四自由度位姿图优化 3 1 第一部分 xff1a 回环检测与重定位 3 1 1
  • LADRC的学习——总概

    作者 xff1a 墨心 日期 xff1a 2019 7 25 xff1b 学习LADRC结构 xff1a 1 学习PID的相关知识 xff0c 作为学习ADRC的基础铺垫 xff0c 在simulink中搭建模块 xff0c 通过调节参数