一个非奇异快速终端滑模控制(NTSM)实例及仿真

news2024/11/25 15:49:50

一、被控对象

考虑这么一个被控对象
J θ ¨ ( t ) = u ( t ) + d ( t ) J \ddot\theta(t) = u(t) + d(t) Jθ¨(t)=u(t)+d(t)
其中, J J J 为转动惯量, θ \theta θ 为角度, u u u 为控制量, d d d 为扰动,且 d ( t ) < D d(t) < D d(t)<D 扰动有界

二、设计滑模面

2.1、传统快速Terminal滑模面

s = x ˙ + β x q / p = 0 s = \dot x + \beta x ^ {q/p} = 0 s=x˙+βxq/p=0

其中 x ∈ R 1 x \in R ^ 1 xR1 属于状态变量, β > 0 , p , q ( p > q ) \beta > 0,p,q(p>q) β>0,p,q(p>q) 为正奇数。由上式可得
d x d t = − β x q / p \frac{dx}{dt} = - \beta x ^ {q/p} dtdx=βxq/p

d t = − 1 β x q / p d x dt = - \frac{1}{\beta} x ^ {q/p}dx dt=β1xq/pdx

∫ 0 t d t = − ∫ x 0 0 1 β x q / p d x \int_{0}^{t} dt = -\int_{x_0}^{0}\frac{1}{\beta} x ^ {q/p}dx 0tdt=x00β1xq/pdx

从而得到从任意初始状态 x ( 0 ) ≠ 0 x(0) \ne 0 x(0)=0 沿滑动模态到达平衡状态 x = 0 x=0 x=0 的时间为
t s = p β ( p − q ) ∣ x ( 0 ) ∣ ( p − q ) / p t_s = \frac{p}{\beta(p-q)}|x(0)|^{(p-q)/p} ts=β(pq)px(0)(pq)/p

2.2、非奇异Terminal滑模面

为了解决普通Terminal滑模控制中的奇异性问题,提出了非奇异的Terminal滑模控制,
s = x 1 + 1 β x 2 p / q s = x_1 + \frac{1}{\beta} x_2 ^ {p/q} s=x1+β1x2p/q

一些思考

