ADRC-跟踪微分器TD的Maltab实现及参数整定

news2024/11/19 7:28:02

目录

问题描述:

跟踪微分器TD基本概念:

Matlab及其实现:

跟踪效果:

例1:跟踪信号 sin(t) +0.5*rand(1,1)。

例2:跟踪部分时段为方波的信号,具体形式见代码get_command。

参数整定:

参考文献


问题描述:

在设计飞行器姿态控制器的过程中,参考指令为方波形式,致使信号不连续处的导数发生较大变化,严重影响了依赖于参考指令导数及其二阶导数的控制器(如SMC)的鲁棒性。因此,尝试借助自抗扰控制中的跟踪微分器实现信号及其对时间的导数的平滑处理。

跟踪微分器TD基本概念:

跟踪微分器(Tracking Differentiator, TD) 是“自抗扰控制器”(ADRC)[3] 的组成部分,最早由韩京清老师提出。提出的目的是为了解决在实际问题中,从不连续(如方波)或带随机噪声(如模型不确定性或外部干扰)的参考信号中,合理提取连续信号及微分信号的问题。简单来说,就是平滑化信号。在实际应用中,我们所得到的信号往往是带有噪声的,为了从这些含噪信号中提取或恢复原始信号,就需要设计滤波器,以得到原始信号的最佳逼近 [1],因此TD可视为滤波器。

Matlab及其实现:

本文所实现的离散化TD参考了韩京清老师发表在《系统仿真学报》上的论文《跟踪微分器滤波性能研究》,参数设置较原文有所调整,复现结果可跟踪下文示例信号。

将下述代码放到同一目录下即可运行,Matlab版本为2022a,程序入口为main.m函数。

main.m

% 测试微分跟踪器.
clear,clc;

%% 初始化, 生成跟踪信号.
T = 0.01;  %积分步长.
End = 30;
tf = 0:T:End;    %跟踪时长.

%例程1
a = -1; b = 1;
v = sin(tf) + 0.5*(a + (b-a)*rand(1,1));

%例程2
%v = zeros(1, length(tf));
% for i = 1:length(tf)
%     v(i) = get_command(1 + i*T, End);
% end

x1 = zeros(1, length((v)));
x2 = zeros(1, length((v)));


%% 使用TD获取处理后的信号及其微分.
for i = 1:length(v)
    [x1(1, i), x2(1, i)] = TD(v(i), T);
end


%% 绘制信号.
close all;

figure
plot(tf, v, tf, x1, tf, x2);
xlabel('time'), ylabel('signal'), legend('原始输入 v', '跟踪输入x1', '跟踪输入导数x2' )

figure
subplot(3,1,1);
plot(tf,v);
legend('原始输入 v')
xlabel('time'), ylabel('signal');

subplot(3,1,2);
plot(tf,x1);
legend('跟踪输入x1')
xlabel('time'), ylabel('signal');

subplot(3,1,3);
plot(tf,x2)
legend('跟踪输入导数x2' )
xlabel('time'), ylabel('signal');


%% 参考文献
% [1]武利强,林浩,韩京清.跟踪微分器滤波性能研究[J].系统仿真学报, 2004, 16(4):3.DOI:10.3969/j.issn.1004-731X.2004.04.012.
% [2]https://blog.csdn.net/m0_37764065/article/details/108668033.  %复制链接得去掉最后的.

fst.m

function f=fst(v, x1_k, x2_k, r, h1, r2)
% fst = −r*sat(g(k),delta), 快速控制最优综合函数, 也称fhan函数
delta = h1*r;			%h1为滤波因子  r为调节系数,r越大跟踪效果越好,但微分信号会增加高频噪声
delta1 = delta*h1;	    %反之,微分信号越平滑,会产生一定的滞后
e_k = x1_k-v;
y_k = e_k + r2*h1*x2_k;

g_k = g(x2_k, y_k, delta, delta1, r, h1);
f = -r*sat(g_k, delta);


%% 局部函数
function g_k = g(x2_k, y_k, delta, delta1, r, h1)
a0=sqrt(delta^2 + 8*r*abs(y_k));

if abs(y_k) >= delta1
    g_k = x2_k + (a0-delta)*sign(y_k)/2;
else
    g_k = x2_k + y_k/h1; 
end


function f = sat(x, delta)
if abs(x)>=delta
    f = sign(x);
else
    f = x/delta;
end

TD.m

function [x1_, x2_] = TD(v, T)
% v 是原始期望指令, x2 = x1_dot, x1是滤波后的指令, T为积分步长.
% T = 0.01;  %积分步长, , 韩老师文章记作h.
r = 1000;    %决定跟踪快慢的参数.
r2 = 1;      %
h = 0.01;  %滤波性能与相位损失之间的权衡参数.
h1 = 8*h;

