一个滑模控制(SMC)实例及仿真

news2024/11/15 15:52:41

被控对象

考虑这么一个被控对象
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 扰动有界

设计滑模面

设计滑模面为
s = c e ( t ) + e ˙ ( t ) s = ce(t) + \dot e(t) s=ce(t)+e˙(t)
其中跟踪误差及其导数为, θ d \theta_d θd 为理想的角度信号
e ( t ) = θ ( t ) − θ d ( t ) e(t) = \theta (t) - \theta_d(t) e(t)=θ(t)θd(t)

e ˙ ( t ) = θ ˙ ( t ) − θ ˙ d ( t ) \dot e(t) = \dot\theta (t) - \dot\theta_d(t) e˙(t)=θ˙(t)θ˙d(t)

获得控制量

s ˙ = c e ˙ ( t ) + e ¨ ( t ) = c e ˙ ( t ) + 1 J ( u ( t ) + d ( t ) ) − θ ¨ d ( t ) = − ε s g n ( s ) \begin{align} \dot s &= c \dot e(t) + \ddot e(t) = c \dot e(t) + \frac{1}{J} (u(t) + d(t)) - \ddot \theta_d(t) = -\varepsilon sgn(s) \end{align} s˙=ce˙(t)+e¨(t)=ce˙(t)+J1(u(t)+d(t))θ¨d(t)=εsgn(s)

反解出控制量 u ( t ) u(t) u(t)
u ( t ) = J ( − c e ˙ ( t ) + θ ¨ d ( t ) − ε s g n ( s ) ) − d ( t ) u(t) = J(-c\dot e(t) + \ddot \theta_d(t) - \varepsilon sgn(s)) - d(t) u(t)=J(ce˙(t)+θ¨d(t)εsgn(s))d(t)
这里我们忽略干扰
u ( t ) = J ( − c e ˙ ( t ) + θ ¨ d ( t ) − ε s g n ( s ) ) u(t) = J(-c\dot e(t) + \ddot \theta_d(t) - \varepsilon sgn(s)) u(t)=J(ce˙(t)+θ¨d(t)εsgn(s))

证明稳定性

设LYapunov函数 V = 1 2 S 2 V=\frac{1}{2}S^2 V=21S2,则有
V ˙ = s s ˙ = s ( c e ˙ ( t ) + e ¨ ( t ) ) = s ( c e ˙ ( t ) + 1 J ( u ( t ) + d ( t ) ) − θ ¨ d ( t ) ) = s ( c e ˙ ( t ) + 1 J ( J ( − c e ˙ ( t ) + θ ¨ d ( t ) − ε s g n ( s ) ) + d ( t ) ) − θ ¨ d ( t ) ) = s ( − ε s g n ( s ) + 1 J d ( t ) ) = − ε ∣ s ∣ + 1 J s d ( t ) \begin{align} \dot V &= s \dot s \\ &= s(c \dot e(t) + \ddot e(t)) \\ &= s(c \dot e(t) + \frac{1}{J} (u(t) + d(t)) - \ddot \theta_d(t)) \\ &= s(c \dot e(t) + \frac{1}{J} (J(-c\dot e(t) + \ddot \theta_d(t) - \varepsilon sgn(s)) + d(t)) - \ddot \theta_d(t)) \\ &= s(-\varepsilon sgn(s) + \frac{1}{J} d(t)) \\ &= -\varepsilon |s| + \frac{1}{J}sd(t) \end{align} V˙=ss˙=s(ce˙(t)+e¨(t))=s(ce˙(t)+J1(u(t)+d(t))θ¨d(t))=s(ce˙(t)+J1(J(ce˙(t)+θ¨d(t)εsgn(s))+d(t))θ¨d(t))=s(εsgn(s)+J1d(t))=εs+J1sd(t)
可见,当干扰$d(t) $ 有上界时,即 d ( t ) < D d(t) < D d(t)<D 扰动有界,若 ε \varepsilon ε 取值合理,则系统稳定。

python仿真程序

