LADRC的学习——PID的学习

2023-05-16

PID部分的学习

上文介绍了ADRC的理论,并试着按照自己的理解用Matab编程实现韩老师论文中的算法,但是对调节参数和一些地方还不太懂,因此我打算从头开始理解,从PID的好坏开始学习理解,看Kp,Ki,Kd参数对系统的影响。
此文中参照了这个文件,SUNPLUS的PID调节控制做点击速度控制,其中封面图片如下:
在这里插入图片描述
还有,一个blibli上的视频课程,名字叫做:用Matlab调节PID;
还有看了一个博主写的基于matlab程序对PID控制算法的理解,链接为:https://blog.csdn.net/sinat_23338865/article/details/53837634

一、PID的介绍及其表示式

在这里插入图片描述
传统PID采用的是误差调控的方式,其中采用的是比例,积分,微分加权和的方式,这样控制可以反应过去的误差,现在的误差,未来的‘误差对影响,通过调节Kp,Ki,Kd三个参数,就可以调节加权和,满足当前系统的控制,从而满足期望控制要求。

其中在连续的一般用于计算机仿真中进行测试或者帮助学习理解,在生活中常用的有两种形式,一种是增量式PID,一种是位置式PID。下面进行介绍,

a.位置式PID

在这里插入图片描述
在位置式的PID中,比较容易理解,比例部分就是当前的误差部分,积分部分相当于把以前的误差全部累加,然后微分环节在T足够小的时候,两个相邻的误差除以采样时间T可以近似看作微分环节。这样通过调节Kp,Ki,Kd,就可以实现加权和控制。
但是存在一个缺点,积分控制是之前的一直在累加,因此计算量过大,在日常中并不常用,因此采用增量式PID。

b.增量式PID
在这里插入图片描述
在这里插入图片描述
通过2-2式子和2-4式子相减做差得到,PID增量式算法:
在这里插入图片描述
这样我们只用调节A,B,C就可以满足控制的要求,而PID输出U = deltaU + U(k - 1),这样就可以完成PID控制器了。

**

二、实践理解

a.通过simulink搭建理解
在这里插入图片描述
其中输入的信号有可以调节的规则信号和噪声,通过滤波器,之后通过PID控制,控制对象假设为:
G(s) = 1/(s^2 + 3s + 1)
通过调节PID参数来看控制效果,结果如下:
Kp = 24;Ki = 10.4; Kd = 12,图像为:

在这里插入图片描述
当Kp = 40; Ki = 2; Kd = 15的时候,图像为:

在这里插入图片描述
可以通过调节参数,来看看控制情况,不过一般不清楚最优效果是什么,一般多试,然后记录以后选择相对最优的参数作为控制PID参数。

b.通过Matlab编程——连续型

这里是看了b站的一个视频,看最上面提到的引用。然后通过先调节Kp,再调节Kd,最后调节Kd,最后得出三个参数调节以后的影响。
这里选择的被控制对象还是上面提到的那个,下面是代码部分:

clear
clc

num = 1;
den = [1 3 1];
Gp = tf(num,den);
H = 1;

M = feedback(Gp,H);
step(M);
hold on

Kp = 24;
Ki = 10.4;
Kd = 10;

Gc = pid(Kp,Ki,Kd);
N = feedback(Gp*Gc,H);
step(N);
grid on;

参数调节按照这样的方式,先让Kd,Ki都为0,调节Kp。然后选择超调量在20%左右以后的Kp值保持不变了,接下来调节Kd,让超调消失,但是接下来又出现了问题,达不到期望值,因此调节Ki,让目标达到期望值,且不产生太大超调,这是实现图像和结论。
调节Kp时候的图像:

在这里插入图片描述
其中曲线是这样的,随着Kp的增大,曲线越贴近y轴,但是超调会不断的增大,而且始终存在稳态误差,稳定的值一直到不了期望值 y = 1 处。
结论:随着Kp的增大,上升时间ts明显减少,可以很快的达到期望值,但是超调量delta%在过了期望值以后会逐渐增大,从而导致调节时间ts也增加,波动变化较大,会存在稳态误差。

调节Kd后的图像:
在这里插入图片描述
随着Kd的增大,曲线越来越靠近y轴,并且超调量逐渐减小,但是稳定值也不能到期望值,但是非常的接近了,而且可以减小超调。
结论:在Kp保持不变的条件下,随着Kd的增大,超调量逐渐减小,调节时间也逐渐变短,斜率在上升阶段特别陡,可以很快的接近期望值附近,但是有一个大的弊端:上升时间大大增长,而且在不超调情况下,难以达到期望值(精度不够)。因此在基本控制中基本PD控制就可以满足要求,如果高精度控制需要加上I控制,那样可以满足精度。

调节Ki以后得到的图像:
在这里插入图片描述
随着Ki的增大,可以增大达到期望值的速度,满足精度的要求,但是随着Ki的增大,会出现超调,调节时间也会增大,但是稳态误差消除了。
结论:通过保持Kp,Kd参数不变的条件下,调节Ki参数。随着Ki的增加,会发现当前值离期望值越来越近,上升时间会减少,但是当Ki过大以后,会出现超调现象,且调节时间会增加。很大的好处是可以满足精度要求。