persistent x1 x2;   %仅函数内部可见的全局变量.

% 初始化变量.
if isempty(x1)
    x1 = v;
end
if isempty(x2)
    x2 = 0;
end
x1_k = x1;
x2_k = x2;

% TD 的离散化公式.
% x1(k+1) = x1(k) + h*x2(k)
% x2(k+1) = x2(k) + h*fst(x1(k)-v(k), x2(k), r, h1)
x1 = x1_k + T*x2_k;
x2 = x2_k + T*fst(v, x1_k, x2_k, r, h1, r2); %因为x1k是逐步算出的,故单独传入x1(k)与v(k)

% 输出
x1_ = x1;
x2_ = x2;
end

get_command.m

function X_d = get_command(t, End)
%alpha_c为攻角控制指令
%beta_c为侧滑角控制指令
%sigma_c为倾侧角控制指令

t_1 = 8;
t_2 = 20;

alpha_1 = 18;
alpha_2 = 15;
alpha_3 = 10;


sigma_1 = 20;
sigma_2 = -15;


% 
if t < t_2
alpha_c = alpha_1 * (t < t_1) + getdot(alpha_1, alpha_2, t_1, End, t) * (t >= t_1 && t < t_2); 
beta_c = 0;
sigma_c = sigma_1 * (t < t_1) + getdot(sigma_1, sigma_2, t_1, End, t) * (t >= t_1 && t < t_2);

% 函数指令
aero_angle_d            = [alpha_c beta_c sigma_c]';           %姿态角指令 弧度制 单位/rad
%aero_angle_d_dot        = [((alpha_1-alpha_2)/Simu.tf-t_1)*pi/180 0 ((sigma_1-sigma_2)/Simu.tf-t_1)*pi/180]';       %姿态角指令一阶导
aero_angle_d_dot        = [0 0 0]';       %姿态角指令一阶导
aero_angle_d_dot_dot    = [0 0 0]';     %姿态角指令二阶导

else
alpha_c = alpha_2; 
beta_c = 0;
sigma_c = 0;

% 函数指令
aero_angle_d            = [alpha_c beta_c sigma_c]';           %姿态角指令 弧度制 单位/rad
aero_angle_d_dot        = [0 0 0]';       %姿态角指令一阶导
aero_angle_d_dot_dot    = [0 0 0]';     %姿态角指令二阶导
end


% X_d                     = [aero_angle_d; aero_angle_d_dot; aero_angle_d_dot_dot]';
X_d = aero_angle_d(1);


function angle = getdot(angle1, angle2, t1, t2, t)
% 姿态角控制指令计算
%  angle为姿态角控制指令输出
%  angle1为初始时刻姿态角,angle2为结束时刻姿态角
%  t1为初始时刻,t2为结束时刻,t为当前时刻

angle = (angle2 - angle1)/(t2 - t1)*(t - t1) + angle1;

跟踪效果:

例1:跟踪信号 sin(t) +0.5*rand(1,1)。

例2:跟踪部分时段为方波的信号,具体形式见代码get_command。

参数整定:

跟踪指令处处连续平滑(如正弦波),则应该选用较小的h值;反之,则选用稍大的h值,通常选取在[0.01, 0.001]之间。通过调整h的指改变h1的值,h1 越大,会增大跟踪信号与参考信号之间的相位损失,越小,则滤波效果越好。

参考文献

[1]武利强,林浩,韩京清.跟踪微分器滤波性能研究[J].系统仿真学报, 2004, 16(4):3.DOI:10.3969/j.issn.1004-731X.2004.04.012.

[2]https://blog.csdn.net/m0_37764065/article/details/108668033. 

[3]薛定宇, 陈阳泉. 基于 MATLAB/Simulink 系统仿真技术与应用
[M]. 北京: 清华大学出版社, 2002.

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

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

相关文章

【贪心算法】专题练习一

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 前言 1.什么是贪心算法&#xff1f;——贪婪鼠目寸光 贪心策…

【Windows】共享文件夹拍照还原防火墙设置(入站,出站设置)---图文并茂详细讲解

目录 一 共享文件夹(两种形式) 1.1 普通共享与高级共享区别 1.2 使用 二 拍照还原 2.1 是什么 2.2 使用 三 防火墙设置&#xff08;入栈&#xff0c;出站设置&#xff09; 3.1 引入 3.2 入站出站设置 3.2.1入站出站含义 3.3入站设置 3.4安装jdk 3.5使用tomcat进行访…

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下&#xff0c;开发机和调试机可能不是同一台设备&#xff0c;此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹&#xff0c;用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