假设我们跟踪的仿真信号为 θ d ( t ) = s i n ( t ) \theta_d(t) = sin(t) θd(t)=sin(t) ,转动惯量 J = 10 J=10 J=10 ,初始值 θ ( 0 ) = 0 \theta(0) = 0 θ(0)=0 θ ˙ ( 0 ) = 0 \dot \theta(0) = 0 θ˙(0)=0

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] = 10
        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

    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 = (theta_d - M.get_theta()) / M.time_T
    C.insert(e)
    T.insert(theta_d)

    c = 5
    varesplion = 3
    s = c * C.get_e() + C.get_dot_e()
    u = M.J * (c * C.get_dot_e() + T.get_ddot_e() + varesplion * np.sign(s))

    M.step(u)

仿真结果

位置跟踪曲线如下

请添加图片描述

控制量曲线如下

请添加图片描述

可见,位置跟踪的效果还是不错的,这里我们进行了一定的限幅,限幅影响了它的控制效果,但是控制量是存在抖振的,在真实的控制环境中,元器件不一定承受的起这种抖振。

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

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

相关文章

联想天逸510S-i5电脑如何重装windows系统

如果你的联想天逸510S-i5电脑出现了系统故障、病毒感染、运行缓慢等问题&#xff0c;你可能需要重装系统来解决。但是&#xff0c;联想天逸510S-i5电脑如何重装windows系统呢?本文将为你介绍两种方法&#xff1a;用U盘重装系统和用联想系统自带的重置功能。 ​ 联想天逸510S…

天气预报查询 API 提供个性化的天气服务的设计思路

引言 假设你是一个开发人员或公司&#xff0c;正在考虑开发一款天气应用程序&#xff0c;但你意识到市场上已经有很多竞争者在使用天气预报查询 API 来提供类似的服务&#xff0c;本文将一起探寻一些创新的方法来提高应用程序的竞争力。 扩大竞争力的一些建议 如果市面上已经…

java企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

OpenWrt SDK 制作与使用

OpenWrt SDK 制作与使用 参考资料&#xff1a;https://openwrt.org/docs/guide-developer/toolchain/using_the_sdk SDK 制作 make menuconfig 选中 SDK 然后编译 编译完后&#xff1a; bin/targets/sunxi/cortexa7/openwrt-sdk-sunxi-cortexa7_gcc-10.2.0_musl_eabi.Linux…

搭建大型分布式服务(四十六)利用mockito不启动SpringBoot项目下进行单元测试

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、编写真实类四、编写测试类四、小结 前言 SpringBoot支持集成Mockito做单元测试&#xff0c;有时候SpringBoot有很多外部依赖&#xff0c;在本地很难启动或者启动时间很长&#xff0c;而我们只想对某个方法…

Lattics ——一款简单易用、好看强大的知识管理工具

如何选择一款适合自己的知识管理工具&#xff1f; 对于很多用户而言&#xff0c;在追求效率的路上&#xff0c;经常需要一款适合自己的知识管理工具。然而&#xff0c;随着工具市场的发展&#xff0c;各种新兴工具层出不穷。在传统领域&#xff0c;有印象笔记、Onenote 为代表…

ChatGPT实现知识图谱生成

知识图谱生成 在之前章节中&#xff0c;我们尝试过让 ChatGPT 对一段文本做实体识别和词性分析&#xff0c;结果很不错。但如果是需要长期留存下来&#xff0c;后续在不同场景下快速查询分析&#xff0c;最好还是要把数据存入到专门的图数据库中&#xff0c;才能方便随时读取。…

SpringCloud学习(八)——Docker

文章目录 1. 认识Docker1.1 容器1.2 Linux容器1.3 Docker 2. 配置Docker2.1 安装Docker2.2 启动Docker2.3 配置镜像加速 3. Docker镜像操作3.1 拉取镜像3.2 镜像的打包和加载3.3 查看帮助文档 4. 容器命令4.1 运行容器4.2 进入容器4.3 数据卷 5. 自定义镜像5.1 Dockerfile语法5…

svo论文解读

