SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

    笔者最近捣鼓Simulink,发现MATLAB的仿真模块真的十分强大,以前只是在命令窗口敲点代码,直到不小心敲入simulink,就一发不可收拾。话说simulink的模块化建模确实方便,只要拖拽框框然后双击设置属性就可以慢慢堆建自己的模型,这一点我很中意(*^__^*) 。

    最近在学习一些控制理论,发现倒立摆是个不错的学习平台,开始学习肯定需要机构上面的运动学及动力学建模,一直习惯Adams进行运动仿真,但Adams安装比较繁琐。。。便想利用MATLAB代替仿真,顺便学习了解下传说的simulink,直接搜查阅资料。发现Simscape里面的simmechanics就是运动仿真模块。于是赶紧打开俺的MATLAB2015b,敲入simulink再用力敲打回车,就出现如下窗口。。。

一.新建一个模型New Model

 

    新建模型将出现空白界面,所有建模要用的block都必须拖到该界面进行设置和连接,因为模块库里Block特别的多,一个一个找真的特别麻烦,强烈建议记下常用block的名字,比如示波器scope,时钟clock,阶跃信号step等等等等,今后可以直接在模型空白处敲入字符,自动检索,真的是方便感人,如图。

二.SimMechanics/First Generation模型

    需要注意的是,SimMechanics库分为First Generation和Second Generation,即第一代和第二代。

其实MATLAB帮助文档里面很多demo值得学习理解,我简单了解了第一代模块,跟着说明建立了一个平面四连杆机构模型,模块框图和仿真界面如下:

 

 

 难点就是body block的属性设置,必须清楚了解坐标系的建立,新建的CS(coordinate system)相对哪个坐标平移,又相对哪个坐标旋转。其中World坐标系是世界坐标系,也就是绝对坐标系,所有的坐标系都是相对它而言的,所以说这个模块必不可少。

    总之,模型的建立顺序一般如图,除了机械环境Env,其它的block连接都是坐标系与坐标系之间的连接,但body与body之间不能直接连接,必须通过joints确定两者之间的连接副。最后的body与地面连接就形成闭环机构,也可以只出现一个Ground,即悬空机构,像单摆运动,机械臂等只有基座与地面连接。当然也可以body与body之间形成闭环。Joint/Body Actuator 是连接副和机构驱动器,发送信号可以向Joint或者body添加动力或运动;同理有Joint和Body的Sensor,即传感器,可以利用scope示波器观察Joint和body的受力情况和运动规律。

三.SimMechanics/Second Generation模型

 第二代模型比较直观,可以直接建立几何特征,solid代替了一代的body,可以直接从中设置很多属性。参考MATLAB的demo模型,在使用 second generation建立机构模型时,必须添加的模块

1)  solver configuration求解器配置块,是进行求解的必须模块,双击可以配置具体求解方式。

2)  world frame 世界坐标系,其它一切坐标系都要直接或间接与其连接。

3mechanism configuration 机构配置块,双击打开可以修改重力的大小和方向等。

 

  为了建立倒立摆,我打算添加两个构件,一个是小车构件,记为cart,质量设置在重心处,与地面(世界坐标系)为滑块连接(移动副),几何外形简化为为长方体;另一个是倒立杆构件,记为pole,质量在最高处,与小车进行旋转副连接,外形简化为圆柱体。

几何体的建立模块为solid,如下图,参数编辑窗口分为Description和Properties两栏,描述的内容十分有阅读价值,了解其属性才能设置好具体参数,以下是小车机构的属性设置:

 

    小车构件新建了一个Frames,在第二代SIMmechanics里面坐标系用Frames表示,一个零件可以添加多个Frame,并且两个Frame之间可以直接连线进行刚性连接,中间可以不用joint进行连接,如下图,我把倒立杆的外形润色了一下:

现在的模块窗口有以下Block,直接连接的话就是和World Frame作刚性连接,那么整个机构将是静止不动的,所以接下来是Joint block的添加。

接下来是比较重要的连接模块,即连接副的选择,如下是库里面提供的连接副:

 

单级直线倒立摆的机构只需两个连接副,即revolute joint(平面旋转副)和prismatic joint(柱形滑块副),将其拖入窗口进行属性设置和连接。属性设置窗口如下:

如上图所示,两个副的设置窗口比较复杂,必须仔细阅读Description里面的内容,本模型设计了阻尼系数,并且打开了Sensing接口,这样可以通过采集两个副的位置,速度,加速度等运动参数。最后方框图如下:

连接模块直接进行仿真的话会弹出如下窗口,重力的默认方向是world frame的-z方向,所以模拟会发生异常,图示整个机构会自由落体向下。。。。

    所以必须引入参考系模块,如下图。这个才是设置难点,因为每个坐标系的连接和参考都不同,为了找到合适的方向和位移,必须记牢每个坐标系关于世界坐标系的方位,也可能是英语看的人头疼,我在这里设置了好久。第一个rigid transform是让移动副相对world frame的+y方向旋转90度,第二个rigid transform的引入是可以改变摆杆的初始位置。

 

 

