ADRC学习心得(持续更新)

2023-05-16

两年前第一次接触到PID觉得很高深,很神奇;后来逐渐觉得单纯的PID小儿科了,又了解到专家PID,模糊PID,神经网络PID这些改进算法,再后来又知道了ADRC,便感控制领域浩如烟海,所学不过沧海一粟。然便纵真理无穷,进一寸自有一寸的欢喜。
不敢说看了几篇论文,听了几节报告,做了几次仿真,就吃透ADRC了,不过只是一些粗浅的理解,记录一行歪歪斜斜的足迹。以便回首过眼云烟之时,可以安慰自己一句,我已经飞过。

一、系统有关概念

1、系统的状态空间模型

描述一个系统,最常用的数学模型有:

  • 微分方程
  • 传递函数
  • 状态空间

其中状态空间模型常用于对系统进行数学计算。状态空间模型用状态方程表示。
{ x ˙ = A x + B u y = C x + D u ( 1 − 1 ) \left\{ \begin{array}{c} \dot{x}=Ax+Bu \\ y=Cx+Du \end{array} \right. (1-1) {x˙=Ax+Buy=Cx+Du(11)
ABCD是四个矩阵, x x x为状态向量,里面包含的状态变量个数一般等于系统阶数,且相互独立。 y y y为系统输出向量。
状态变量的选取一般是:
x 1 = y , x 2 = d y d t , . . . , x n = d n − 1 y d t n − 1 x_1=y, x_2=\frac{dy}{dt}, ..., x_n=\frac{d^{n-1}y}{dt^{n-1}} x1=y,x2=dtdy,...,xn=dtn1dn1y

2、系统的状态观测

设计反馈的时候需要知道系统内部的状态变量 x x x。大部分情况下 x x x是不知道的,需要用一个观测器,通过系统的输入输出,去把它观测出来。如果在状态变量 x x x中包含了系统的扰动,那么在观测出来之后,就可以在控制器中把系统扰动尽可能消除。观测出的状态变量称为 x ^ \hat{x} x^。那么状态观测器的任务,就是使得 x x x的状态估计 x ^ \hat{x} x^尽可能接近 x x x。通常按照copycat的思路来设计状态观测去,即设计一个相同结构的系统 x ^ ˙ = A x ^ + B u + L ( y − y ^ ) \dot{\hat{x}}=A\hat{x}+Bu+L(y-\hat{y}) x^˙=Ax^+Bu+L(yy^),其中 L ( y − y ^ ) L(y-\hat{y}) L(yy^)这一项是矫正项。 L L L为矫正项增益矩阵。用数学公式表达如下:
{ e o b s = x − x ^ x ˙ = A x + B u x ^ ˙ = A x ^ + B y + L ( y − y ^ )          ( 1 − 2 ) \left\{ \begin{array}{c} e_{obs}=x-\hat{x}\\ \dot{x}=Ax+Bu\\ \dot{\hat{x}}=A\hat{x}+By+L(y-\hat{y}) \end{array} \right. \ \ \ \ \ \ \ \ (1-2) eobs=xx^x˙=Ax+Bux^˙=Ax^+By+L(yy^)        (12)通过数学变换,可以得到: e o b s ˙ = ( A − L C ) e o b s          ( 1 − 3 ) \dot{e_{obs}}=(A-LC)e_{obs} \ \ \ \ \ \ \ \ (1-3) eobs˙=(ALC)eobs        (13)这个方程的解是 e o b s ( t ) = e ( A − L C ) t e o b s ( 0 )          ( 1 − 4 ) e_{obs}(t)=e^{(A-LC)t}e_{obs}(0) \ \ \ \ \ \ \ \ (1-4) eobs(t)=e(ALC)teobs(0)        (14)可以看出,(A-LC)这一项决定了观测器的收敛速度。当 e o b s e_{obs} eobs降到 0 的时候,也就意味着 x x x x ^ \hat{x} x^相等,同时矫正项 L ( y − y ^ ) = 0 L(y-\hat{y})=0 L(yy^)=0。这就是状态观测器的数学模型。ADRC的核心是一个扩张状态观测器,它比一般的状态观测器多了一个总扰动的项,但基础是一样的。

二、ADRC控制器的结构

1、TD(跟踪微分器)

跟踪微分器实际上就是一个事先的过渡过程。提取含有随机噪声的输入信号及其微分,这两个值将被一起送入控制器。也就是说,TD的输入信号只有一个,即给定值,输出信号有两个。这样做的目的是解决PID控制器超调和响应速度之间的矛盾。
然而,微分运算对噪声有很严重的放大效果。由于真正意义上的微分环节( G ( s ) = s G(s)=s G(s)=s)是无法在物理上实现的,因此通常用一阶惯性环节( G ( s ) = s T s + 1 G(s)=\frac{s}{Ts+1} G(s)=Ts+1s)来代替。但是对于一阶惯性环节,要想追求逼近性好,就会不可避免的引入噪声的放大。因此,为了抑制高频噪声,考虑用一个二阶环节来取代一阶环节。当二阶系统处于临界阻尼状态,则过渡过程就不会产生超调。 G ( s ) = s ( T s + 1 ) 2 G(s)=\frac{s}{(Ts+1)^2} G(s)=(Ts+1)2s 式中,当时间常数T很小的时候有 lim ⁡ T → 0 s ( T s + 1 ) 2 = s \lim_{T \to 0} \frac{s}{(Ts+1)^2}\quad=s limT0(Ts+1)2s=s,也有微分的效果。并且这个二阶系统对于高频噪声有很高的抑制能力。因此TD中采用的通常是这种结构。过渡过程的阶数一般根据系统来决定,与系统同阶或者比系统高一阶。

2、ESO(扩张状态观测器)

ESO是ADRC控制器的核心,可以用一个扩张状态方程来描述。通过扩张状态观测的方式把系统上和输入量(u)无关的所有杂项(扰动)全部观测出来,以便用控制器去补偿这些扰动。设计ESO的思路如下:
考虑一个二阶系统:
y ¨ = a y ˙ + b y + c u + d                     ( 2 − 1 ) \ddot{ y}=a\dot{y}+by+cu+d \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2-1) y¨=ay˙+by+cu+d                   (21) d d d为扰动。显然二阶系统的状态变量有两个, x 1 x_1 x1 x 2 x_2 x2。一般情况下如果要写出状态方程的话应该是二阶的,即有两个状态变量。为了将扰动 d d d也纳入状态观测器,建立第三个状态变量 x 3 x_3 x3,使其等于 a y ˙ + b y + d a\dot{y}+by+d ay˙+by+d,即上式中除了输入 u u u之外的其他项(也可称作总扰动)。令 x 3 ˙ = h \dot{x_3}=h x3˙=h,那么按照一般状态方程的写法,可以列写出上面这个二阶系统的状态方程:
[ x 1 ˙ x 2 ˙ x 3 ˙ ] = [ 0 1 0 0 0 1 0 0 0 ] [ x 1 x 2 x 3 ] + [ 0 c 0 ] u + [ 0 0 1 ] h         ( 2 − 2 ) \begin{bmatrix} \dot{x_1} \\ \dot{x_2} \\ \dot{x_3} \\ \end{bmatrix} =\begin{bmatrix} 0&1&0 \\ 0&0&1 \\0&0&0 \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ \end{bmatrix} + \begin{bmatrix} 0 \\ c \\ 0 \\ \end{bmatrix}u + \begin{bmatrix}0 \\0 \\ 1 \\ \end{bmatrix}h\ \ \ \ \ \ \ (2-2) x1˙x2˙x3˙=000100010x1x2x3+0c0u+001h       (22)和输出方程:
y = [ 1 0 0 ] [ x 1 x 2 x 3 ]         ( 2 − 3 ) y= \begin{bmatrix} 1 & 0 & 0 \\ \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ \end{bmatrix}\ \ \ \ \ \ \ (2-3) y=[100]x1x2x3       (23)这个状态方程即被称为扩张状态方程。扩张状态观测器的设计和传统状态观测器类似,也是 { x ^ ˙ = A x ^ + B u + L ( y − y ^ ) + E h y ^ = C x ^         ( 2 − 4 ) \left\{ \begin{array}{c} \dot{\hat{x}}=A\hat{x}+Bu+L(y-\hat{y})+Eh\\ \hat{y}=C\hat{x} \end{array} \right. \ \ \ \ \ \ \ (2-4) {x^˙=Ax^+Bu+L(yy^)+Ehy^=Cx^       (24)其中 E h Eh Eh这一项和模型有关,大部分情况下是未知的,因此通常这一项被直接忽略,不然放着也没用。由于有了矫正项 L ( y − y ^ ) L(y-\hat{y}) L(yy^) ( L (L (L状是态观测器的增益矩阵,记为 [ l 1 l 2 l 3 ] \begin{bmatrix} l_1\\ l_2 \\ l_3\\ \end{bmatrix} l1l2l3),因此观测器中的矩阵A、B、C、D(为了区分记为 A 1 、 B 1 、 C 1 、 D 1 A_1、B_1、C_1、D_1 A1B1C1D1)和状态方程中的矩阵A、B、C、D是不一样的。

通过一定的数学变换,状态观测器方程(2-4)可化为如下形式:
x ^ ˙ = ( A − L C 1 ) x ^ + [ B L ] [ u y ] \dot{\hat{x}}=(A-LC_1)\hat{x}+\begin{bmatrix} B&L \\ \end{bmatrix}\begin{bmatrix} u\\y \\ \end{bmatrix} x^˙=(ALC1)x^+[BL][uy]观测器中的系统矩阵 A 1 = A − L C 1 A_1=A-LC_1 A1=ALC1,即 A 1 = [ − l 1 1 0 − l 2 0 1 − l 3 0 0 ] A_1=\begin{bmatrix} -l_1&1&0 \\ -l_2&0&1 \\-l_3&0&0 \\ \end{bmatrix} A1=l1l2l3100010,而新的输入矩阵; B 1 = [ B L ] B_1=\begin{bmatrix} B&L \\ \end{bmatrix} B1=[BL],即 B 1 = [ 0 − l 1 c − l 2 0 − l 3 ] B_1=\begin{bmatrix}0& -l_1 \\ c&-l_2 \\0&-l_3 \\ \end{bmatrix} B1=0c0l1l2l3为新的控制矩阵( c c c是原二阶系统中输入 u u u的系数), [ u y ] \begin{bmatrix} u\\y \\ \end{bmatrix} [uy]两个一起作为观测器输入;状态观测器的输出 y ^ \hat{y} y^实际上包含3个分量,即 y ^ = C 1 [ x 1 ^ x 2 ^ x 3 ^ ] \hat{y}=C_1\begin{bmatrix} \hat{x_1} \\ \hat{x_2} \\ \hat{x_3} \\ \end{bmatrix} y^=C1x1^x2^x3^那么在观测器的输出方程中, C 1 C_1 C1就是一个三阶单位矩阵,因为 y ^ = x ^ \hat{y}=\hat{x} y^=x^ D 1 D_1 D1是零矩阵。
为了让观测器系统稳定,需要进行极点配置。假设让这个三阶的状态观测器的三个极点全部位于左半平面的 − ω 0 -ω_0 ω0处,则增益 L L L就需要特别设计。令 A 1 A_1 A1的特征值 = − ω 0 -ω_0 ω0,可解得 l 1 = 3 ω 0 , l 2 = 3 ω 0 2 , l 3 = ω 0 2 l_1=3\omega_0,l_2=3\omega_0^2,l_3=\omega_0^2 l1=3ω0l2=3ω02l3=ω02 ω 0 ω_0 ω0即是观测器的带宽,应当根据实际系统来设计。如果带宽选择过小,可能会导致扩张状态 x 3 x_3 x3的观测 x 3 ^ \hat{x_3} x3^的跟随性变差,带宽选择过大的话有可能会引入额外的噪声。 u u u的系数 c c c在设计的时候有可能是不知道的,但是仿真表明 c c c的选择即使跟真实的系统有偏差,ESO也能正常工作(但这一点目前尚无严格的理论证明)。至此,扩张状态观测器设计完成!!

3、NLSEF(控制器)

ADRC的控制器部分的输入包含两个部分,分别是TD的输出结果(输入信号及其微分)和ESO的输出(包含三个元素的状态向量 y ^ \hat{y} y^)。因此它就有5个输入量。其中 y ^ \hat{y} y^的第三个分量 x 3 ^ \hat{x_3} x3^的作用,是通过观测,将复杂系统转化为纯积分器,简化控制。
依然是这个二阶系统
y ¨ = a y ˙ + b y + c u + d \ddot{ y}=a\dot{y}+by+cu+d y¨=ay˙+by+cu+d扩张状态 x 3 = a y ˙ + b y + d x_3=a\dot{y}+by+d x3=ay˙+by+d。假设状态观测器工作顺利, x 3 x_3 x3的观测值 x 3 ^ \hat{x_3} x3^就等于真实的 x 3 x_3 x3,即满足 x 3 = x 3 ^ x_3=\hat{x_3} x3=x3^那么将系统的输入,也即控制器的输出 u u u设计为 u = u 0 − x 3 ^ c u=\frac{u_0-\hat{x_3}}{c} u=cu0x3^带入上面的二阶系统,可以得到 y ¨ = u 0 \ddot{y}=u_0 y¨=u0即一个二阶积分器。设计一个PD控制器来控制 u 0 u_0 u0:(一般稳态的时候给定的目标值(reference)都是恒定的,即 r ˙ = 0 \dot{r}=0 r˙=0 r ¨ \ddot{r} r¨为前馈项,用于去除稳态误差。但很多时候都是把它忽略的,加上这一项之后有可能会影响响应速度) u 0 = K p ( r − x 1 ) + K d ( r ˙ − x 2 ) + r ¨ u_0=K_p(r-x_1)+K_d(\dot{r}-x_2)+\ddot{r} u0=Kp(rx1)+Kd(r˙x2)+r¨同样按照极点配置的方法,可得到 K p = ω c 2 K_p=ω_c^2 Kp=ωc2 K = 2 ω c K_=2ω_c K=2ωc。如此,控制器传递函数中阻尼系数 ξ = 1 ξ=1 ξ=1,处于临界阻尼,系统无超调。当然 K p 、 K d K_p、K_d KpKd设计的方法很多,可以综合超调和响应速度来调节。

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

ADRC学习心得(持续更新) 的相关文章

随机推荐

  • 关于overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷等等)

    一 overflow hidden 溢出隐藏 给一个元素中设置overflow hidden xff0c 那么该元素的内容若超出了给定的宽度和高度属性 xff0c 那么超出的部分将会被隐藏 xff0c 不占位 css样式 lt style
  • 谈一谈自己对线程,进程的理解。

    进程 一段程序的执行的实例化 xff0c 是一个实体 xff0c 每一个进程都有自己的地址空间 三个状态 xff0c 就绪 xff0c 运行和阻塞 就绪就是等待处理器分配资源后可以立即执行 xff0c 阻塞就是条件不够的时候 xff0c 需
  • mavlink c 编码解码demo

    include 34 common mavlink h 34 include 34 common mavlink msg local position ned h 34 include 34 common mavlink msg sys s
  • 什么是解耦

    耦合度 是软件工程领域的概念 xff0c 指模块之间的依赖程度 模块可以小到一个功能 xff0c 也可以大到一个系统 解耦 解除或降低模块之间的耦合关系 模块之间有依赖关系就必然存在耦合 xff0c 0耦合是基本无可能的理想状态 解耦的好处
  • 类域和访问类的成员

    1 类的数据成员 xff08 类中声明的变量 xff09 和成员函数 xff08 类定义中声明的函数 xff09 属于该类的类域 非成员函数在全局命名域内定义 2 在类域内 xff0c 类的成员可以被该类的所有成员函数直接访问 xff0c
  • FreeRTOS学习记录(一):数据、变量、函数特点

    2022 04 22 依据 xff1a 野火 FreeRTOS内核实现与应用开发实战指南 目录 数据类型 变量名 函数名 宏 数据类型 FreeRTOS对C里的数据类型做了重定义 xff0c 在portmacro h 文件中 portmac
  • FreeRTOS学习记录(三)(扩展)嵌套结构体展开

    分析代码的辅助文章 xff0c 不重要 目录 链表节点数据结构 链表根节点数据结构 内部嵌套 链表精简节点 链表节点初始化 链表根节点初始化 将节点插入到链表尾部 将节点按照升序排列插入到链表 将节点从列表删除 任务控制块 链表节点数据结构
  • FreeRTOS学习记录(四):任务、任务切换(难点)

    2022 04 23 依据 xff1a 野火 FreeRTOS内核实现与应用开发实战指南 目录 一 任务 二 创建任务 1 定义任务栈 2 定义任务函数 3 定义任务控制块 4 实现任务创建函数 xTaskCreateStatic 函数 p
  • FreeRTOS学习记录(六):空闲任务与阻塞延时的实现

    2022 04 24 依据 xff1a 野火 FreeRTOS内核实现与应用开发实战指南 目录 一 实现空闲任务 1 实现空闲任务 定义空闲任务的任务控制块 创建空闲任务 二 阻塞延时 1 vTaskDelay 函数 2 修改 vTaskS
  • 万拓双控存储VS3000

    万拓双控存储 VS3000是万拓推出的新一代基于intel高性能服务器平台推出的双控24盘位存储产品 xff0c 凭借面向云架构的存储操作系统 强大的新一代硬件平台和丰富的智能管理软件该产品 xff0c 该产品采用WEB GUI管理界面 x
  • ubuntu中用anaconda下载库很慢的解决方法2020.3.5

    1 安装anaconda xff0c 去清华源下载 安装添加链接描述 2 由于第三方库在国外 xff0c 在没有梯子的情况下无法用conda install numpy来安装numpy xff0c 所以第二步就是切换清华源添加链接描述 3
  • ubuntu中Docker中开发ROS——使用gui访问docker中的ros

    ubuntu中Docker中开发ROS 使用gui访问docker中的ros 前言1 拉取带有vnc图形界面的ros镜像2 运行该镜像3 浏览器进入通过端口访问docker中的ros的界面4 也可以像常规一样用终端进入docker ros容
  • Ubuntu中安装vmware

    linux中安装虚拟机vmware ubuntu18中安装vmware15pro ubuntu18中安装vmware15pro vmware这个下载页面我找了好久 vmware真正的下载页面
  • px4混控器流程理解 motor test qgc调试

    sys autostart 索引是5000 启动是加载5000 generic ground vehicle文件 xff0c 此脚本指定混控脚本文件55行是rover generic 华丽分界线 四悬翼 sys autostart 索引是4
  • 自动驾驶决策规划算法第一章笔记 忠厚老实的老王

    第一章 自动驾驶决策规划算法数学基础 第一节 xff1a 决策规划算法的地位和作用 该笔记来自b站up主 xff08 偶像 xff09 xff1a 憨厚老实的老王视频链接主页 第二节 xff1a 为什么规划中经常见到五次多项式
  • 老王自动驾驶规划算法数学基础笔记-第四节cartesian到frenet坐标系的转化

    该笔记来自b站up主 xff08 偶像 xff09 xff1a 憨厚老实的老王B站视频链接
  • windows下如果批量修改文件的后缀名

    背景 电脑上有几十个mp4格式的视频学习资料 xff0c 这些资料都学完了 xff0c 打算把它安全的封存起来 xff0c 最有效的封存方法是把名字修改了 xff0c 而且后缀名mp4删掉或者改成一个不常见的后缀名 刚开始我是一个一个的重命
  • 在C++中使用map来取代很多个if else和switch

    在C 43 43 中使用map来取代很多个if else和switch 利用map中的key和value键值对来取代if else效率会好不少 span class token macro property span class token
  • C++类:类中的静态属性和函数、常量函数与常对象、类在内存中的存储

    静态属性 静态成员包括静态成员属性 静态成员函数 一个属性一旦设置为静态 xff0c 那么整个程序中就独其一份 如上所示 xff0c 之前p m A的值是100 使用p2 m A更改了该值为200后 xff0c 即使再用p m A去调用 x
  • ADRC学习心得(持续更新)

    两年前第一次接触到PID觉得很高深 xff0c 很神奇 xff1b 后来逐渐觉得单纯的PID小儿科了 xff0c 又了解到专家PID xff0c 模糊PID xff0c 神经网络PID这些改进算法 xff0c 再后来又知道了ADRC xff