SVO: Semi-Direct Visual Odometry for Monocular and Multi-Camera Systems 2016TRO MOTION ESTIMATION 1 Sparse Image Alignment 从上一帧的特征投影到当前帧&#xff0c;最小化重投影误差计算帧间位姿&#xff08;patch44&#xff09; 2 Relaxation Through Feature Alig…

Vue案例

1. 查询所有 1.1 采用dom方式&#xff0c;拼字符串操作写ajax请求 这种方法书写麻烦&#xff0c;采用Vue的方式书写 <script>//1. 当页面加载完成后&#xff0c;发送ajax请求window.onload function () {//2. 发送ajax请求axios({method:"get",url:"http…

利用ECharts实现winform中的可视化图表

利用ECharts实现winform中的可视化图表 背景思路第一步&#xff08;先搞一个能展示图表的html文件&#xff09;第二步&#xff08;封装到winform中&#xff09;第三步 写代码第四步 winfrom与html交互在html中增加方法 如下在winfrom中增加调用方法数据文件代码 完整的运行效果…

Python教程——Python本地环境安装

文章目录 简介安装Python下载安装验证安装结果 手动添加环境变量安装问题 简介 python官网&#xff1a;https://www.python.org/ Python Windows下载地址&#xff1a;https://www.python.org/downloads/windows/ Python 官方文档&#xff1a;https://www.python.org/doc/ Pytho…

man,cp,mv,alias,more,less,head,tail指令与文件片段读取和管道的初步介绍

tips 文件夹就是目录定位某个文件的位置&#xff0c;本质上就是在Linux的多叉树目录结构下去定位它的位置文件名主干&#xff08;不考虑前缀路径&#xff09;以. 开头的文件就被称为隐藏文件任何一个目录下面都有一个.隐藏文件与…隐藏文件无论window还是Linux&#xff0c;常识…

C语言文件操作【基础知识 + 顺序读写 + 文件版通讯录】

全文目录 &#x1f600; 前言&#x1f914; 什么是文件&#x1f636; 程序文件&#x1f636; 数据文件&#x1f636; 文件名 &#x1f928; 文件指针&#x1f92b; 文件的打开和关闭&#x1f611; fopen 打开文件&#x1f4d9; **mod的规律&#xff1a;** &#x1f611; fclose…

registry私有仓库搭建

目录 一、搭建本地仓库 1、首先下载registry镜像 2、在daemon.json文件中添加私有镜像仓库地址 3、运行registry容器 4、为镜像打标签 5、上传到私有仓库 6、列出私有仓库的所有镜像 7、列出私有仓库的centos 镜像有哪些tag 8、先删除原有的centos的镜像&#xff0c;再…

(九)Geoprocessing地理处理框架——ArcToolbox内容简介

&#xff08;九&#xff09;Geoprocessing地理处理框架——ArcToolbox内容简介 目录 &#xff08;九&#xff09;Geoprocessing地理处理框架——ArcToolbox内容简介 1.工具集简介1.1 3D Analyst工具箱&#xff1a;1.2分析工具箱:1.3制图工具箱:1.4转换工具箱:1.5Data Interoper…

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯&#xff0c;尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了&#xff0c;保护视力刻不容缓呀! 很多人不知道&#xff0c;其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯&#xff0c;看着一样能用&#xff0c;其实时间久了 对孩子眼睛的…

java版企业电子招投标系统源代码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

每天一道算法练习题--Day20 第一章 --算法专题 --- ----------滑动窗口(思路 + 模板)

笔者最早接触滑动窗口是滑动窗口协议&#xff0c;滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;属于 TCP 协议的一种应用&#xff0c;用于网络数据传输时的流量控制&#xff0c;以避免拥塞的发生。 发送方和接收方分别有一个窗口大小 w1 和 w2。窗…

机器学习小结之KNN算法

文章目录 前言一、概念1.1 机器学习基本概念1.2 k 值1.3 距离度量1.4 加权方式 二、实现2.1 手写实现2.2 调库 Scikit-learn2.3 测试自己的数据 三、总结3.1 分析3.2 KNN 优缺点 参考 前言 ​ KNN (K-Nearest Neighbor)算法是一种最简单&#xff0c;也是一个很实用的机器学习的…