连接后的模型框图为

 

仿真界面如下

为了显示运动参数,可以添加示波器,不过示波器显示的是信号量,必须将运动副的sensor接口连接到PS-Simulink Converter转为信号量,如下图:

 

 

 

仿真结果为

 

因为设置的初始角度为竖直向上,所以装置静止,信号稳定输出为水平线,所以接下来添加外力模块如图,同理需要将方波信号转为物理信号,模拟在一秒时给摆杆质心一个推力,推力设置为x方向。

最后模型框图为:

 

仿真结果如下:

 

 

    由图中可以得知,在1s时摆杆顶部球心处受到100N沿世界坐标系+x持续0.5S的推力,产生的各种运动参数曲线可以直接在示波器中看到,因为没有控制力的引入,摆杆会直接倒下。此时为了实现倒立摆的平衡,会在小车x方向添加一个控制力来保持平衡,接下来便是控制器的设计,倒立摆的控制算法有很多,从经典控制理论(传递函数),现代控制理论(状态空间),一直到智能控制理论。每一个理论都可以用来控制倒立摆,可见倒立摆的控制实验是学习控制理论的最有效平台。。。

    为了初步设计控制器输出控制力的信号,我了解了自控理论最经典的PID控制算法,得知其控制理念是直接采集被控变量进行对比然后处理输出(如下图),只是参数的整定比较繁琐,不过却可以进行初步的实验仿真,激发自己的学习兴趣。PID控制器参考https://www.cnblogs.com/shangdawei/p/4825259.html。文中说的很详细。里面有程序流程图教你写最简单的控制程序,笔者手头刚好有12xs128的MCU、普通有刷直流电机和光电编码器。根据流程,设计了电机的稳定转速控制器,不过难度依旧是参数的整定。好在MATLAB里关于PID的工具十分强大,里面的可视化工具包pidTuner,命令工具TuningGoal,systune等对于控制器的设计十分有帮助,最近一直在理解这几个函数指令,自己也从中受益颇深,尤其考验对自控原理的理解掌握。。。理解后PID算法后,就可以在simulink下开始控制倒立摆的平衡了,由于笔者整定参数还不太利索,经历多次尝试后,摆杆还是会倒下。。。。惭愧啊。

以下是运动规律:

 

 

不过之后我发现MATLAB里面自带了一个demo模型,在MATLAB命令窗口键入 InvertedPendulumExample即可打开如下界面。可见,此模型的控制方法是PID Controller和传递函数控制器综合输出为控制力F(其实角度控制也能用PID调节,只要响应够快就能实现摆杆的平衡)。不过想要更好的控制倒立摆还是需要动力分析,将传递函数写出,进行根轨迹找出极点,确定好平衡位置。

    

    总之,Simulink对倒立摆的控制学习也提供了可视化的模拟。之后我打算以此模型为基础,添加不同控制器,学习基本控制理念。今后的大致框图将扩展成如下几个区域(当然可以整成一个subsystem):

(1)直线倒立摆模型

(2)干扰信号发生器

(3)参数采集显示器

(4)不同控制调节器

 

转载于:https://www.cnblogs.com/PHH5201314/p/8325657.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 行代码提取复杂 Excel 数据

把 Excel 文件导入关系数据库是数据分析业务中经常要做的事情,但许多 Excel 文件的格式并不规整,需要事先将其中的数据结构化后再用 SQL 语句写入数据库。而一般情况下,结构化的工作量会比较大,而且很难通用,每次都要针…

将一个数组拆分为若干个相等数组

