当前位置: 首页 > news >正文

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.

相关文章:

  • 智慧城市新型基础设施建设综合方案:文件全文52页,附下载
  • pycharm2023.2激活和新建项目,python3.12安装永久换源
  • 2312llvm,用匹配器构建clang工具
  • MIT 6.S081---Lab util: Unix utilities
  • 一篇了解Maven中的<optional>和<scope>使用
  • 基于RocketMQ实现分布式事务
  • 31. Ajax
  • STM32外设系列—HC-05(蓝牙)
  • 【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南
  • 创新科技赋能,易点易动设备管理系统助力企业实现设备管理升级
  • Unity自带的NavMesh寻路组件
  • Hadoop——分布式计算
  • 使用pytorch神经网络拟合计算模型
  • Go配置镜像源
  • 听GPT 讲Rust源代码--src/tools(27)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CODING 缺陷管理功能正式开始公测
  • Javascript 原型链
  • MySQL-事务管理(基础)
  • MySQL用户中的%到底包不包括localhost?
  • PermissionScope Swift4 兼容问题
  • select2 取值 遍历 设置默认值
  • 聊聊redis的数据结构的应用
  • 深度学习中的信息论知识详解
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • No resource identifier found for attribute,RxJava之zip操作符
  • Linux权限管理(week1_day5)--技术流ken
  • scrapy中间件源码分析及常用中间件大全
  • 仓管云——企业云erp功能有哪些?
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​插件化DPI在商用WIFI中的价值
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (33)STM32——485实验笔记
  • (八)c52学习之旅-中断实验
  • (差分)胡桃爱原石
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)WLAN定义和基本架构转
  • (转) 深度模型优化性能 调参
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)VC++中ondraw在什么时候调用的
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***测试-HTTP方法
  • .Net FrameWork总结
  • .NET MVC之AOP
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [2021 蓝帽杯] One Pointer PHP
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C++]C++类基本语法