solidworks中有一个插件,可以将装配体导出成urdf模型【并最终在drake仿真平台进行使用】,插件下载地址如下:
sw_urdf_exporter http://wiki.ros.org/sw_urdf_exporter
这个在网上应该能找到很多教程,在此贴上我当时使用的教程:Solidworks导出urdf模型下面多是记录笔者在操作时出现的一些问题
写在前面【太长不看版】:
n个joint
应该需要n+1个零件
base_link
还是其他关节,坐标系都应该设置在该零件上【也就是,并不需要设置"world_base"这种绝对坐标系】参考该教程:Solidworks导出urdf模型
注意上面提到的参考坐标系方向的选择,教程有误【虽然纯移动副下可能不影响结果】
二者都是旋转,前者可以旋转多圈,后者有限制
urdf中的移动关节joint的type
属性为prismatic
一开始,我被urdf模型的这种树状结构给误导了(如下图),以为urdf中不能设置移动副,另外网上能找到的关于urdf设置平移的文章很少,因此困扰了我一段时间。
然而,urdf显然是可以设置移动副的,只需要将type
属性设置成prismatic
即可
除了运动副和移动副,你还需要设置一个固定不动的平台作为base_link
,对应的坐标轴是固定的world_frame
我一开始的想法是做如下一个倒立摆模型,滑块可以在地面上移动,但是我发现无法实现(找不到base_link
了)
最后我的解决方法是:加了一个固定的平台
为什么需要一个固定的平台呢?
——可以这么理解,一个joint存在于两个物体之间。那么此处移动副对应的两个物体就应该是滑块与"地板"【滑块在地板上滑动】,但是如果不设置这个固定不动的"地板",移动副就变成滑块与NULL
【滑块在____上滑动】之间的运动,找不到实体,定义不完全。
参考上面的视频,导出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" />
joint>
设置的好好儿的模型导出后变样了,这是因为上面说的参考坐标系方向不统一
修改mesh标签【.STL处】的路径
为了使用LQR或者PID控制,需要将这些关节设置成"可控的变量",即actuator
解决办法:
在 标签后加上这段:
<transmission type="SimpleTransmission">
<joint name="your_Joint_name"/>
<actuator name="your_motor_name"/>
transmission>
obj文件是3D模型文件格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualizer"开发
转换的方法多种多样,比如可以使用一个叫meshlab
的软件进行处理。
本文介绍的是另一种方法,在Solidworks上实现转换,这里需要你下载并打开ScanTo3D
这一插件
然后打开网格文件形式的.STL文件
如果直接双击打开.stl的话,默认是图形文件,这样是错误的
可能会蹦出一个提示说模型小于1mm什么的,不用理会,确定就好
点击另存为,文件类型选择*.obj
即可【图形文件下转换会失败】
这应该是直接将*.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