如题,本篇解决两个问题: 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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