分析后结论:
总结:
1.Kp最大好处是可以很快接近期望值附近,会有超调和稳态误差。
2.Kd最大好处是可以以较快时间接近期望值附近,可以消除超调,但是无法准确达到期望值。(快)
3.Ki最大好处是可以接近期望值,提高精度,但是会发生超调。(准)
整体实现稳定效果。

c.通过Matlab编程——离散型(增量式)
这里是通过一篇博客的学习,看最上面的引用,然后自己改了一些输入和理解,写的离散PID增量式PID,其中控制对象需要进行Z变换,然后Z变换以后要写成递推式,然后通过时序关系得出系统输出。
代码如下:

% Someone write discrete PID code
% This is increment_ways algorithm program
% Signal:step, sinusoidal, sample time is 1ms,interger limit is [-5,5];

clear
close all;
Sample_Time = 0.001;                  %Sample time
sys = tf(50,[0.125,7,0]);             %sys is transter function
disc_sys = c2d(sys,Sample_Time,'z');  %discrete system
[num,den] = tfdata(disc_sys,'v');     %Get numerator array and denonimator array

u_1 = 0.0;                            %u last
u_2 = 0.0;                            %u previous
y_1 = 0.0;                            %y last
y_2 = 0.0;                            %y previous
Three_Component = [0.0,0.0,0.0]';                   %X vector
delta_u = 0.0;                        %u increment

Error_1 = 0;                          %Error last
Error_2 = 0;                          %Error previous

for k = 1:1000
    time(k) = k*Sample_Time;          %Time sequence,dt more little,acurency will be better.
    S = 2;                            %Choose input signal.
    switch S
        case 1
           Kp = 5;Ki = 0.035;Kd = 1.6;
           if k <= 300
              Input(k) = 0;
           else
              Input(k) = 1;
           end
        case 2
           Kp = 10;Ki = 0.1;Kd = 15;
           Input(k) = 0.5*sin(2*pi*k*Sample_Time);  
        case 3
           % Step signal + noise.
           Kp = 10;Ki = 0.2;Kd = 14;
           if k <= 300
              Input(k) = 0 + 0.05*rand;
           else
              Input(k) = 1 + 0.05*rand;
           end
        case 4 
           % Slope signal add noise
           Kp = 1;Ki = 0;Kd = 0;
           Input(k) = 1.1*(k) + 100*rand;
        case 5
           Kp = 188;Ki = 2.5;Kd = 1.9;
           Input(k) = 0.9*k.^2;
        case 6
           Kp = 100;Ki = 0.7;Kd = 5.6;
           Input(k) = 0.5*cos(2*pi*k*Sample_Time) + 2*sin(9*pi*k*Sample_Time) + 1.5*cos(7*pi*k*Sample_Time);  
    end
    
    delta_u(k) = Kp*Three_Component(1) + Kd*Three_Component(2) + Ki*Three_Component(3);  %This is the increment error's three sub_vector.
    u(k) = u_1 + delta_u(k);                   %This is PID's output.U1 is last PID out.
    
    if u(k) >= 5                               %This is PID output limit.
        u(k) = 5;
    end
    if u(k) <= -5
        u(k) = -5;
    end
    
    %Linear model
    %Note: z*u(z)  <------>  u(k + T)
    Out(k) = -den(2)*y_1 - den(3)*y_2 + num(2)*u_1 + num(3)*u_2;   %This is contoller output.
    Error(k) = Input(k) - Out(k);                                  %This is Error_Now.
    u_2 = u_1;                %Update PID_Out.It likes sliding windows.                                     
    u_1 = u(k);               
    y_2 = y_1;                %Update TF_Out
    y_1 = Out(k);
    
    Three_Component(1) = Error(k) - Error_1;                %Kp part
    Three_Component(2) = Error(k) - 2*Error_1 + Error_2;    %Kd part
    Three_Component(3) = Error(k);                          %Ki part 
    
    Error_2 = Error_1;                        %Previous Error Update
    Error_1 = Error(k);                       %Last Error Update.
    end
    
    subplot(2,1,1);
    plot(time,Input,'b',time,Out,'r');
    ylabel('Input,Out');
    subplot(2,1,2);
    plot(time,Error,'r');
    xlabel('time(s)');ylabel('error');

结果如下:
S = 1时候为阶跃信号:
在这里插入图片描述
S = 2,为正弦信号
在这里插入图片描述
S = 3,为阶跃信号 + 扰动
在这里插入图片描述
剩下的斜坡信号和加速度信号,系统追不上,处于发散状态,因此需要自动控制原理上进行分析,选择可以收敛的进行分析,这个需要按照项目需要来满足要求。

接下来开始学习LADRC的相关知识。

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

LADRC的学习——PID的学习 的相关文章

随机推荐

  • 树莓派开机无法进入桌面的解决办法

    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 通过调节参数
  • LADRC的学习——PID的学习

    PID部分的学习 上文介绍了ADRC的理论 xff0c 并试着按照自己的理解用Matab编程实现韩老师论文中的算法 xff0c 但是对调节参数和一些地方还不太懂 xff0c 因此我打算从头开始理解 xff0c 从PID的好坏开始学习理解 x