《机器人控制系统和MATLAB simulink仿真》笔记1:认识S函数
Posted 小林up
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《机器人控制系统和MATLAB simulink仿真》笔记1:认识S函数相关的知识,希望对你有一定的参考价值。
前言
最近在看控制的东西,想动手实践一下,看到有书名曰《机器人控制系统和MATLAB simulink仿真》,于是学习一下做做产出
1.认识对象:机器人动力学系统的特性
考虑一个关节机器人,其动态性能可由二阶非线性微分方程描述:
M ( q ) q ¨ + C ( q , q ˙ ) q ˙ + G ( q ) + F ( q ˙ ) + τ d = τ \\boldsymbolM(\\boldsymbolq) \\ddot\\boldsymbolq+\\boldsymbolC(\\boldsymbolq, \\dot\\boldsymbolq) \\dot\\boldsymbolq+\\boldsymbolG(\\boldsymbolq)+\\boldsymbolF(\\dot\\boldsymbolq)+\\boldsymbol\\tau_\\mathrmd=\\boldsymbol\\tau M(q)q¨+C(q,q˙)q˙+G(q)+F(q˙)+τd=τ
其中, q ∈ R n \\boldsymbolq\\in \\mathbbR ^n q∈Rn为关节角位移量, M ( q ) ∈ R n × n \\boldsymbolM(\\boldsymbolq)\\in\\mathbbR ^n\\times n M(q)∈Rn×n为机器人的惯性矩阵, C ( q , q ˙ ) q ˙ ∈ R n \\boldsymbolC(\\boldsymbolq, \\dot\\boldsymbolq)\\dot\\boldsymbolq\\in \\mathbbR^n C(q,q˙)q˙∈Rn表示离心力和哥氏力, G ( q ) ∈ R n \\boldsymbolG(\\boldsymbolq)\\in \\mathbbR^n G(q)∈Rn为重力项, F ( q ˙ ) ∈ R n \\boldsymbolF(\\dot\\boldsymbolq)\\in\\mathbbR^n F(q˙)∈Rn表示摩擦力矩, τ ∈ R n \\boldsymbol\\tau\\in\\mathbbR^n τ∈Rn为控制力矩, τ d ∈ R n \\boldsymbol\\tau_\\mathrmd\\in \\mathbbR^n τd∈Rn为外加扰动。
机器人系统的动力学特性为:
(书中没有对这些特性严格地证明,后面还得再琢磨一下)
2.S函数
2.1 S函数简介
S函数是Simulink的重要部分,它为Simulink环境下的仿真提供了强有力的拓展能力。它用文本方式输入公式和方程,适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真参数进行更精确的描述。机器人控制系统的Simulink仿真中,可以使用S函数来实现控制律、自适应律和被控对象的描述。
2.2 S函数使用步骤
一般而言,S函数的使用步骤如下:
(1)创建S函数源文件。创建S函数源文件有多种方法,Simulink提供了很多S函数模板和例子,用户可以根据自己的需要修改相应的模板或例子即可。
(2)在动态系统的Simulink模型框图中添加S-function模块,并进行正确的设置。
(3)在Simulink模型框图中按照定义好的功能连接输入输出端口。为了方便S函数的使用和编写,Simulink的Functions&.Tables模块库还提供了S-functiondemos模块组,该模块组为用户提供了编写S函数的各种例子,以及S函数模板模块。
2.3 S函数的基本功能及重要参数
S函数的基本功能及重要参数设定如下:
(1)S函数功能模块:各种功能模块完成不同的任务,这些功能模块(函数)称为仿真例程或回调函数(call-back functions),包括初始化(initialization)、导数(mdlDerivative)、输出(mdlOutput)等。
(2)NumContStates表示S函数描述的模块中连续状态的个数。
(3)NumDiscStates表示离散状态的个数。
(4)NumOutputs和NumInputs分别表示模块输出和输入的个数。
(5)直接馈通(dirFeedthrough)为输入信号是否在输出端出现的标识,取值为0或1.例如,形如
y
=
k
×
u
y=k×u
y=k×u的系统需要输入(即直接反馈),其中,
u
u
u是输入,
k
k
k是增益,
y
y
y是输出,形如等式
y
=
x
,
x
=
u
˙
y=x,x=\\dotu
y=x,x=u˙的系统不需要输入(即不存在直接反馈),其中,
x
x
x是状态,
u
u
u是输入,
y
y
y为输出。
(6)NumSampleTimes为模块采样周期的个数,S函数支持多采样周期的系统。
除了sys外,还应设置系统的初始状态变量 x o x_o xo、说明变量 s t r str str和采样周期变量 t s t_s ts。t变量为双列矩阵,其中每一行对应一个采样周期。对连续系统和单个采样周期的系统来说,该变量为 [ t 1 , t 2 ] [t_1,t_2] [t1,t2], t 1 t_1 t1为采样周期, t 1 = − 1 t_1=-1 t1=−1表示继承输入信号的采样周期, t 2 t_2 t2为偏移量,一般取为 0 0 0。对继承输入信号的采样周期的连续系统来说, t t t取为 [ 一 1 , 0 ] [一1,0] [一1,0]。
有关采样周期变量的含义更详细的摘录官方文档的内容:
采样周期的取值
如何选择采样时间:
关于以上dirFeedthroug和NumSampleTimes的内容可以参考官方文档理解得更详细:
2.4 S函数的使用实例
以下面的公式为例
J θ ¨ = u + d ( t ) J \\ddot\\theta=u+d(t) Jθ¨=u+d(t)
u u u为控制输入, d ( t ) d(t) d(t)为加在控制输人端的扰动,模型输出为角度 θ \\theta θ和角速度 θ ˙ \\dot\\theta θ˙, J J J是转动惯量,模型描述为:
x ˙ 1 = x 2 x ˙ 2 = 1 J ( u + d ( t ) ) \\beginarrayl \\dotx_1=x_2 \\\\ \\dotx_2=\\frac1J(u+d(t)) \\endarray x˙1=x2x˙2=J1(u+d(t))
其中 x 1 = θ , x 2 = θ ˙ x_1=\\theta, x_2=\\dot\\theta x1=θ,x2=θ˙是状态变量。
2.4.1 模型初始化Initialization函数
上述动力学方程是1输入2输出系统,角度 θ \\theta θ和角速度 θ ˙ \\dot\\theta θ˙的初始值为0,模型初始化参数为[0,0],模型初始化S函数为:
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;%连续状态个数为2:x_1和x_2,因为采用连续采样周期仿真
sizes.NumDiscStates = 0;%离散状态个数为0
sizes.NumOutputs = 2;%输出量为2个:角度和角速度
sizes.NumInputs = 1;%输入量为1个,u
sizes.DirFeedthrough = 0;%方程中输入没有直馈于输出
sizes.NumSampleTimes = 1;%采样周期数是1
sys simsizes(sizes);
x0=[0,0]:%初始化输出值角度和角速度都是0
str=[]:%无其他说明
ts=[0 0]:%连续采样,第一个值为0,没有偏移,第二个值也设为0
2.4.2 微分方程描述的mdlDerivative函数
该函数可用于描述微分方程并实现数值求解。在控制系统中,可采用该函数来描述,被控对象和自适应律等,并通过Simulink环境下选择数值分析方法(如ODE方法)实现模型的数值求解。取 J = 2 J=2 J=2, d ( t ) = sin t d(t)=\\sin t d(t)=sint,则采用S函数可实现该模型角度 θ \\theta θ和角速度 θ ˙ \\dot\\theta θ˙的求解,描述如下:
function sys=mdlDerivatives(t,x,u)%sys
J=2;
dt=sin(t);
ut=u(1);
sys(1)=x(2):%左边的sys是状态变量的导数
sys(2)=1/J (ut+dt);
2.4.3 用于输出的mdlOutput函数
S函数的mdlOutput函数通常用于描述控制器或模型的输出。采用S函数的mdlOutput模块来描述模型角度 θ \\theta θ和角速度 θ ˙ \\dot\\theta θ˙的输出:
function sys mdlOutputs(t,x,u)
sys(1)=x(1):
sys(2)=x(2):
Matlab Simulink系统仿真(01)
Matlab简介
Matlab基本界面介绍
Matlab的主要特点
1.具有丰富的数学功能
2.具有很好的图视系统
3.可以直接处理声音和图形文件
4.具有若干功能强大的应用工具箱
5.使用方便,具有很好的扩展功能
6.具有很好的帮助功能
M文件
脚本M文件
函数M文件
Matlab中的预定义变量
变量 | 含义 |
---|---|
Ans | 分配最新计算表达式的值 |
Eps | 返回机器精度 |
Realmax | 返回机器技能处理的最大浮点数 |
Realmin | 返回机器技能处理的最小的非零浮点数 |
Pi | π,3.14159265 |
Inf | 定义为1/0 |
NaN | Not a Number |
who | 列出已定义的变量 |
who global | 与who相同,仅列出全局变量 |
who a* | 给出所有以a开头的变量的一个列表 |
whos | 给出比who更加详细的列表 |
whos global | 与whos相同,仅列出全局变量 |
clear | 删除所有变量 |
clear global | 删除全局变量 |
clear all | 删除所有变量 |
clear var1 | 删除变量var1 |
clc | 清除屏幕 |
exit,quit | 退出 |
ctrl+c | 中断 |
Matlab数据类型
Matlab元胞数组(cell数组):
cell数组可以把不同类型的数据纳入到一个数组变量中
Matlab结构数组:
s = struct('filed1',value1,'filed2',value2,...)
将每个字段的数组的一行一列重新赋值
Matlab的基本计算
矩阵计算
+加法 -减法 *乘法 ^幂次 \\左除 /右除 ‘转置 inv求逆 eig特征值 poly特征多项式
数组计算
.+加法 .-减法 .*乘法 .^幂次 .\\左除 ./右除 .‘共轭
Matlab的符号计算
例如:
y = sym(‘2*sin(x)*cos(x)’)
w = sym('[1/(a+x),sin(x),(b-a)/(a+x);1,exp(x),x^2]')
symadd(A,B) //两个符号矩阵的和
symsub(A,B) //两个符号矩阵的差
symmul(A,B) //两个符号矩阵的积
symdiv(A,B) //两个符号矩阵的除
inverse(A) //符号矩阵求逆
符号微积分
微分:diff(f)
积分:int(f)
符号代数方程式求解
线性方程组;
X=linsolve(A,B) //特解
[X,Z]=linsolve(A,B) //通解
一般代数方程的解
solve(S)
符号微分求解
[y1,y2]=dsolve(a1,a2)
二维曲线图形
plot(y)
plot(x,y)
subplot(M,N,P)
例如:
画出衰减震荡曲线y=e^(-t/3) sin3t
t=0:pi/50:4*pi;
y=exp(-t/3).*sin(3*t);
plot(t,y)
grid
clear;
x=-8:0.5:8;
y=x';
X=ones(size(y))*x;
Y=y*ones(size(x));
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
surf(X,Y,Z);
colormap(cool)
xlabel('X'),ylabel('Y'),zlabel('Z')
以上是关于《机器人控制系统和MATLAB simulink仿真》笔记1:认识S函数的主要内容,如果未能解决你的问题,请参考以下文章
相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)