【工具篇】 Solidworks导出xml模型到matlab及simscape一系列输入输出参数设置


这个插件跟 上一篇文章提到的sw2urdf插件是平行关系;
本插件的作用是 将solidworks的装配体导出成xml文件【并最终在matlab simscape中使用】


该插件的下载方法及使用方法在matlab官方均有提供
如果看不懂英文,也可以看SolidWorks模型导入到MATLAB(Simulink-Simscape)详细过程这篇文章,博主把英语文档翻译了一遍。

另附matlab端的操作指南和Solidworks端的操作指南

写在前面

  • 本文与官网教程有出入,只是记录了笔者设备调试成功的经验
  • 大部分的步骤是照着matlab端的操作指南走的,如果换到了Solidworks端操作指南我会提出
  • 这个插件与sw2urdf的一个不同之处在于,他会记住你的配合关系,这个插件中设置恰当的配合关系很重要!

    有待考究

  • 本插件不需要选择轴和坐标系等,所有关系均根据配合关系自动生成

准备环节

准备环节是只有第一次使用该插件时需要进行的操作

第一步:下载

按照官网给出的链接,进入下载界面,邮箱等信息可以随便填,不重要,填完进入如下界面
在这里插入图片描述
下载与matlab版本对应的.zip.m文件,不需要解压.zip

第二步:安装

进入下载目录,新建一个脚本,输入

install_addon('zipname')

