58 张图,手把手教会你 Simscape Multibody 物理建模与刚体变换!-程序员宅基地

640?wx_fmt=gif

 

640?wx_fmt=jpeg

作者 | 安布奇

责编 | 胡巍巍

本文干货满满,主要以一个单摆为例,讲述如何进行物理建模。58张实操图,手把手带你学会Simscape Multibody物理建模与刚体变换!

 

 

640?wx_fmt=png

创建模型

 

在MatLab命令行输入smnew,打开一个新的simscape multibody项目。

640?wx_fmt=png

在命令行输入sm_lib,打开Simscape Multibody block library选择自己想要添加的块。

640?wx_fmt=png

 

 

640?wx_fmt=png

创建机械连接

 

块类型说明:

Rigid Transform(刚体变换)块:提供端坐标系。

Solid(立体)块:提供几何(geometry),惯性(inertia),颜色(color)特性。

Rigid Transform块在Frame and Transform 下,Solid块在Body Element下。

连接块图:

640?wx_fmt=png

设置Solid block 特性:

左键快速单击solid block两次,在弹出的对话框中将参数设置为如下图所示:

640?wx_fmt=png

将长宽高用变量LHW代替,密度用rho代替,颜色用rgb代替,方便修改参数。这里出现错误是因为我们输入的变量未定义,将在下面定义。

640?wx_fmt=png

设置Rigid Transform块:

左键快速单击Rigid Transform block,在弹出的对话框中将参数设置为如下图所示:

将Rigid Transform 设置为如下图所示:

640?wx_fmt=png

将Rigid Transform1 设置为如下图所示:

640?wx_fmt=png

生成子系统:

同时选中Rigid Transform,Rigid Transform1和solid block,在高亮的地方右键选择Create Subsystem from Selection:

640?wx_fmt=png

 得到如下所示子系统:

640?wx_fmt=png

定义前面的参数:

右键单击Subsystem,在弹出的对话框中选择 Mask > Create Mask。

640?wx_fmt=png

在弹出的对话框中选择 Parameters & Dialog,在左边的栏中添加五个        640?wx_fmt=png       到 Parameters,然后将变量名改为前面输入的变量名。

640?wx_fmt=png

在右边栏Properties > value中将各变量值设置为如下所示:

640?wx_fmt=png

确定,然后在simulink界面中选择Simulation > Update Diagram,更新块图,得到如下图的立体:

640?wx_fmt=png

添加旋转部件:

在matlab命令行输入smnew,新建一个模型,删除不需要的块并将上述的Subsystem复制过来。

640?wx_fmt=png

从Simscape > Multibody > Joints 中添加一个 Revolute Joint(旋转节点)到图中,并连接成如下图所示:

640?wx_fmt=png

鼠标左键快速单击图中的solid block两次,在弹出的对话框中将其参数设置为如图所示:

640?wx_fmt=png

点击确定。

设置重力:

旋转节点(Revolute Joint block)使用底座和从动件坐标系的公共Z轴作为旋转轴,为了让从动件在重力的作用下旋转,需要使重力矢量偏移Z轴。鼠标左键快速单击Mechanism Configuration block两次,在弹出的窗口中将重力设置为[0 -9.81 0](-y方向)。

640?wx_fmt=png

 

设置单摆起始位置:

鼠标在左键快速单击Revolute Joint两次,在弹出的对话框中选择State Targets > Position进行设置,默认为水平。 

640?wx_fmt=png

配置求解器:

在simulink中选择Simulation > Model Configuration Parameters,配置为如下图所示:

640?wx_fmt=png

选择确定。

组装模型:

选择Simulation > Update diagram,得到如图所示的模型。

640?wx_fmt=png

选择View convention将其设置为Y up (XY Front),保证重力与屏幕垂直对齐,选择view > standard view 中的一项来刷新视图。选择        640?wx_fmt=png      来保存设置。

运行模型:

点击Simulation > Run,运行模型,将会看到单摆摆动。

分析模型:

测量单摆运动:左键快速单击Revolute Joint block两次,在弹出的对话框中选择Sensing 下的Position 和Velocity。

640?wx_fmt=png

添加以下块到模型:

PS-Simulink Converter:在Simscape > Utilities

To Workspace:在Simulink > Sinks

如图:

640?wx_fmt=png