git集成github(一):主要步骤

一、创建仓库 1、创建本地git仓库 在pcharm主界面顶栏&#xff0c;点击VCS&#xff0c;再点击创建git仓库&#xff0c;然后选择项目根路径&#xff0c;点击确认。这时&#xff0c;可以看到顶栏的VCS变成了git。 2、远程仓库下载到本地 打开一个远程仓库&#xff0c;点击code…

“C语言“——scanf()、getchar() 、putchar()、之间的关系

scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换&#xff0c;并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串&#xff0c;它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…

PYTHON数据处理:CSV和JSON

#CSV和JSON格式的数据在python上的处理 CSV和JSON数据类型都是都是常见的两种在python中的数据分析类型&#xff0c;这里我有两个入门项目详细讲解这两种数据的处理。 处理一个CSV形式的地方的天气的数据&#xff0c;然后创建一个表格&#xff1b; 分析JSON形式的地震数据&…

扩展mybatis-plus,保留逻辑删、逻辑查的前提下,扩展硬删除、硬查询

引入相关依赖 <!-- 提示&#xff1a;1. common-mybatis-plus:2100.8.8 中只有4个类文件&#xff0c;是对硬删除、硬查询的扩展支持&#xff0c;如果你不想引入依赖的话&#xff0c;你可以把这四个文件复制到自己的项目中即可2. common-mybatis-plus:2100.8.8 对应mybatis-p…

CEEMDAN +组合预测模型(CNN-LSTM + ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 CNN-LSTM 模型预测 3.1 定义CEEMDAN-CNN-LSTM预测模型 3.2 定义模型参数 3.3 模型训练&#xff0c;训练结果 4 基于ARIMA的…

数据结构与算法:基于比较的排序算法:选择、冒泡、插入、归并的动图演示和java代码,排序时间复杂度、空间复杂度、稳定性总结表格

选择排序 选择排序是先在0~N-1上选择一个最小值排到最前面&#xff0c;然后再在1到N-1上选一个次小的&#xff0c;以此类推。 public static selectionSort(int[] arr){if(arrnull||arr.length<2){return;} //每次从i n-1 选一个最小的放前面for(int i0;i<arr.length-…

深入Apache Commons Config:管理和使用配置文件

第1章&#xff1a;引言 咱们都知道&#xff0c;在软件开发中&#xff0c;管理配置文件是一件既重要又让人头疼的事。想象一下&#xff0c;咱们的应用程序有一堆设置需要调整&#xff0c;比如数据库的连接信息、应用的端口号&#xff0c;或者是一些功能的开关。如果这些信息硬编…

Spring高手之路-SpringBean的生命周期

目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destru…

【深入之Java进阶篇】fastjson的反序列化漏洞(详解总结)

✔️ fastjson的反序列化漏 1️⃣典型解析2️⃣拓展知识仓1️⃣AutoType2️⃣AutoType 有何错?3️⃣ 绕过checkAutotype&#xff0c;黑客与fastjson的博弈4️⃣autoType不开启也能被攻击?5️⃣利用异常进行攻击6️⃣AutoType 安全模式? 1️⃣典型解析 当我们使用fastjson进行…

ueditor富文本编辑器中图片上传地址配置以及抓取远程图片地址的配置

一&#xff1a;图片上传保存地址配置 打开文件ueditor.php,找到imagePathFormat进行修改即可 一&#xff1a;远程抓取图片配置 打开文件ueditor.config.js,找到catchRemoteImageEnable&#xff0c;取消注释即可

Unity之ShaderGraph如何实现瓶装水效果

前言 有一个场景在做效果时,有一个水瓶放到桌子上的设定,但是模型只做了个水瓶,里面是空的,所以我就想办法,如何做出来瓶中装睡的效果,最好是能跟随瓶子有液体流动的效果。 如下图所示: 水面实现 水面效果 液体颜色设置 因为液体有边缘颜色和内里面颜色,所以要分开…

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…

Sublime Text 4 中文汉化教程(Version: Build 4169)

Sublime Text 4汉化 1 知识小课堂1.1 sublim简介1.2 其他编辑器 2 安装过程2.1 安装Install Package Control2.2 Install Package2.3 安装工具包2.4 常用的插件2.5 安装中文包 1 知识小课堂 1.1 sublim简介 Sublime是一款代码编辑器&#xff0c;致力于为开发人员提供快速、高…

IDEA 控制台中文出现乱码问题解决

一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源&#xff1a; ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因&#xff1a;IDEA编码和Tomcat编码不一致&#xff0c;统一设置为UTF-8即可。 三、解决思路 修改…