最近阅读王阳明的《传习录》的时候,讲到关于孔子删减《诗经》的讨论,王的学生徐爱问:“为何《诗经》中会有《卫风》《郑风》这样的低俗诗作?”,王阳明认为孔子删减诗经为二百篇,包含的都是雅诗,之所以会含有淫诗,是由于秦始皇焚书坑儒导致《诗经》遗失啦,后人为了拼凑出两百篇,又将一些被删减的文章加入其中,所以导致的。看完这个讨论之后,我感觉这样的情况实在是太多,许多人不求甚解、浅尝辄止,对事物的认识根本就不深刻,导致后人阅读他们的材料的时候,造成很大的误解。而且人们往往只记录自己成功的案例,但是不喜欢记录自己犯下的错误,实际上人们往往擅长的是失败,而不是成功,所以我们需要做的就是避免犯错,或者给出解决错误的方法,排除错误本身也是一种成功。
1. 准备工作
- 平台:Windows 10 64位 + Solidworks 2018
- 测试软件:V-rep CoppeliaSim Edu教育版
- 插件:solidworks_urdf_exporter 1.6.0版本
安装软件等相关步骤,就不过多展开!另外本人对于Solidworks是小白,该插件对于各版本的支持都做的挺好的,所以不要动不动就怀疑插件有BUG,很多情况都是自己的模型过于复杂导致的问题。
2. 导出流程
2.1. 心酸历程
初始结构十分复杂,装配体中包含装配体,包含许多的重复组件,产生了复用。
由于最初不知道这些情况,尝试着建立旋转轴和坐标系,结果是导出失败,Solidworks持续出现崩溃。对于导出崩溃的问题,大多数人偏向认为是模型过于复杂的原因导致,但是模型过于复杂只是表象,我刚开始也不是很清楚,然后就尝试着删除一些不必要的组件,只保留简单的两层link
模块,这一次导出成功啦,但是导入到V-rep中查看模型结果的时候,发现整个模型散架,特别是一些重复性的组件,往只有一个组件的位置是正常的,而其他重复组件则位置错乱,主要是模型的旋转轴和坐标系建立错乱或者是模型重复使用导致的。这个问题也解决之后模型终于可以正常导出了,但是由于需要将一个装配体中嵌入的模型的文件单拎出来,所以对文件中的装配体,采取了复杂的重组,包括解散装配体、生成新子装配体、进子零件另存为零件模型、使之独立、替换零件等一系列操作。此处省略5万字。
2.2. 机械模型文件改造
由于实验室的保密要求,对图片进行了遮挡。下图是将模型魔改之后的文件结构。
从中可以看出,每个
link
所对应的组件都有一个独一无二的模型文件,即便是重复的组件也没有公用同一个模型,同时将一些螺丝钉的零件和link主体进行了相应的合并和融合,是机械结构整体变得简单。
2.3. 建立旋转轴和坐标系
旋转轴和坐标系的方向是建立在joint
的基础上的,实际上SW2URDF插件自身也能够自行生成,但是自己建立的旋转轴和坐标系的精度和方向会更加符合。
-
base_link
是机器人导入世界坐标系的中心,也是整个坐标系的参考坐标系。下图是在网上找的一个小车模型图:
base_link的坐标系,以底盘中心为原点,Z轴朝上,X轴朝前,Y轴为小车坐标系的左边。
-
base_link
的子link
的旋转轴和坐标系是建立在父link
,也就是base_link
的基础上的,我在实际建立坐标系的过程中,始终保持Z轴朝上,旋转轴根据与base_link的关系进行选择,比如在这个小车上,就以Y轴作为旋转轴,且方向朝向机器人本体之外,这样可以使得轮子的坐标系和底盘的坐标系是方向一致的,其他的几个轮子也是这样建立,并没有什么必须X轴作为旋转轴这样的设定,其他三个轮子可以选择可以选择始终按照Z轴朝上,Y轴朝外
或者Z轴朝上,X轴朝前
这两种设定方法中的一种进行设定。 - 具体如何在Solidworks里面建立参考坐标轴和坐标系,参考博客Soildworks三维图导出URDF文件
- 建立的坐标轴和坐标系最好将名字改成全英文的,同时为了方便后期选择,最好是和
part-name
相关的名字,比如part-name
为h1leg
,则旋转轴名字为h1leg_axis
,坐标系名字为h1leg_frame
。
下图是博客: 实际模型制作、Solidworks文件转urdf与rviz仿真中构建的坐标系。
2.4. 配置参数设置
建立好模型和相关的旋转轴和坐标系之后,需要做的就是在插件中配置参数。步骤如下:
-
整体规划模型的父子层次结构
- 参数设置
参数配置参考博客:6轴机器臂的URDF文件的生成并用rviz和moveit显示
- 在配置link的过程中一定要做好保存工作,由于这个插件存在一个BUG,会退出配置窗口,再次进入插件配置时,原有的配置就都没有啦。
-
link
和joint
的名字尽量简单点,参考格式:part-name_link
和part-name_link_joint
,采用这种统一的方法,也方便后期的维护和整理。 - 在这会充分体现模块化组件的优势,在选取
Link Components
时,可以选中几个组件就可以,没必要整个文件树中到处找。joint类型有六种,分别是:
2.5. 导出配置
导出配置参考博客:6轴机器臂的URDF文件的生成并用rviz和moveit显示
- 如果是
revolute
类型的joint
,最好设置一下角度限制,这个可以参考实际的机器人模型的角度要求。 -
link
的颜色可以设置也可以在urdf文件中设置,该颜色只能用于Rviz中模型的颜色显示,但是无法应用Gazebo模型的颜色显示,需要重新设置。 - 各个轴的转动惯量是仿真中最重要的参数,它和质量
Mass
是密切相关的,后期会对该参数进行调整。
点击Finish
按钮之后就会生成相关urdf
项目文件,文件夹名最好改为robot-name_description
,由于该文件夹中的文件中有些参数和该文件夹的名字密切相关,建议大家提前想好名字,不要等到后期来改,这样过于繁琐。
2.6. V-rep模型检查
在VREP机器人仿真软件中,可以用URDF import插件导入URDF文件,参考博客: Solidworks 2016中导出URDF文件
2.7. ROS中模型调用
将生成获得的robot_description
文件夹拷贝到Ubuntu系统下。
# 在home目录下创建功能包
$ mkdir -p robot_ws/src
$ cd robot_ws/src
# 将相关的robot_description拷贝到src文件下
$ cd ..
# 编译
$ catkin_make
$ source devel/setup.bash
$ roslaunch robot_description display.launch
3. 注意事项
3.1. 导出单个零件没问题,但是导出装配体,solidworks就崩溃
在问题下面,一些大佬们给出错误解释和相关的解决方案:
原因(指导思想):由于在装配体或次层装配体中重复使用了某个零件。例如某个螺柱零件重复插入装配体,此时插件会将其识别为同一零件而对其的约束进行重复叠加,导致最终导出stl文件时零件位置异常。总的表现是装配体太大,需要简化一下。
解决办法:要插入同一个零件时,将零件另存为另一个不同名零件,然后插入新建文件即可。对于已经建好的装配体,可用替换功能进将新建文件替换旧文件。
我面临的情况比较特殊,实验室本来就已经构造了这个模型,是一种装配体嵌入装配体的模式相当复杂,各种螺丝钉都在模型中,为了让模型简单方便导出,只有简化模型啦。常见的简化模型方法就是压缩和连接重组。连接重组操作我不知道怎么做。
压缩:将零件从模型中去除,但是可以恢复
删除:将零件中的模型彻底删除,无法恢复
隐藏:只是将零件中的模型隐藏
为了解决Solidwork崩溃的问题,我按照上面的指导思想走上模型的魔改之路:
会有一些警告提示,所以为了避免将原始模型给魔改死啦,一定要做好保存和备份。
- 将
link
组件下的相关零件组合成一个装配体:生成新子装配体。
-
保存新的子装配体
,并使之独立
,然后替换零件
至此,该模型的电池组件就已经魔改完成啦,其他组件也可以参照类似的方式进行改造。
3.2. 提前规划好link
父子层次关系
避免魔改导致子
link
组件无法修复,在魔改模型之前,需要提前将机器人的子组件分离出来。base_link
组件坐标系十分重要,由于机器人在建立的过程中,Solidworks的参考坐标系可能不是实际机器人的本体坐标系,这时若是自动生成base_link
坐标系,可能会导致机器人模型在导入Gazebo软件时,模型的方位是不正确的,也会引起后期机器人的控制出现问题。建立的坐标轴和坐标系没必要放到子零件内部去,但是如果是自己从头建立一个模型,最好将坐标轴和坐标系建立在零件里面。具体可以参考博客:二、Soildworks搭建机器人模型、三、Soildworks三维图导出URDF文件
尽量将joint的坐标轴和坐标系建立在父
link
组件而不是子link
组件上,一些模型散架就是这个原因造成的。坐标轴的方向与机器人的本体坐标系base_link要搭配,joint的角度设置要求
旋转轴和坐标系的命名十分重要,最好全是英文
3.3. 多保存和备份
由于需要对模型进行魔改,多备份,一是防止对初始模型零件进行了改动,二是避免误操作导致操作无法修复。
保存和备份的区别:
- 保存:只是将原有的模型文件复制一份链接,但实际上该模型中链接的子零件是一样的,子零件没有进行拷贝
- 备份:不仅将原有的模型文件拷贝了一份,还将相关的子零件也进行了深入拷贝,平时如果想将一个机器人模型从一台电脑上拷贝另外一台电脑也需要这么做,不然再去其他电脑上打开文件,会出现零件缺失的报错信息。
3.4. 提前导出测试
由于在SW2URDF插件中,导出URDF模型文件的过程十分的繁琐,操作流程复杂,为了避免不必要的重复工作,在建立初步的base_link
和一级link
之后,可以尝试着导出URDF模型,如果这时导出模型正常,那么可以开始尝试着着手建立二级link
,如果此时模型也导出正常,那么说明模型导出没什么问题,可以继续进行导出操作。
3.5. 模型质量参数和转动惯量优化
这个问题可能之后还需要讨论,所以这里不进行深入的探讨,详细的信息可以参考相关的博客连接。
参考链接:
机器人学中的惯性矩阵坐标转换及在SolidWorks中的测量
Solidworks 2016中导出URDF文件
URDF物理参数解释及生成
SolidWorks导出URDF到rviz注意事项
4. 后续工作
- URDF模型文件进行XACRO模型改造
- Gazebo属性添加
- Gazebo插件功能添加
- 模型文件的材质属性添加
- 模型文件的质量参数和转动惯量更新
5.参考链接
【1】SolidWorks to URDF Exporter插件下载地址
【2】SolidWorks to URDF Exporter插件Github地址
【3】官方教程地址
【4】V-rep下载地址
【5】Solidworks转URDF零件错位的解决
【6】SolidWorks导出URDF模型的注意事项
【7】SOLIDWORKS导出URDF注意事项
【8】【踩坑总结】SW导出URDF文件到ROS中