将文件另存为一个新文件 simplependulumanalysis。

摆角、角速度关于时间的函数:

打开刚刚的文件 simplependulumanalysis ,然后选择Simulation > Run,在matlab命令行中输入以下命令:

 
figure; % Open a new figure	
hold on;plot(q); % Plot the pendulum angleplot(W); % Plot the pendulum angular velocity
hold on;

plot(q); % Plot the pendulum angle

plot(W); % Plot the pendulum angular velocity

得出摆角(蓝色)与角速度(红色)关于时间的函数图像:

640?wx_fmt=png

无阻尼条件下摆角与角速度关系

在matlab命令行中输入以下命令:

 
figure;	
plot(q.data, W.data);
plot(q.dataW.data);

得到函数图像:纵轴为角速度,横轴为摆角。

640?wx_fmt=png

在 Revolute Joint block State 对话框的Targets> Position中设置不同的起始角:-80, -40, 0, 40和80 °,重复上述的命令得到不同起始角下摆角与角速度的关系:

640?wx_fmt=png

有阻尼下摆角与角速度关系:

左键快速单击Revolute Joint block,在弹出的对话框中将 Internal Mechanics > Damping coefficient 设为8e-5(N*m)/(deg/s),确保State Targets > specify Position Target > Value为0(初始角为0)。

在matlab命令行输入以下命令:

 
figure;	
hold on;plot(q);plot(w);
hold on;

plot(q);

plot(w);

得到如下图所示摆角(蓝色)、角速度(红色)与时间的函数关系:

640?wx_fmt=png

在matlab命令行中输入以下命令:

 
figure;	
plot(q.data, W.data);
plot(q.dataW.data);

得到摆角与角速度的关系。

640?wx_fmt=png

改变初始角为-240,-180, -120, -60, 0, and 60 °,重复上述命令可以得到如图:

640?wx_fmt=png

有阻尼和激励下的单摆:

左键快速单击Revolute Joint两次,在弹出来的对话框中设置Actuation > Torque为 `Provided by Input。

添加以下两个模块:

640?wx_fmt=png

连接成如下图所示:

640?wx_fmt=png

左键快速单击Sine Wave block 两次,在弹出的对话框中将Amplitude设置为0.06,在Revolute Joint block 对话框中将确认 State Targets > Position > Value为0。

运行仿真,在matlab命令行中输入以下命令画出摆角、角速度与时间的关系:

 
figure;hold on;plot(q);plot(w);

hold on;

plot(q);

plot(w);

如下图所示:

640?wx_fmt=png

在matlab命令行中输入以下命令画出摆角与角速度的函数关系:

 
plot(q.data, W.Data);q.dataW.Data);

如下图所示:

640?wx_fmt=png

 

640?wx_fmt=png

 

Simscape刚体变换

 

 

创建坐标系:

以一个L梁作为示例,在matlab命令行输入smdoc_lbeam_inertia。

将会弹出一个L梁的坐标关系图:

640?wx_fmt=png

左键快速点击图中的立方体两次,弹出立体对话框:

640?wx_fmt=png

点击Frames左边的“+”号,选择new frame右边的加号。

640?wx_fmt=png

会弹出一个坐标对话框。

640?wx_fmt=png

从上到下依次为:

  • 坐标名称

  • 坐标原点

  • 主轴

  • 副轴

按自己想要的设置即可。

这几个Python技能实战,能让你少些1000行代码!

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

 

640?wx_fmt=png

添加立体到模型中

 

打开simulink:

640?wx_fmt=png

选择Simscape下的Multibody:

640?wx_fmt=png

将默认存在的块体删除,选择Library Browser >> Simscape >> Multibody >> Body Elements:

640?wx_fmt=png

640?wx_fmt=png

将其中的solid拖到窗口中即可。

640?wx_fmt=png

 

640?wx_fmt=png

建立坐标系及刚体变换

 

刚体转动变换:将两个立方体连接起来,使立方体的世界坐标系在空间上是重合的。

640?wx_fmt=png

可视化立体坐标系:将Simscape >> Utilities >> Solver Configuration 拖到模型中,并与一个立方体连接:

640?wx_fmt=png

选择Simulation > Update Diagram更新流程图,将会打开Mechanics Explorer窗口

640?wx_fmt=png

应用刚体变换:在Multibody>Frames and Transforms拖一个rigid Transform,将它连接到两个立体的中间,左键快速单击两次,在弹出对话框中选择:

Rotation > Method to Standard Axis.

Rotation > Axis to -Z.

Rotation > Angle to 45.

640?wx_fmt=png

选择OK然后Simulation > Update Diagram更新流程图,如下图,完成了一个刚体转动变换。

640?wx_fmt=png

点击Rigid Transform 可以看到,两个立体的坐标系原点和Z轴是重合的,X轴和Y轴彼此错开了45°。

平动变换:将Translation > Method 设置为 Cartesian,Translation > Offset to [1 1 0]。

640?wx_fmt=png

offset数组表示相对于基础坐标系(Base Frame,就是与变换块“B“接口相连的立体坐标系)在x,y,z方向上的偏移量,后面的是单位。

640?wx_fmt=png

选择OK然后Simulation > Update Diagram更新流程图,如下图,完成了一个刚体平移变换。

640?wx_fmt=png

作者简介:单雨,90后工科男,伪文艺青年。目前就读于北京理工大学宇航系,喜欢研究AI,网络爬虫,微信小程序以及机器人,痴迷于Coding,睡前必撸码。

【End】

640?wx_fmt=jpeg

 热 文 推 荐 

为什么超 80% 的开源开发者苦苦挣扎在贫困线?

☞麒麟 810 实体芯片亮相;1325 个安卓应用私自搜集数据;Linux Kernel 5.2 发布 | 极客头条

人工智能 60 年技术简史

☞2019年技术盘点容器篇(三):阿里专家谈容器:既叫好又叫座? | 程序员硬核评测

☞微软洪小文:AI将成为人类未来最好的左脑

6月Top 20榜单出炉啦! 万万没想到区块链大佬竟在忙这个...

☞干货 | Python后台开发的高并发场景优化解决方案

☞泪目!Linux之父:我就是觉得苹果太没意思!

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csdnnews/article/details/95267432

智能推荐

【动态规划DP,一维动归】poj1857,To Europe! To Europe!-程序员宅基地

文章浏览阅读2.1k次。http://poj.org/problem?id=1857要运送车辆到对岸.车辆已经排好队,注意因为桥窄不能超车,分组的时候不能随意分组,前一组的车辆都排在后一组车辆的前面,即车辆的顺序是按输入固定的。只有一座单行的桥,每辆车有其重量及最最快车速,通过分组方式将车辆分成几组运输,每次只能运一组运到对岸后第二组才能出发,每组中车辆的总重量不能超过桥的载重量,运输速度则取决于_poj1857

【代码复现】【没复现成功 先放着吧】Unpaired Point Cloud Completion on Real Scans using Adversarial Training-程序员宅基地

文章浏览阅读351次。pcl2pcl-gan-pub第一步 安装第二步 编译tf_ops第三步 编译 EMD/Chamfer 损失最近在学习三维补全和重建,复现一篇ICLR 2020的文章,就此记录一下。githunb地址论文地址按照github上的步骤复现代码第一步 安装我用的是实验室的服务器Ubuntu,在conda环境中安装cuda、cudnn、tensorflow等,具体详情可参考我的另一篇博客地址.第二步 编译tf_ops参考博客地址.第三步 编译 EMD/Chamfer 损失cd pcl2pcl-_unpaired point cloud completion on real scans using adversarial training

ElasticSearch 索引和MySQL 索引的区别是什么?看完你就懂了_elasticsearch索引和mysql索引区别-程序员宅基地

文章浏览阅读3.3k次,点赞9次,收藏20次。前言这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的。甚至比在我本地使用 MySQL 通过主键的查询速度还快。为此我搜索了相关资料:这类问题网上很多答案,大概意思呢如下:ES 是基于 Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的索引数据,相对于 MySQL 来说不擅长经常更新数据及关联查询。说的不是很透彻,没有解析相关的原理;不过既然反复提到了索引,那我们就从索引的角度来对比下两者的差异。_elasticsearch索引和mysql索引区别

习题10-6 递归求Fabonacci数列 (10分)_本题要求实现求fabonacci数列项的函数。所谓fibonacci数列就是满足任一项数字-程序员宅基地

文章浏览阅读1.5k次。本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。函数接口定义:int f( int n );函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。裁判测试程序样例:#include <stdio.h>int f( int n ..._本题要求实现求fabonacci数列项的函数。所谓fibonacci数列就是满足任一项数字

两分钟一个命令轻松搭建基于 Docker 的 Kubernetes(k8s)集群环境_两分钟搭建kubernetes-程序员宅基地

文章浏览阅读581次。两分钟一个命令轻松搭建基于 Docker 的 Kubernetes(k8s)集群环境。首先确认自己有 docker 环境,一般程序员的电脑都有这个东西,这个相当于已经普及九年义务教育了,没有安装的可以谷歌一下或者百度一下,都是简单操作。这里顺便说一下 Windows 下的 docker ,一般是不推荐在Windows系统下进行开发,但是这里还是要说一下,自从微软的操作系统 Windows 全面拥抱 wsl2 兼容 Linux 内核之后,很多东西都变得友好起来,比如Windows对docker的支持还是很好_两分钟搭建kubernetes

Linux--shell中字符串的截取_linux shell 截取字符串 变量值 引号-程序员宅基地

文章浏览阅读8.8k次。1.在linux中字符串的截取我们可以用一个命令叫做cut,cut主要截取方法有三种1)字节(bytes),用选项-b ,使用方法cut -b/c/f 2)字符(characters),用选项-c 3)域(fields),用选项-f2.以字节定位1)当我们想获取某一字节时 -b后面可以设定要提取哪一个字节,其实-b和3之间没有空格也是可以的,但推荐有空格_linux shell 截取字符串 变量值 引号

随便推点

MapReduce概述_数据向计算靠拢是什么意思-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏15次。MapReduce概述分布式并行编程 数据处理能力提升的两条路线 单核CPU到双核到四核到八核 分布式并行编程:不是把程序在一台单机上运行,借助一个集群通过多台机器同时并行处理大规模数据集 分布式并行编程是多台计算机同时在运行相关的程序分布式与集群是什么?区别是什么? MapReduce和传统的并行编程框架 集群的架构和容错性 硬件价格及扩展性 编程和学..._数据向计算靠拢是什么意思

Java关键字default_java default关键字子类实现不加override会执行吗-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏6次。default常用于接口中,从它的中文意思行来看,大概能猜个差不多,我们本来写Java接口的时候,是不能有方法体的函数,就类似于C++中的虚函数,default关键字在接口中修饰方法时,方法可以有方法体,来看一个例子。 public interface Default { default public void method(){ System.out.printl..._java default关键字子类实现不加override会执行吗

2021.04.07 oppo HR面-程序员宅基地

文章浏览阅读1k次。自我介绍说一下自己的优缺点遇到的技术难题以及怎么解决的为什么要来oppo影响你职业规划的三个要素对于工作地点的要求从事这行工作家里的看法一周可以上班几天反问_oppo hr面

抛弃爬下来的灰色数据,有门槛的风控怎么做?_大数据中的灰色数据?-程序员宅基地

文章浏览阅读587次。大数据文摘作品作者:魏子敏金融风控领域的竞争在今年忽然激烈起来。众多初露头角的企业,正在这两个方向展开厮杀--数据获取能力和算法技术。就在几个月前,前一个赛道开始堵塞。今年6月,《网络安全法》开始实施。未经授权爬取用户手机或者社保记录,公司法人将依法获刑,最高七年;一批以数据交易为主要业务的公司也正面临调查。一大波依靠外部数据整合进行风控和反欺诈的企业前景模糊,算法和建模能力在这个领域的重要性渐渐_大数据中的灰色数据?

SpringMVC对validation的支持_springmvc javax.validation-程序员宅基地

文章浏览阅读403次。对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数据有效性验证,对于不合格的数据信息SpringMVC会把它保存在错误对象中,这些错误信息我们也可以通过SpringMVC提供的标签在前端JSP页面上进行展示。..._springmvc javax.validation

c:forEach循环的List为String时的写法_<c:foreach list<string[]>-程序员宅基地

文章浏览阅读2.8k次。场景使用<c:forEach标签时通常是遍历对象List,比如下面这种:<c:forEach items="${flights}" var="flight"><tr><td class="pass_width_ave_6_column">${flight.chineseName}</td>..._

推荐文章

热门文章

相关标签