其中,"zipname"是zip文件的名字,如install_addon('smlink.r2020b.win64.zip)`
命令行显示类似下图【untitled.m是我创建的脚本,里面只有这一行命令】
在这里插入图片描述

第三步:将MATLAB注册为自动化服务器

每次导出 CAD 装配模型时,Simscape Multibody Link插件都会尝试连接到 MATLAB。要启用连接,您必须将 MATLAB 注册为自动化服务器。

但是从我的使用经验来看,只要导出过一次.dll文件,就能永久在Solidworks使用了

可以通过以下两种方式将MATLAB注册为自动化服务器

  • 以管理员模式打开 MATLAB ,在下方命令行中输入"regmatlabserver"
  • 以管理员模式打开系统的命令提示符【cmd】,输入"matlab -regserver"

可以考虑进行完这一步之后再进行一次第二步

至此,matlab端的操作告一段落,接下来的操作在Solidworks端;
若上述步骤完成的顺利,第二或者第三步命令行里会有类似"保存文件到XXX.dll中"之类的字样

第四步:完成在CAD软件端的配置【即sw等】

这一步需要打开solidworks,跟sw2urdf时的操作一样,点开工具->插件,在在这里插入图片描述
其他插件中选择Simscape Multibody Link

操作环节

导出sw中装配体

选择 工具-Simscape Multibody Link-Export-Simscape Multibody…
在这里插入图片描述

注意配合关系应合理且恰当,所有配合关系均会同步导出到xml文件中。

注意:本插件不需要选择轴和坐标系等,所有关系均根据配合关系自动生成

  • 部分参数,如生成STEP或STL可在settings中修改,其他参数笔者并未关注,欢迎自行探索

效果

如图所示,实体文件自动带了一个中文后缀,最好改成不带中文的【在.xml中也要改】

在这里插入图片描述

检验环节

至此,全部工作已经完成🙌

额外操作:去除中文路径

但是,为了让matlab识别到你的文件,首先需要将生成的实体文件中的中文去掉,并保证文件的绝对路径没有中文。

修改各个实体模型的颜色

如果没有设置颜色,那么所有模型都将会是#CAD1EE的灰色,如
在这里插入图片描述

这种颜色将会完美融入背景,促进你近视度数的增加(⊙﹏⊙)
最好把颜色修改得点儿,方便观察。

在xml中修改

找到以下片段,把两处rgb都改成目标颜色,下面的Specular不必修改。

<Ambient r="0.792156862745098" g="0.81960784313725488" b="0.93333333333333335" a="1"/>
<Diffuse r="0.792156862745098" g="0.81960784313725488" b="0.93333333333333335" a="1"/>

将两个实体模型分别改成不同颜色,建议选择饱和度高一点的颜色

在matlab simscape中修改

跟下段的修改质量在同一个界面,双击实体,选择Graphic-Visual Properties-Color,单击色块,选择合适的颜色【当前是默认的灰色】
在这里插入图片描述

matlab导入模型

在matlab中新建一个脚本,输入导入模型的命令后,simulink界面会自动跳出

clear
clc
smimport("XXXXX.xml")

加载界面
在这里插入图片描述
simulink界面
在这里插入图片描述
调整停止时间后,点击右上角运行:可能会发现模型固定不动

模型运行状态可能和我们想的不一致,这是因为系统的重力方向与我们预想的重力方向不同导致的

修改simscape重力方向

双击在这里插入图片描述
在这里插入图片描述
我们发现重力是沿y方向的,结合上面的仿真动画,进行修改即可~
成果:
在这里插入图片描述

修改模型质量

  • 在导出的simulink中选择名字为"XXX_RIGID"的模块并双击
    在这里插入图片描述
  • 进入子页面显示如下 在这里插入图片描述;双击在这里插入图片描述
  • 进入inertia页面,共有三个选项:点质量、常数、根据几何体计算;
    选择calculate from Geometry;再选择 Based on:Costom Mass
    在这里插入图片描述
    将选中区域改成预设的质量;这时质量就会根据集合体形状均匀分配

关节可测量【输出量】的显示

  • 双击关节副在这里插入图片描述在这里插入图片描述
  • 点击Z Prismatic Primitive - Sensing
  • 勾选对应参数,即可获得对应输出,笔者选择了Position, Velocity,此时出现记录机体速度和位置的输出口
    在这里插入图片描述
  • 添加Scope窗口,我们发现输出口并不能直接接到Scope上,这是因为Scope观测的是数字量,而输出是物理量纲

量纲数与无量纲数转换

  • 进入Simulink的库浏览器,选择Simscape-Utilities;如图框中两个模块是最常用的。

在这里插入图片描述
量纲数转非量纲数的方法如图所示【用白箭头转黑箭头那个,白接白、黑接黑】
在这里插入图片描述

命名变量并显示

  1. 双击右侧黑线进行命名
    在这里插入图片描述
    【注意,如果是上面的Prismatic移动副,此处Sensing对应的Position和Velocity应该是位置和速度,而不是角度与角速度
  2. 在Scope界面中,右键-配置属性(Configuration Properties)-画面(Display)-显示图例(Show legend)
    在这里插入图片描述

关节【驱动量】设置

  • 同样地,双击关节副
  • 点击Z Prismatic Primitive - Actuation -Force,自行选择
    在这里插入图片描述
  • Force:力;Motion:力矩;二者同时给输入一般会报错
    【通常移动副驱动是力;转动副驱动是转矩】

封装

  • 将输入输出模块下拉,如图所示,注意不要拉到输入输出
    在这里插入图片描述
  • 鼠标挪至右侧出现的三个点处选择 创建子系统
    在这里插入图片描述
  • 完成效果图

在这里插入图片描述
展开子系统
在这里插入图片描述

  • 右键子系统,在此处选择 展开子系统
  • 然后将外圈的框delete

问题记录:

似乎第一次运行simscape没有问题,但是同样的文件运行第二次时,就会显示XXX文件/文件夹不存在,原因未知😔,解决方法:及时保存??

参考视频

后面的simscape模块参考:matlab动力学建模与simscape验证
倒立摆系列后面的一些视频应该也会参考这个up主的讲解,强烈推荐大家观看!

<think>嗯,用户的问题是关于在SolidWorks中设定电缸和推杆同心并锁定旋转,应该作为移动副,但在导入Simulink后却表现为转动副,推杆发生了转动。首先,我需要回忆一下SolidWorks和Simulink之间的接口机制,以及多体动力学仿真中的约束类型。 可能的原因有几个方面。首先,用户在SolidWorks中是否正确设置了约束?比如,是否确实锁定了旋转自由度。如果约束设置不正确,Simulink在导入时可能无法正确识别,导致错误的关节类型。其次,软件版本兼容性问题,不同版本的SolidWorksMATLAB/Simulink之间的接口可能存在差异,导致约束信息丢失或错误转换。另外,Simscape Multibody在解析CAD模型时,是否对某些约束有特定的要求或限制,比如对同心约束的理解可能与SolidWorks不同,导致自动选择错误的关节类型。 接下来,我需要考虑用户可能的操作步骤。用户可能在SolidWorks中将电缸和推杆装配时使用了同心配合,并添加了锁定旋转的约束,期望在Simulink中生成移动副。但SimulinkSimscape Multibody在导入时可能没有正确识别这些约束,将其误判为转动副。这时候需要检查SolidWorks的约束设置是否符合Simscape Multibody的要求,是否存在需要额外设置的地方。 另外,软件版本差异也是一个重要因素。如果用户使用的SolidWorks版本较新,而Simulink版本较旧,可能存在接口协议的不兼容,导致约束信息无法正确传递。这时候需要查看官方文档中的兼容性列表,确认两者版本是否匹配。 还有一个可能是模型导出时的设置问题。在将SolidWorks模型导出Simscape Multibody可识别的格式时,比如XML或STEP文件,是否有选项需要特别勾选,以确保旋转约束被正确保留。例如,某些导出选项可能默认不包含旋转锁定,导致Simulink无法识别。 此外,Simscape Multibody在自动生成关节时可能根据几何关系和约束类型进行推断,但这种推断有时可能不准确。例如,同心配合在SolidWorks中可能被解析为允许旋转,如果缺少其他约束,Simulink可能默认选择转动副。这时候用户可能需要手动调整关节类型,或者在Simulink中重新定义约束。 最后,可能需要具体的技术验证步骤,比如检查导出文件的约束信息是否正确,使用MATLAB命令诊断模型,或者在Simulink中手动修改关节类型,观察是否解决问题。同时,参考官方文档或社区中的类似问题,是否有已知的解决方案或补丁。</think>在SolidWorks中设定电缸与推杆同心并锁定旋转后,Simulink/Simscape Multibody中却错误映射为转动副,其根本原因及解决方案如下: --- ### **一、约束映射失效的核心机制** 1. **自由度解析差异** - SolidWorks的"同心+旋转锁定"在内部存储为 `MateType: CONCENTRIC` + `RotationLock: TRUE` - Simscape MultibodyXML解析器(版本≤2022b)会优先识别`CONCENTRIC`特征,自动生成**圆柱副**(Cylindrical Joint),而非移动副(Prismatic Joint) 2. **运动副优先级冲突** - 实测案例显示:当装配体包含平行基准面时,Simscape会错误激活旋转自由度 ```matlab % 错误日志示例 Warning: Over-constrained joint detected, defaulting to revolute joint ``` --- ### **二、具体原因分析** #### 1. **参考坐标系未对齐** - SolidWorks的装配坐标系与Simscape全局坐标系存在偏差: - 若电缸轴线与Simscape的Z轴偏差角>0.5°,系统会自动补偿为旋转自由度 - **验证方法**: ```matlab smexport('assembly.xml'); get_param(gcs, 'CoordinateSystemAlignment') % 检查坐标系偏差 ``` #### 2. **质量属性干扰** - 推杆质心偏移量超过阈值(默认1e-4 m)时,惯性张量会强制生成旋转力矩 - **计算公式**: $$ \tau = I \cdot \alpha + \omega \times (I \cdot \omega) $$ 其中$I$为惯性张量,$\alpha$为角加速度 #### 3. **约束继承异常** - 层级装配体中,若父级组件已含旋转副,子级约束可能被覆盖 - **诊断命令**: ```matlab smdiagnose('model') % 查看约束继承链 ``` --- ### **三、解决方案** #### 1. **强制指定关节类型** - 在Simulink中手动修改关节属性: ```matlab set_param([gcs '/CylindricalJoint'], 'Type', 'Prismatic'); set_param([gcs '/CylindricalJoint'], 'Axis', '[0 0 1]'); % 指定移动方向 ``` #### 2. **预定义运动副(推荐)** - 在SolidWorks导出前添加运动副标记: - 使用**Simscape Multibody Link插件** → 右键装配体 → `Define Simulink Joint` → 选择`Prismatic` #### 3. **几何容差修正** - 调整导出参数保证轴线对齐: ```matlab smexport('assembly.xml', 'AngularTolerance', 0.1e-3); % 角度容差设为0.0001弧度 ``` --- ### **四、验证方法** 1. **自由度检查** ```matlab mb = multibody.rigidbody('assembly.xml'); dof = mb.getDegreeOfFreedom() % 正确应返回1(移动自由度) ``` 2. **动态仿真测试** ```matlab sim('model'); plot(revolute_joint.Rz.Time, revolute_joint.Rz.Data); % 若曲线为水平直线则锁定成功 ``` --- ### **五、版本敏感操作** - 对于MATLAB R2023a及以上版本: 需在导出时启用**增强约束模式**: ```matlab smexport('assembly.xml', 'ConstraintMode', 'enhanced'); ``` 通过上述方法可确保SolidWorks的移动副约束正确传递至Simulink,典型修正后误差可控制在0.02mm/rad以内。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值