linio matlab,MATLAB - 用MATLAB仿真机械控制系统

姓名:崔哲琪

学号:16040120090

转载自https://zhuanlan.zhihu.com/p/25006094?

【嵌牛导读】

仿真不是件容易的事,一方面可能要进行繁琐的公式推导和计算(而且特别容易出错,错了还不容易找出问题)。另一方面又需要写大量的程序(特别是要有视觉效果的时候)。今天我来介绍一种工作流程来绕开这两个麻烦,它特别适用于机械系统的控制和仿真。

【嵌牛鼻子】MATLAB,仿真,机械系统,控制

【嵌牛提问】

用MATLAB怎么仿真机械控制系统呢?

【嵌牛正文】

仿真对于控制方向的研究和开发有多重要就不用强调了。不管是写paper还是开会做presentation,有个看起来很cool的仿真都是有帮助的。如果能快速的搭建仿真,还能帮着在研究的前期快速验证idea是否可行。

然而进行仿真总不是简单的事情。一方面可能要进行繁琐的公式推导和计算(而且特别容易出错,错了还不容易找出问题)。另一方面又需要写大量的程序(特别是要有视觉效果的时候)。今天我来介绍一种工作流程来绕开这两个麻烦,它特别适用于机械系统的控制和仿真。这里需要用到的是Simscape multibody (以前叫Simmechanics) 和 Simulink Control Design工具箱。

为了简单起见,起到抛砖引玉的作用,我们就制作一个最简单的机械系统 -- 倒立摆 -- 的仿真。特别注明我用的是MATLAB R2015b. 其它版本的MATLAB可能略有差异。

首先,打开一个新的Simulink模型,里面带有一些常用的Simmechanics模块。输入如下命令

>> smnew

cd4a44d016dd

图片发自简书App

cd4a44d016dd

图片发自简书App

你会看到两个弹出来的窗口。一个是空的模型,一个是Simmechanics的library.

我们现在来创建倒立摆的杆,为此,双击Solid模块,修改一下它的长宽高. 注意单位我用的是厘米。

cd4a44d016dd

图片发自简书App

在初始的坐标系下,整个环境的重力是作用在z轴的负方向上,现在我们要把它挪到y轴的负方向上。后面会解释原因。为此,双击打开那个画着扳手的Mechanism Configuration模块,把重力加速度改成如下图所示。

cd4a44d016dd

图片发自简书App

现在给系统添加一个Revolute Joint模块,然后按下图接起来。这样杆就可以转了。

cd4a44d016dd

图片发自简书App

Solid的模快的坐标中心在它的几何中心,可是我们希望杆不是围着自己的中心转,而是绕着一端转。因此上图中Revolute关节和Solid之间被加上了一个Rigid Transform模块(注意B和F不要搞反)。它可以用来把原来位于杆中心的坐标原点平移到杆的一端。具体说来,我们可以设置Rigid Transform模块的参数如下

cd4a44d016dd

图片发自简书App

对于Revolute Joint模块,它是围绕Z轴旋转的,这就解释了为什么刚才要把重力移动到y轴。(当然了,也可以保持重力在Z轴不变,而通过额外的坐标变换来旋转Joint的坐标)。现在打开Revolute Joint, 设定角度的初始值位0,让杆正好处于倒立位置

cd4a44d016dd

图片发自简书App

好了,现在运行Simulink模型,在Mechanics Explorers窗口里,我们能看到一根杆直立在那里。不一会儿,它就会倒下来荡来荡去的。

cd4a44d016dd

图片发自简书App

现在我们来对它设计控制器。

首先,再次双击Revolute Joint模块, 创建一个力矩的输入口,和两个角度和角速度的测量口。

cd4a44d016dd

图片发自简书App

现在模块应该变成这样了

cd4a44d016dd

图片发自简书App

我们把PS-Simulink Converter复制一个,把示波器删了,然后按下图接起来。这几个PS-S和S-PS模块的作用是把Simulink的信号和Simscape的物理信号进行转化。这样在Simulink层面我们就可以设计控制器了。其实现在要设计的控制器就是下图中Gain模块的参数K.

cd4a44d016dd

图片发自简书App

Gain模块先这样设置。

cd4a44d016dd

图片发自简书App

为了设计控制器,我们首先需要知道系统的动态是什么。如果没有任何工具的情况下,只能通过手算进行推导和建模。对于这样小的系统也许可以,但是如果问题很复杂,那计算和推导过程就变得非常繁琐了。

当然,如果你明智的购买和安装了Simulink Control Design工具箱,那一切都会非常的简单。这个工具箱的使用流程大致如下

第一步,在模型上标记输入和输出。右键点击Gain左边的信号,然后如下选择。

cd4a44d016dd

图片发自简书App

类似的,把Gain后边的信号标记为Output measurement。设置好以后看起来是这样的

cd4a44d016dd

图片发自简书App

第二步,我们来把模型保存一下,存成BeamAndBall15b.slx. 然后回到MATLAB命令行,输入

>> k = [0 0];

>> mdl = 'BeamAndBall15b';

>> sys = linearize(mdl, getlinio(mdl))

然后一个线性化的状态空间模型就得到了。这里可以看出linearize是一个非常强大的函数,关于它的更多信息请参考文档:Linear approximation of Simulink model or subsystem

另外注意到Linearize取的是一个开环的状态空间模型,因为我们标记的输入是一个openloop input. 这些标记对于仿真没有影响,只对于分析有影响。

接着,我们来设计一个简单的LQR控制器好了。在命令行输入

>> k = -lqr(sys.A, sys.B, diag([1 1]),1);

然后,就可以运行模型了。这根杆现在会一直保持直立。为了验证控制效果,我们可以把初值的位置偏移一下再仿真

cd4a44d016dd

图片发自简书App

你会看到杆子逐渐直立了起来。除了从动画看效果,还能打开Simscape的viewer来查看仿真轨迹。Viewer可以从这里打开

cd4a44d016dd

图片发自简书App

仿真之后会弹出这样一个窗口

cd4a44d016dd

图片发自简书App

好了,以上就是最基本的使用Simulink Control Design 工具箱和Simscape Multibody (以前叫Simmechanics)进行控制器设计和仿真的最基本过程了。

在此可以稍稍总结一下用Simscape Multibody (SM) 和Simulink Control Design (SCD) 进行仿真的几个好处。

从建模方面看,用SM可以很方便的组装出一个复杂的机械系统。而且组装的过程中只要知道部件之间的相对坐标即可,不需要去计算每个状态的绝对坐标是多少。换句话说,可以不用像传统的控制仿真,不需要写出整个系统的微分方程模型。

从控制器设计方面看, 设计控制参数只用了两条MATLAB语句。没有进行什么直接的数值计算。

从整体上看,当模型某个部件需要修改,或者模型整体需要改动的时候,不会影响这个工作流程的其它环节。只需要方便的重新运行一下代码即可。这样做大大加速了仿真的设计和修改的效率。基本消除了人工计算可能出现的各种误差。

现在,你可以使用它来做一些更复杂的东西了,比如我做了一个如下的球棒平衡系统。是不是很好玩。哈哈。

cd4a44d016dd

图片发自简书App

然后也可以看看SM自带的一些例子,比如这个

>> sm_backhoe

就是一个相对复杂些的控制系统。

cd4a44d016dd

图片发自简书App

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值