【工具篇】 Solidworks导出urdf模型 & Solidworks将stl文件转为obj文件 附过程中遇到的错误
解决了Solidworks中urdf的导出,urdf中continuous和revolute的区别,stl转obj等问题
目录标题
如题,本篇解决两个问题: urdf模型的导出和 stl文件与obj文件的转换,另外列出来自己在探索过程中遇到的一些问题,希望能给各位提供一些参考🙂
A.urdf模型的导出
solidworks中有一个插件,可以将装配体导出成urdf模型【并最终在drake仿真平台进行使用】,插件下载地址如下:
sw_urdf_exporter http://wiki.ros.org/sw_urdf_exporter
这个在网上应该能找到很多教程,在此贴上我当时使用的教程:Solidworks导出urdf模型下面多是记录笔者在操作时出现的一些问题
写在前面【太长不看版】:
- 最开始的base_link无法选择关节【但是并不代表base_link绝对固定】,因此
n个joint
应该需要n+1个零件
- 关于Reference Coordinate System参考坐标系的选择,无论是
base_link
还是其他关节,坐标系都应该设置在该零件上【也就是,并不需要设置"world_base"这种绝对坐标系】 - 关于参考坐标系方向的选择,应保证所有坐标系的xyz轴方向相同且与原点xyz方向一致【这一点上面的教程就有出错】
- 导出urdf模型时,注意两个joint之间的关系,通常是父子关系
- 在sw中最好设置一个合适的初始位置【竖直or水平】再导出,配合情况反而没那么重要【比如:底座能否前后左右上下移动这种,不影响】
- 最后导出时,记得修改文件名字,不要用"XXX.SLDASM",这个名字是你的文件夹名和urdf文件的名字
A1 模型为纯转动副
参考该教程:Solidworks导出urdf模型
注意上面提到的参考坐标系方向的选择,教程有误【虽然纯移动副下可能不影响结果】
Q1.1 continuous和revolute的区别
二者都是旋转,前者可以旋转多圈,后者有限制
A2 模型中包括移动副
urdf中的移动关节joint的type
属性为prismatic
一开始,我被urdf模型的这种树状结构给误导了(如下图),以为urdf中不能设置移动副,另外网上能找到的关于urdf设置平移的文章很少,因此困扰了我一段时间。
然而,urdf显然是可以设置移动副的,只需要将type
属性设置成prismatic
即可
设置一个固定不动的平台
除了运动副和移动副,你还需要设置一个固定不动的平台作为base_link
,对应的坐标轴是固定的world_frame
我一开始的想法是做如下一个倒立摆模型,滑块可以在地面上移动,但是我发现无法实现(找不到base_link
了)
最后我的解决方法是:加了一个固定的平台
为什么需要一个固定的平台呢?
——可以这么理解,一个joint存在于两个物体之间。那么此处移动副对应的两个物体就应该是滑块与"地板"【滑块在地板上滑动】,但是如果不设置这个固定不动的"地板",移动副就变成滑块与NULL
【滑块在____上滑动】之间的运动,找不到实体,定义不完全。
Q1.2 solidworks导出后移动副无法移动
参考上面的视频,导出urdf后,有时我们会发现模型的移动副无法移动,这时候可能是配合没设置移动副限位,这时候solidworks的工具会在导出的urdf上给我们自动加一个限位,让该关节无法移动(如下方代码),在urdf中找到它并注释即可
<joint
name="move_joint"
type="prismatic">
<origin
xyz="-0.013673 -0.029493 0.01"
rpy="0 0 -3.1416" />
<parent
link="base_link" />
<child
link="base" />
<axis
xyz="-1 0 0" />
<!-- 原来下面这一行是没有注释的,注释掉即可取消该关节限位 -->
<!-- <limit
lower="0"
upper="0"
effort="0"
velocity="0" /> -->
</joint>
Q1.3 模型错位问题
设置的好好儿的模型导出后变样了,这是因为上面说的参考坐标系方向不统一
Q1.4 找不到对应的模型:
修改mesh标签【.STL处】的路径
Q1.4 每个stl模型都是整个装配体
如图所示,不知什么原因,建议重启sw重新搭建
如果重启无果,可以试试在最后的导出界面点到最下面的项目,再导出,但我认为是玄学🥵
A3 将关节设置为驱动
为了使用LQR或者PID控制,需要将这些关节设置成"可控的变量",即actuator
解决办法:
在 </joint>
标签后加上这段:
<transmission type="SimpleTransmission">
<joint name="your_Joint_name"/>
<actuator name="your_motor_name"/>
</transmission>
B stl文件转为obj文件
obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发
转换的方法多种多样,比如可以使用一个叫meshlab
的软件进行处理。
本文介绍的是另一种方法,在Solidworks上实现转换,这里需要你下载并打开ScanTo3D
这一插件
-
要激活ScanTo3D,可以单击Solidworks上方的工具 > 插件
-
然后打开网格文件形式的.STL文件
如果直接双击打开.stl的话,默认是图形文件,这样是错误的应该是
可能会蹦出一个提示说模型小于1mm什么的,不用理会,确定就好
-
点击另存为,文件类型选择
*.obj
即可【图形文件下转换会失败】
Q2.1 无实体可通过WRL处理
这应该是直接将*.PRT;*.SLDPRT进行另存为导致的,正确做法是将他们先转为.stl
再转.obj
实物展示
第一版实物长这样:第二版实物长这样:
试找出不同?
——底座高度高于杆了
此外,三者质量分别为25kg,0.643kg,0.009kg
大致满足
M
a
M_a
Ma远大于
M
b
M_b
Mb远大于
M
c
M_c
Mc
此外之外,我是在drake上仿真的,说一点血泪教训:
仿真时间一定要拉短,1e-3甚至-4
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)