var a [法国,澳大利亚,智利,新西兰,西班牙,加拿大,阿根廷,美国,0,国产,波多黎各,英国,比利时,德国,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的网络结构可视化

本文主要介绍人工智能模型的网络结构可视化的常见方法。对于使用神经网络模型来说&#xff0c;我们主要关注的是模型的输入和输出。在 ML.NET 中使用 ONNX 模型时&#xff0c;我们就需要了解这些信息&#xff0c;以便在构成神经网络的所有层之间生成连接映射。下图就是昨天 《Y…

Git 撤销操作 / 回滚历史

撤销操作 git checkout -- <filename>&#xff0c;放弃文件的当前更改&#xff0c;回到最近一次的提交状态git reset HEAD <filename>&#xff0c;取消暂存文件git commit --amend&#xff0c;覆盖上一次的提交&#xff0c;虽然不是撤销操作&#xff0c;但有类似的…

整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的开发中&#xff0c;服务器的各种错误[如&#xff1a;401&#xff08;登录授权验证&#xff09;&#xff0c;403&#xff08;禁止…

url字符转义

作者在做短链接功能时&#xff0c;url参数里带了&字符&#xff0c;结果无法转换。后来查了一下&#xff0c;发现可以用其它符号代替。下面是对应表 URL 中号表示空格 %2B 空格 URL中的空格可以用号或者编码 %20 / 分隔目…

编辑器领域正发生变革?从面试看 Visual Studio Code 的崛起

Visual Studio Code&#xff08;VS Code&#xff09;的使用率在迅速上升&#xff0c;现在已经成为大多数工程师的首选编辑器&#xff0c;并似乎正迅速抢占其他顶级编辑的市场份额。Triplebyte 每周都会面试数百名工程师。在每次面试中&#xff0c;我们都会记录面试者使用的编辑…

C#7.0 ref引用传递

1.概要在工作中大家用到引用类型是非常多的&#xff0c;大家都知道引用类型在使用过程中传递的是对象引用并不会发生整个对象复制。而值类型在传递的过程中就不一样了&#xff0c;我曾经在编写代码时希望通过值类型来压低应用程序的内存占用&#xff0c;在高并发的情况大量的对…

Vue+Axios同步请求

axios本身是没有同步请求的&#xff0c;要实现同步请求&#xff0c;用到的是ES7的async和await ES7的异步特性async / await async用于声明一个函数是异步的&#xff0c;await用于声明在一个异步函数中等待语句执行完毕。也就是说await只能在async函数中使用。简单示例如下&a…

关于vue执行打包后,如何在本地浏览问题

最近一个人在捣鼓vue&#xff0c;写完项目后发现在npm run dev下可以正常访问&#xff0c;bulid之后却一片空白&#xff0c;查看console出现许多Failed to load resource: net::ERR_FILE_NOT_FOUND。恩&#xff0c;看了下网上评论找到了正确的方法 webpack.prod.conf.js 中outp…

ELFhash

字符串哈希算法&#xff08;以ELFHash详解&#xff09; 更多字符串哈希算法请参考&#xff1a;http://blog.csdn.net/AlburtHoffman/article/details/19641123 先来了解一下何为哈希&#xff1a; 哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地…

android面试详解

前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖&#xff0c;该activity就是可见进程 服务&#xff1a;service进程 后台一个activity按了home按键就是从前台退回到后台 标准模式&#xff1a;不管任务栈是否存在相同的activity都会创建一个新的activ…

element-ui Notification重叠问题,原因及解决办法

在1个方法中调用两次this.$notify方法&#xff0c;会出现通知框重叠的问题 methods: {checkLogin: function () {if (this.username ) {this.$notify({title: 提示,message: 请输入用户名})}if (this.password ) {this.$notify({title: 提示,message: 请输入用户密码})}}}网上…

Visual Stiudio使用技巧

技巧1 自动生成带参构造函数当我们在编写代码时会经常遇到初始化一个的类&#xff0c;需要通过构造函数进行对象初始化。那么这个时候我们可能会需要逐个去手动写&#xff0c;这样的工作即重复又无趣。如果是在项目非常紧急的情况下还有大量的字段需要与入参一一对应起来简直太…

js将时间戳格式化为HH:ii:ss的格式

将时间戳格式化为 HH:ii:ss的格式 <html> <head> </head> <body><span id"time"></span><script>var timestamp Date.parse(new Date())/1000;var time_old Date.parse(new Date())/1000;timeAdd()/*** purpose : …

Struts 整合 SpringMVC

Struts 整合 SpringMVC 过程&#xff1a;这篇文章是我在整合过程中所做的记录和笔记 web.xml &#xff1a;筛选器机制过滤 原机制是拦截了所有 url &#xff0c;即 <url-pattern>/*</url-pattern>新机制为了将 structs2 的 url 与 SpringMVC 的 url 区分开来&#…

Vue保持用户登录及权限控制

vue-router-power-demo 核心内容有两点&#xff1a; 一是保持用户登录状态&#xff0c;二是根据登录用户的角色动态挂在路由 使用vuex保持用户登录 点击登录按钮&#xff0c;使用vuex的actions分发登录操作&#xff0c;发送用户名和密码到后台获取登录token&#xff0c; 并存…

java B2B2C Springcloud多租户电子商城系统-Spring Cloud Sleuth

在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前段请求都会形成一条复杂的分布式服务调用链路&#xff0c;链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。 愿意了解…

C#性能测试BenchmarkDotnet

1.简介在我们开发高性能代码时&#xff0c;需要各种针对性能优化进行编码。那么如何才能知道我们所加的代码是否有性能方面的正向优化呢&#xff1f;有了BenchmarkDotNet&#xff0c;做性能对比测试就非常容易了&#xff0c;只需要把你的测试方法加上特性[Benchmark], 想做不同…

Requests获取连接的IP地址

在接口自动化的时候&#xff0c;需要获取到连接的本地IP地址&#xff0c;方法如下 1 import requests 2 3 rsp requests.get("http://www.baidu.com", streamTrue) 4 print rsp.raw._connection.sock.getpeername()[0] 5 print rsp.raw._connection.sock.getsockna…