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

被控对象

考虑这么一个被控对象
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)

仿真结果

位置跟踪曲线如下

请添加图片描述

控制量曲线如下

请添加图片描述

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面我将为您介绍如何设计一个滑模控制的Simulink仿真实验。 1. 打开Simulink软件,创建一个新模型。 2. 在Simulink库中找到“Sources”文件夹,选中“Sine Wave”模块,将其拖放到模型中。右键单击该模块,选择“Block Parameters”,将振荡频率设置为1Hz,振幅设置为1。 3. 在Simulink库中找到“Simulink\Continuous”文件夹,选中“Gain”模块,将其拖放到模型中。将增益值设置为1。 4. 在Simulink库中找到“Simulink\Discrete”文件夹,选中“Zero-Order Hold”模块,将其拖放到模型中。将采样时间设置为0.1秒。 5. 在Simulink库中找到“Simulink\Continuous”文件夹,选中“Integrator”模块,将其拖放到模型中。 6. 在Simulink库中找到“Simulink\Discrete”文件夹,选中“Discrete Transfer Fcn”模块,将其拖放到模型中。在“Block Parameters”中设置传递函数为“1/(s+1)”。 7. 在Simulink库中找到“Simulink\Nonlinear”文件夹,选中“Saturation”模块,将其拖放到模型中。将上限和下限设置为-3和3。 8. 在Simulink库中找到“Simulink\Continuous”文件夹,选中“Sum”模块,将其拖放到模型中。将输入1连接到“Zero-Order Hold”模块的输出,将输入2连接到“Discrete Transfer Fcn”模块的输出,将输出连接到“Saturation”模块的输入。 9. 在Simulink库中找到“Simulink\Nonlinear”文件夹,选中“Sign”模块,将其拖放到模型中。将输入连接到“Integrator”模块的输出。 10. 在Simulink库中找到“Simulink\Continuous”文件夹,选中“Product”模块,将其拖放到模型中。将输入1连接到“Gain”模块的输出,将输入2连接到“Sign”模块的输出,将输出连接到“Sum”模块的输入1。 11. 在Simulink库中找到“Simulink\Continuous”文件夹,选中“Scope”模块,将其拖放到模型中。将输入连接到“Saturation”模块的输出。 12. 在模型中加入“From Workspace”模块,该模块用于导入期望输出的数据文件,可在MATLAB中生成。同时,将数据文件中的采样时间设置为0.1秒。 13. 将各个模块按照上述顺序连接起来,完成模型设计。 14. 将“Sum”模块的输入2的值改为期望输出。 15. 运行仿真,观察系统输出是否与期望输出一致。 以上就是滑模控制的Simulink仿真实验的设计步骤。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值