用MATLAB仿真机械控制系统

作者介绍了MATLAB一种便捷的仿真方法--使用“Simscape multibody 和 Simulink Control Design工具箱”,特别适合机械系统的控制和仿真。
仿真对于控制方向的研究和开发有多重要就不用强调了。不管是写paper还是开会做presentation,有个看起来很cool的仿真都是有帮助的。如果能快速的搭建仿真,还能帮着在研究的前期快速验证idea是否可行。

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

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

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

>> smnew





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

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


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


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


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


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


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


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

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


现在模块应该变成这样了


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


Gain模块先这样设置。


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

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

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


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


第二步,我们来把模型保存一下,存成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);

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


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


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


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

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

1. 从建模方面看,用SM可以很方便的组装出一个复杂的机械系统。而且组装的过程中只要知道部件之间的相对坐标即可,不需要去计算每个状态的绝对坐标是多少。换句话说,可以不用像传统的控制仿真,不需要写出整个系统的微分方程模型。
2. 从控制器设计方面看, 设计控制参数只用了两条MATLAB语句。没有进行什么直接的数值计算。
3. 从整体上看,当模型某个部件需要修改,或者模型整体需要改动的时候,不会影响这个工作流程的其它环节。只需要方便的重新运行一下代码即可。这样做大大加速了仿真的设计和修改的效率。基本消除了人工计算可能出现的各种误差。

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


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

>> sm_backhoe

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


延伸阅读:
Multibody Modeling

【本文所有内容仅代表本人观点,和MathWorks无关】

相关标签:
  • MATLAB
  • Simscape
  • Simulink

参与评论

姜宇

教育经历:纽约大学.电子工程、华南理工大学.控制理论与控制工程、中山大学.数学与应用数学,从事汽车行业,ClearMotion.高级控制工程师,Mathworks.控制系统工具箱软件工程师。

推荐文章

为什么我们在机器人运动控制中一直在强调力控? 机器人控制该怎么入门? 机械设计(课程)——丝杆传动系统结构设计 浅谈阻抗 经典SEA线性动力学模型及其简化与力矩求导