用s函数实现Lugre摩擦模型

目录

1. Lugre摩擦模型

2. Lugre摩擦模型的状态空间方程

3. Lugre摩擦模型的simulink建模

4. Lugre摩擦模型的s函数建模

5. simulink模型和s函数模型对比

6. Lugre摩擦模型的s函数源代码


1. Lugre摩擦模型

        摩擦模型主要分为动态和静态摩擦模型。Lugre摩擦模型能够很好的反应出摩擦的静态和动态效应。Lugre摩擦模型:

\dot{z} = \dot{\theta } - \sigma _{0}\frac{| \dot{\theta }|}{g( \dot{\theta })}z                        ①

F = \sigma _{0}z+\sigma _{1}\dot{z}+\sigma _{2}\dot{\theta }                ②

        其中{g( \dot{\theta })}为非线性函数:

{g( \dot{\theta })} = F_c+(F_s-F_c)e^{-(\frac{\dot{\theta }}{w_s})^2}   ③

表1 参数意义及取值
参数意义本文取值
\dot{\theta }接触面相对角速度——
z鬃毛的平均形变——
F_c库伦摩擦力2.4440
F_s最大静摩擦力0.5991
w_sStribeck速度0.0103
\sigma_0鬃毛刚性系数0.4766
滑动阻尼系数0.2701
\sigma_2黏性摩擦因数0.0049

         这些参数根据不同的系统取不同的值,且会在外界温度、润滑条件、材料磨损及接触面作用力等因素的影响下发生改变(取值方法:查论文,一般通过参数辨识来计算取值;以上取值仅为示例

2. Lugre摩擦模型的状态空间方程

\dot{z} = \dot{\theta } - \sigma _{0}\frac{| \dot{\theta }|}{g( \dot{\theta })}z          ④

z = z + \dot{z}T                   ⑤

        其中,T为离散采样时间,T=\Delta t

        \because \dot{z} = \frac{dz}{dt}\approx \frac{\Delta z}{\Delta t}

\because z\approx z+\Delta z

\therefore z = z+\dot{z}\Delta t = z+\dot{z}T

        取状态变量:

x = \begin{bmatrix} z\\ \dot{z} \end{bmatrix}                          ⑥

        则根据表达式④、⑤有状态方程:

\begin{bmatrix} z\\ \dot{z} \end{bmatrix} = \begin{bmatrix} 1 & T\\ -\sigma _{0}\frac{| \dot{\theta }|}{g( \dot{\theta })} & 0 \end{bmatrix}\begin{bmatrix} z\\ \dot{z} \end{bmatrix}+\begin{bmatrix} 0\\ 1 \end{bmatrix}\dot{\theta }         ⑦

        根据表达式②有输出方程:

F =\begin{bmatrix} \sigma_0&\sigma_1 \end{bmatrix} \begin{bmatrix} z\\\dot{z} \end{bmatrix}+\sigma_2\dot{\theta }                      ⑧

3. Lugre摩擦模型的simulink建模

        根据表达式 ①②③搭建simulink仿真模型如图1所示:

图1 Lugre的simulink仿真

        参数初始化:(按照表1中参数初始化,仿真前先运行init.m文件,将参数加载到工作空间

图2 参数初始化

        输入信号:                                                

图3 输入信号

        输出波形:

图4 输出波形

4. Lugre摩擦模型的s函数建模

        根据表达式⑦⑧和表1中的参数编写s函数,取离散采样时间为0.001s:

 \begin{bmatrix} z\\ \dot{z} \end{bmatrix} = \begin{bmatrix} 1 & 0.001\\ -\frac{0.4766| \dot{\theta }|}{2.4440+(0.5991-2.4440)e^{-(\frac{\dot{\theta }}{0.0103})^2}} & 0 \end{bmatrix}\begin{bmatrix} z\\ \dot{z} \end{bmatrix}+\begin{bmatrix} 0\\ 1 \end{bmatrix}\dot{\theta }  ⑨

F =\begin{bmatrix} 0.4766&0.2701 \end{bmatrix} \begin{bmatrix} z\\\dot{z} \end{bmatrix}+0.0049\dot{\theta }                                       ⑩

        离散变量、输入、输出设置:

sizes.NumDiscStates  = 2;   %离散变量个数
sizes.NumOutputs     = 1;   %输出个数
sizes.NumInputs      = 1;   %输入个数

        初始条件设置:

x0  = [0;0];

        采样时间设置:

ts  = [0.001 0];

        表达式⑨:

function sys=mdlUpdate(t,x,u)
w = u(1);
gw = 2.4440 + (0.5991 - 2.4440)*exp(-(w/0.0103)^2);
sys = [1 0.001;-0.4766*((abs(w))/gw) 0]*x+[0;1]*w;

        表达式⑩:

function sys=mdlOutputs(t,x,u)
w = u(1);
sys = [0.4766 0.2701]*x+0.0049*w;
图5 s函数的Lugre仿真

 输入波形:

图6 输入信号

 输出波形:

图7 输出波形

5. simulink模型和s函数模型对比

图8 simulink模型和s-function模型对比

         图8中上半部分为simulink模型,下半部分s-function模型

图9 仿真结果对比

         根据图9可知s函数模型和simulink模型输出波形基本一致。s函数离散变量的初始状态会影响0时刻的仿真值,修改s函数离散变量初始值会减小0时刻的误差。

x0  = [0;-10];
图10 修改初始状态后的仿真结果

         误差在0.001级,可以忽略。

6. Lugre摩擦模型的s函数源代码

function [sys,x0,str,ts,simStateCompliance] = Lugre(t,x,u,flag)

switch flag
  case 0   %初始化
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

  case 1   %计算连续状态的微分
    sys=mdlDerivatives(t,x,u);

  case 2   %计算下一个离散状态  
    sys=mdlUpdate(t,x,u);

  case 3   %计算输出
    sys=mdlOutputs(t,x,u);

  case 4   %计算下一次采样的时间
    sys=mdlGetTimeOfNextVarHit(t,x,u);

  case 9   %系统结束
    sys=mdlTerminate(t,x,u);

  otherwise %其他情况
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

%case 0:初始化
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

sizes = simsizes;           %用于设置模块参数的结构体

sizes.NumContStates  = 0;   %连续变量个数
sizes.NumDiscStates  = 2;   %离散变量个数
sizes.NumOutputs     = 1;   %输出个数
sizes.NumInputs      = 1;   %输入个数
sizes.DirFeedthrough = 1;   %输入是否直接影响输出
sizes.NumSampleTimes = 1;   %至少一个采样时间

sys = simsizes(sizes);

%初始化初始条件
x0  = [0;0];

%保留项
str = [];

% 初始化采样时间
ts  = [0.001 0]; %[0 0] 连续采样
             %[0 1] 小步长的连续采样
			 %[PERIOD OFFSET] 离散采用时间 [采样时间 步长]
			 %[-2 0] 变步长的采样时间 FLAG=4时获取下一次采样时间

%指定simStateCompliance块值
simStateCompliance = 'UnknownSimState'; %'UnknownSimState'  默认设置
										%'DefaultSimState'  与内置块的模拟状态相同
										%'HasNoSimState'    没有模拟状态
										%'DisallowSimState' 保存或恢复模型模拟状态时出错


%case 1:计算连续状态的微分
%sys=AX+BU
function sys=mdlDerivatives(t,x,u)
sys = [];

%case 2:计算下一个离散状态  
%sys=AX+BU
function sys=mdlUpdate(t,x,u)
w = u(1);
gw = 2.4440 + (0.5991 - 2.4440)*exp(-(w/0.0103)^2);
sys = [1 0.001;-0.4766*((abs(w))/gw) 0]*x+[0;1]*w;

%case 3:计算输出           
%sys = CX+DU
function sys=mdlOutputs(t,x,u)
w = u(1);
sys = [0.4766 0.2701]*x+0.0049*w;

%case 4:计算下一次采样的时间[-2 0]时使用该函数
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 0.01;    
sys = t + sampleTime;

%case 9:系统结束
function sys=mdlTerminate(t,x,u)
sys = [];

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SudoReboot

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

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

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

打赏作者

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

抵扣说明:

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

余额充值