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

目录

问题描述:

跟踪微分器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);
% endx1 = 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) >= delta1g_k = x2_k + (a0-delta)*sign(y_k)/2;
elseg_k = x2_k + y_k/h1; 
endfunction f = sat(x, delta)
if abs(x)>=deltaf = sign(x);
elsef = 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.mzph.cn/news/585123.shtml

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

相关文章

Flink 日志总结

前言 总结一下 Flink 项目代码打印日志的配置。 目的 默认情况下不会打印Flink日志信息,只会抛出缺少日志类警告,比如上篇文章中的 flink-hbase 代码就没有打印 Flink 日志信息。有些情况下我们需要从 Flink 日志中获取一下信息,对于我们学习 Flink 或者解决问题都有帮助…

(已解决)(pytorch指定了gpu但还是占用了一点0号gpu)以及错误(cuDNN error: CUDNN_STATUS_INTERNAL_ERROR)

文章目录 错误原因解决问题 错误原因 出现错误cuDNN error: CUDNN_STATUS_INTERNAL_ERROR&#xff0c;从这个名字就可以看出&#xff0c;出错原因其实有可能有很多种&#xff0c;我这里说一种比较常见的&#xff0c;就是&#xff1a;显存不足。 一个困惑点在于&#xff0c;在…

数据结构,第8章:排序(复习)

目录 直接插入排序&#xff1a; 1. (程序题) 折半插入排序&#xff1a; 希尔排序&#xff1a; 3. (程序题) 冒泡排序 &#xff1a; 2. (程序题) 快速排序 &#xff1a; 5. (程序题) 简单选择排序&#xff1a; 4. (程序题) 堆排序&#xff1a; 6. (程序题) 前置知识&…

【数据结构】图论与并查集

一、并查集 1.原理 简单的讲并查集&#xff0c;就是查询两个个元素&#xff0c;是否在一个集合当中&#xff0c;这里的集合用树的形式进行表示。并查集的本质就是森林, 即多棵树。 我们再来简单的举个例子: 假设此时的你是大一新生&#xff0c;刚进入大学&#xff0c;肯定是…

php-fpm运行一段时间,内存不足

目录 一&#xff1a;原因分析 二&#xff1a;解决 三:观察系统情况 php-fpm运行一段时间&#xff0c;内存不足&#xff0c;是什么原因呢。 一&#xff1a;原因分析 1:首先php-fpm的配置 &#xff08;1&#xff09;启动的进程数 启动的进程数越多,占用内存越高; 2:其次…

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;TodoList小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

【蓝桥杯】比赛大纲整理

枚举[1-3] 排序 &#xff08;1&#xff09;冒泡排序[2] &#xff08;2&#xff09;选择排序[3] &#xff08;3&#xff09;插入排序[3] 搜索(bfs, dfs)[1-5] 贪心[1-5] 模拟[1-3] 二分[2-5] DP(普通一维问题)[3-5] 高精度[1-5] 数据结构 &#xff08;1&#xff09;栈[2-4]&…

Linux sed命令教程:如何使用流编辑器进行文本处理(附实例教程和注意事项)

Linux sed命令介绍 sed是stream editor的缩写&#xff0c;意为流编辑器。它是一种在命令行下处理文本文件的工具。sed主要用于自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 Linux sed命令适用的Linux版本 sed命令在大多数Linux发行版中都是预装的&#…

Java插入排序:优雅整理数据的艺术

Java插入排序&#xff1a;优雅整理数据的艺术 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同深入研究Java中的排序算法&#xff0c;探讨…

1.NumPy 介绍

1.NumPy 介绍 1.1 NumPy 演变史 在 NumPy 之前&#xff0c;有两个 Python 数组包&#xff1a; Numeric 包 Numeric 包开发于 20 世纪 90 年代中期&#xff0c;在 Python 中提供了数组对象和数组感知函数。它由 C 语言编写&#xff0c;并与线性代数的标准快速实现相链接。它最…

nodejs微信小程序+python+PHP的林业信息管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

nodejs+vue+微信小程序+python+PHP的冷链物流配送系统-计算机毕业设计推荐

对于冷链物流信息调度系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、用户管理&#xff08;管理员、客户、业务员、配送员&#xff09;客户管理&#xff08;货物信息、客户运输单、车辆信息、调度安排&#xff09;这给管理者的工作带来了巨大…

Redisson依赖冲突记录

前言&#xff1a;项目使用的springboot项目为2.7.X 依赖冲突一&#xff1a;springboot 与 redisson版本冲突 项目中依赖了 Lock4j&#xff0c;此为苞米豆开源的分布式锁组件 <dependency><groupId>com.baomidou</groupId><artifactId>lock4j-redisso…

读算法霸权笔记07_筛选

1. 美国残疾人法案 1.1. 1990年 1.2. 公司在招聘时使用身体检查是非法的 1.3. 有某些心理健康问题的人被“亮了红灯”&#xff0c;他们因此没能找到一份正常的工作&#xff0c;过上正常的生活&#xff0c;这就使其进一步被社会孤立&#xff0c;而这正是《美国残疾人法案》要…

使用Halcon 采集图像并进行简单处理rgbl_to_gray/threshold/connection/fill_up

使用Halcon 采集图像并进行简单处理 文章目录 使用Halcon 采集图像并进行简单处理 下面介绍一个简单的采集图像的例子。在Halcon中利用图像采集接口&#xff0c;使用USB3.0相机实时拍摄图像。采集到图像后对图像进行简单的阀值分割处理&#xff0c;将有物体的区域标记出来。 &a…

3d光学轮廓仪测微光学器件应用及其重要意义

微光学器件是光学器件的重要分支&#xff0c;为光学通信、光传感、光计算等领域的发展提供重要支撑。微光学器件具有尺寸小、功耗低、低成本等优势&#xff0c;可以于电子器件集成&#xff0c;实现更高效的数据传输和信号处理。未来&#xff0c;随着微纳加工技术的进一步发展&a…

prerender-spa-plugin使用总结

1. 介绍 prerender-spa-plugin 利用了 Puppeteer 的爬取页面的功能。 Puppeteer 是一个 Chrome官方出品的 headlessChromenode 库。它提供了一系列的 API, 可以在无 UI 的情况下调用 Chrome 的功能, 适用于爬虫、自动化处理等各种场景。它很强大&#xff0c;所以很简单就能将运…

在 Golang 应用程序中管理多个数据库

掌握在 Golang 项目中处理多个数据库的艺术 在当前软件开发领域中&#xff0c;处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案&#xff0c;无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中&a…

FastAPI使用异步Redis

1. 安装依赖 pip install fastapi redis uvicorn 2. 主要代码 #!/usr/bin/env python import os import sys from contextlib import AbstractAsyncContextManager, asynccontextmanager from datetime import timedelta from pathlib import Pathfrom fastapi import FastA…

Java开发框架和中间件面试题(7)

目录 63.Spring中都应用了哪些设计模式&#xff1f; 64.请举例说明如何在Spring中注入一个Java Collection&#xff1f; 65.说一下都有哪些基本理念&#xff1f; 67.Spring Bean的生命周期&#xff1f; 68.说说Spring AOP的实现原理&#xff1f; 69.Spring中事务的实现方…