我们可以看到上面的滑模面,有的是 x ˙ \dot x x˙ x x x ,有的是 x 1 x_1 x1 x 2 x_2 x2 ,为什么呢?这里我有一些我的思考,其实他们都是一样的,他们的控制对象是下面这个不确定非线性动态系统,这个不确定非线性动态系统的状态 x 1 x_1 x1 就是 x x x x 2 x_2 x2 就是 x ˙ \dot x x˙
{ x ˙ 1 = x 2 x ˙ 2 = f ( x ) + g ( x ) u + d ( x , t ) \begin{cases} \dot x_1 = x_2\\ \dot x_2 = f(x) + g(x) u + d(x,t) \end{cases} {x˙1=x2x˙2=f(x)+g(x)u+d(x,t)
其中跟踪误差及其导数为, θ d \theta_d θd 为理想的角度信号
{ e ( t ) = θ ( t ) − θ d ( t ) e ˙ ( t ) = θ ˙ ( t ) − θ ˙ d ( t ) e ¨ ( t ) = θ ¨ ( t ) − θ ¨ d ( t ) \begin{cases} e(t) = \theta (t) - \theta_d(t) \\ \dot e(t) = \dot\theta (t) - \dot\theta_d(t) \\ \ddot e(t) = \ddot\theta (t) - \ddot\theta_d(t) \\ \end{cases} e(t)=θ(t)θd(t)e˙(t)=θ˙(t)θ˙d(t)e¨(t)=θ¨(t)θ¨d(t)

所以放在这个真实的系统中,状态 x 1 x_1 x1 就是 e ( t ) e(t) e(t) x 2 x_2 x2 就是 e ˙ ( t ) \dot e(t) e˙(t)

三、获得控制量

传统快速Terminal滑模的控制量为:
u = − g − 1 ( x ) ( f ( x ) + β q p x 1 q / p − 1 x 2 + ( D + ε ) s g n ( s ) ) u = - g^{-1}(x)(f(x) + \beta \frac{q}{p}x_1^{q/p-1}x_2 + (D + \varepsilon)sgn(s)) u=g1(x)(f(x)+βpqx1q/p1x2+(D+ε)sgn(s))
非奇异Terminal滑模的控制量为:
u = − g − 1 ( x ) ( f ( x ) + β q p x 2 2 − p / q x 2 + ( D + ε ) s g n ( s ) ) u = - g^{-1}(x)(f(x) + \beta \frac{q}{p}x_2^{2-p/q}x_2 + (D + \varepsilon)sgn(s)) u=g1(x)(f(x)+βpqx22p/qx2+(D+ε)sgn(s))

四、证明稳定性

4.1、传统快速Terminal滑模面

设LYapunov函数 V = 1 2 S 2 V=\frac{1}{2}S^2 V=21S2,则有
V ˙ = s s ˙ = s ( x ˙ 2 + β q p x 1 q p − 1 x ˙ 1 ) = s ( f ( x ) + g ( x ) u + d ( x , t ) + β q p x 1 q p − 1 x ˙ 1 ) = s ( d ( x , t ) − ( D + ε ) s g n ( s ) ) = s d ( x , t ) − ( D + ε ) ∣ s ∣ ≤ − ε ∣ s ∣ \begin{align} \dot V &= s \dot s \\ &= s(\dot x_2 + \beta\frac{q}{p}x_1^{\frac{q}{p}-1}\dot x_1) \\ &= s(f(x) + g(x)u + d(x,t) + \beta\frac{q}{p}x_1^{\frac{q}{p}-1}\dot x_1) \\ &= s(d(x,t)-(D+\varepsilon) sgn(s)) \\ &=sd(x,t) - (D+\varepsilon)|s| \\ &\le -\varepsilon|s| \end{align} V˙=ss˙=s(x˙2+βpqx1pq1x˙1)=s(f(x)+g(x)u+d(x,t)+βpqx1pq1x˙1)=s(d(x,t)(D+ε)sgn(s))=sd(x,t)(D+ε)sεs
可见,当干扰$d(t) $ 有上界时,即 d ( t ) < D d(t) < D d(t)<D 扰动有界,若 ε \varepsilon ε 取值合理,则系统稳定。

4.2、非奇异Terminal滑模面

设LYapunov函数 V = 1 2 S 2 V=\frac{1}{2}S^2 V=21S2,则有
V ˙ = s s ˙ = s ( x ˙ 1 + 1 β p q x 2 p q − 1 x ˙ 2 ) = s 1 β p q x 2 p q − 1 x ˙ 2 ( d ( x , t ) − ( D + ε ) s g n ( s ) ) = 1 β p q x 2 p q − 1 x ˙ 2 ( s d ( x , t ) − ( D + ε ) ∣ s ∣ ) \begin{align} \dot V &= s \dot s \\ &= s(\dot x_1 + \frac{1}{\beta}\frac{p}{q}x_2^{\frac{p}{q}-1}\dot x_2) \\ &= s \frac{1}{\beta}\frac{p}{q}x_2^{\frac{p}{q}-1}\dot x_2 (d(x,t)-(D+\varepsilon) sgn(s)) \\ &=\frac{1}{\beta}\frac{p}{q}x_2^{\frac{p}{q}-1}\dot x_2(sd(x,t) - (D+\varepsilon)|s|) \\ \end{align} V˙=ss˙=s(x˙1+β1qpx2qp1x˙2)=sβ1qpx2qp1x˙2(d(x,t)(D+ε)sgn(s))=β1qpx2qp1x˙2(sd(x,t)(D+ε)s)
由于 1 < p q < 2 1<\frac{p}{q}<2 1<qp<2 所以 0 < p q − 1 < 1 0 < \frac{p}{q} - 1 < 1 0<qp1<1 β > 0 \beta > 0 β>0 ,所以 x 2 p q − 1 > 0 ( x 2 ≠ 0 ) x_2 ^ {\frac{p}{q} - 1} > 0(x_2 \ne 0) x2qp1>0(x2=0) ,所以 V ˙ = − η ′ ∣ s ∣ ≤ 0 \dot V = -\eta ' |s| \le 0 V˙=ηs0 ,根据当 V ˙ ≡ 0 \dot V \equiv 0 V˙0 时, s ≡ 0 s \equiv 0 s0,LaSalle不变形原理, t → ∞ t \to \infty t 时, s → 0 s \to 0 s0 ,根据快速滑动模态特性, t → ∞ t \to \infty t x → 0 x \to 0 x0

可见,当 x 2 ≠ 0 x_2 \ne 0 x2=0 时,控制器满足LYapunov稳定条件。

五、实验

这里我们仅验证非奇异Terminal滑模面,其实其他的是一样的

需要注意一件事,在编程时, x 5 3 x ^ {\frac{5}{3}} x35 这种分数形式,不能直接写成

x ** (5 / 3)

这样写的话会出现虚数,需要写成下面的格式

np.abs(x) ** (5 / 3) * np.sign(x)

这里我的示例是python,但是其他的编程语言也一样,包括Matlab,C++等。

代码如下

import numpy as np
import matplotlib.pyplot as plt


class ControlModel():
    def __init__(self):
        self.T = 10
        self.times = 10 * 1000
        self.time_T = self.T / self.times

        self.pos = 0

        self.theta = np.zeros(self.times, dtype='float64')
        self.dot_theta = np.zeros(self.times, dtype='float64')
        self.u = np.zeros(self.times, dtype='float64')
        self.d = np.zeros(self.times, dtype='float64')
        self.J = 10

        self.Max_u = 30

    def reset(self):
        self.pos = 0
        self.dot_theta[0] = np.deg2rad(0)
        self.theta[0] = np.deg2rad(0)
        self.d[0] = 0

    def step(self, u):
        if self.pos >= self.times:
            return True

        if np.abs(u) > self.Max_u:
            u = np.sign(u) * self.Max_u

        self.u[self.pos] = u
        self.d[self.pos] = 2
        self.stepOnce()
        self.pos += 1

        return False

    def stepOnce(self):
        data = np.array([self.u[self.pos],
                         self.d[self.pos],
                         self.dot_theta[self.pos],
                         self.theta[self.pos],
                         self.J])

        k1 = self.time_T * self.iterateOnce(data)
        k2 = self.time_T * self.iterateOnce(data + 0.5 * k1)
        k3 = self.time_T * self.iterateOnce(data + 0.5 * k2)
        k4 = self.time_T * self.iterateOnce(data + k3)

        data = data + (k1 + 2 * k2 + 2 * k3 + k4) / 6

        self.dot_theta[self.pos + 1] = data[2]
        self.theta[self.pos + 1] = data[3]

    def iterateOnce(self, data):
        u = data[0]
        d = data[1]
        dot_theta = data[2]
        theta = data[3]
        J = data[4]

        _dot_theta = (u + d) / J
        _theta = dot_theta

        return np.array([0, 0, _dot_theta, _theta, 0])

    def get_theta(self):
        return self.theta[self.pos - 1]

    def get_dot_theta(self):
        return self.dot_theta[self.pos - 1]


class Control:
    def __init__(self):
        self.e = 0
        self.dot_e = 0
        self.ddot_e = 0
        self.T = 10
        self.times = 10 * 1000
        self.time_T = self.T / self.times

    def insert(self, e):
        self.ddot_e = (e - self.e - self.dot_e)
        self.dot_e = (e - self.e)
        self.e = e

    def get_e(self):
        return self.e

    def get_dot_e(self):
        return self.dot_e

    def get_ddot_e(self):
        return self.ddot_e


M = ControlModel()
M.reset()
C = Control()
T = Control()

theta_list = []
for i in range(M.times - 1):
    theta_d = np.sin(i / 1000)
    theta_list.append(theta_d)
    e = (M.get_theta() - theta_d) / M.time_T
    C.insert(e)
    T.insert(theta_d)

    c = 10
    varesplion = 3
    beta = 3
    q = 3
    p = 5
    T1 = np.abs(C.get_dot_e()) ** (p / q) * np.sign(C.get_dot_e())
    T2 = np.abs(C.get_dot_e()) ** (2 - p / q) * np.sign(C.get_dot_e())
    s = C.get_e() + 1 / beta * T1
    u = - M.J * (beta * q / p * T2 + varesplion * np.sign(s))

    M.step(u)

plt.figure(2)
plt.plot(M.theta)
plt.plot(theta_list)
plt.show()

plt.figure(3)
plt.plot(M.u)
plt.show()

跟踪效果如图所示

请添加图片描述

控制量

请添加图片描述

我们发现跟踪效果不错,但是控制量是存在抖振的,而这种抖振是需要我们在控制过程中去避免的。

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

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

相关文章

vue diff算法与虚拟dom知识整理(7) 根据init.ts源码简单梳理patch都做了些什么

之前我们也见证了 diff算法 的强大 但他 只有确认是同一个节点才做对比 如果不是就直接暴力拆卸了 我们打开我们的案例 找到 node_modules 下面的snabbdom/src下面的 init.ts文件 init.ts 拉到最下面 我们就可以看到这个返回的patch函数 patch相比于他的功能 代码算比较少的…

LeetCode高频算法刷题记录1

文章目录 1. 无重复字符的最长子串【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 反转链表【简单】2.1 题目描述2.2 解题思路2.3 代码实现 3. LRU 缓存【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 数组中的第K个最大元素【中等】4.1 题目描述4.2 解题思路4.3 代码实现…

吴恩达OpenAI最新课程:prompt-engineering-for-developers读书笔记

文章目录 一、前言二、Prompt编写原则2.1 环境配置2.2 编写清晰、具体的指令2.2.1 使用分隔符2.2.2 结构化输出&#xff08;JSON、HTML等&#xff09;2.2.3 要求模型检查条件是否满足2.2.4 提供少量示例&#xff08;Few-shot Prompting&#xff09; 2.3 指导模型思考2.3.1 指定…

未来工业维护:探索数据分析与机器学习的融合之路

随着工业领域相关技术的不断发展&#xff0c;预测性维护作为一种先进的维护策略&#xff0c;正日益受到企业的重视。预测性维护的核心目标是通过准确预测设备故障的发生时间&#xff0c;实现及时维护和优化生产效率。而在实现这一目标的过程中&#xff0c;数据分析和机器学习的…

FreeRTOS:任务状态和信息查询

目录 一、任务相关 API函数预览二、任务相关API函数详解2.1uxTaskPriorityGet()2.2vTaskPrioritySet()2.3uxTaskGetSystemState() ※※※※※2.4vTaskGetInfo() ※※※※※2.5xTaskGetApplicationTaskTag()2.6xTaskGetCurrentTaskHandle()2.7xTaskGetHandle()2.8xTaskGetIdleTa…

教你用JMeter做接口测试的几个简单实例

目录 前言 1、登录&#xff08;POST&#xff09; 登录 2、获取学生信息&#xff08;GET&#xff09; 获取学生信息 3、添加学生信息&#xff08;POST&#xff0c;JSON&#xff09; 添加学生信息 4、学生充值金币&#xff08;POST&#xff0c;Cookie&#xff09; 学生金…

【Linux】11. 进程控制

小实验(谨慎测试) 1. 进程退出码的引出 2. 进程码的使用 3. 进程退出 3.1 进程退出情况 进程退出分三种情况&#xff1a; 1.代码运行完毕&#xff0c;结果正确 – return 0; 2.代码运行完毕&#xff0c;结果不正确 – 根据退出码判断错误情况 3.代码没有运行完毕&#xff0c;…

如何0基础自学黑客(网络安全)技术,万字长文教你如何学习黑客(网络安全)

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

【数字化转型-06】数字化转型咨询项目中如何做好高层访谈

咨询项目中少不了至关重要的一步&#xff0c;那就是高层访谈&#xff0c;做好高层访谈&#xff0c;对于咨询项目至关重要&#xff0c;我们接触的维度越高&#xff0c;就会越能把控项目的真实意图&#xff0c;有的放矢&#xff0c;不会让下面的人带偏&#xff1b;另一方面我们也…

Vue3 使用 Ts 泛型 封装本地存储

前期回顾 NVM —— 你把我玩明白_彩色之外的博客-CSDN博客本文将学习 使用 NVM 管理node版本https://blog.csdn.net/m0_57904695/article/details/130670262?spm1001.2014.3001.5501 目录 新建 \src\utils\storage-utils.ts 使用 泛型示例 泛型交换变量 泛型 strin…

在Linux系统中用vim编写第一个C语言之gcc编译器

文章目录 在Linux系统中用vim编写第一个C语言HelloWorld第一步 创建第二步 编写第三步&#xff0c;编译第四步 运行 gcc四步骤gcc常用选项 在Linux系统中用vim编写第一个C语言HelloWorld 第一步 创建 vim HelloWorld.c第二步 编写 #include<stdio.h>int main(){printf(…

Android Jsoup爬取网页数据及其局限性,接口爬取数据的思路

1.Jsoup jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 需求是需要获取某个网站上的排行榜数据&#xff0c;用作App展示&am…

【axios】后端未收到前端post传参

今天遇到过问题&#xff0c;前端post请求参数明明已经传过去了&#xff0c;可是后端说没收到&#xff0c;不知道后端大哥是不是故意搞我。 代码前端图如下↓ 代码 import axios from axios //对象形式 const val {pass:123,user:name}axios.post(/api/login, val).then(res>…

Vue3-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;vue3-router-动态路由3 &#xff08;2&#xff09;vue3-进阶router-动态菜单 &#xff08;3&#xff09;vue3-进阶-router-令牌-获取用户信息 &#xff08;1&#xff09;vue3-router-动态路由3 登录页面后&#xff0c;如果点击了…

Android技术探索与实践:从新功能体验到故障调试的全方位探索

目录 Android技术探索与实践&#xff1a;从新功能体验到故障调试的全方位探索 第一章&#xff1a;技术解析 Android平台的架构和工作原理 应用组件的生命周期和交互方式 Android开发中常用的设计模式和技术框架解析 第二章:产品新功能体验测评 深入了解最新发布的Androi…

【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

图中红色代表整个framework层 binder架构相关组件&#xff1b; Binder类代表Server端&#xff0c;BinderProxy类代码Client端&#xff1b;图中蓝色代表Native层Binder架构相关组件&#xff1b;上层framework层的Binder逻辑是建立在Native层架构基础之上的&#xff0c;核心逻辑都…

shell编程:概述、脚本入门、变量、运算符、条件判断、流程控制、读取控制台、函数、正则表达式、文本处理工具、综合案例

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2&#xff09;bash 和 sh 的关系 sh&#xff1a;比较基础bash&#xff1a;功能更加强大&#xff0c;默…

三十四、Hybrid 接口用法解析

文章目录 前言交换机接口类型有哪些Hybrid 端口使用场景什么时候必须使用 Hybrid 一、Hybrid 特点二、Hybrid 当做 access和trunk使用三、Hybrid 特殊用法 前言 交换机接口类型有哪些 Access、trunk、Hybrid、qinq Hybrid 端口使用场景 接pc、服务器、接交换机、接路由器&a…

Linux守护进程

"忍耐的灵魂啊&#xff0c;安静地运转吧~" 我们先来看看这个场景。这是一个常见的基于TCP套接字的网络服务器&#xff0c;服务端接收客户端发送的消息&#xff0c;收到后并向echo回响给客户端。 对于Linux而言&#xff0c;终端只能有一个前台进程&#xff0c;这也是为…

行业唯一丨冠珠出席“中国企业社会责任高峰论坛”,并荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…