相关博客
- 在V-rep中通过D-H参数自动生成机械臂模型:https://blog.csdn.net/DoctorSRn/article/details/106852312
前言
首先介绍本篇博客的背景:要进行双臂机器人的规划和协作控制方法的仿真,但是双臂机器人的机械结构可能会发生变化,为了实现调整机械臂结构后仍可以方便快捷的进行算法仿真的要求,打算使用描述性文件对机械臂结构进行建模,然后通过描述性文件将机械臂模型导入至V-rep软件。
具体来说机器人3维模型导入至V-rep仿真软件的过程如下图所示:
(这里假设机器人的机械结构图是由Solidworks绘制)
所以,为了较方便的实现调整机器人机械结构的需求,从结构图到导入至V-rep仿真软件中可以有两种方法:
- 从Solidworks中的3D装配结构图先导出成STL网格文件,STL网格文件可以使用Magics软件改变其形状,从而实现快速调整机械结构,然后根据STL文件编写机器人的XACRO/URDF文件,再将URDF文件导入V-rep即可。每次直接使用Magics调整STL文件,然后重新导入V-rep,就可实现调整机器人机械结构的需求;
- 使用Solidworks的URDF插件,可以实现直接从机器人3D装配结构图直接生成URDF文件,然后将URDF文件可以导入V-rep中。每次直接在Solidworks中调整机器人装配结构图,然后重新导出URDF文件,再导入至V-rep中,就可实现调整机器人机械结构的需求。
下面详细介绍整个导入过程,以及每个步骤中遇到的一些问题和解决办法。主要内容包括以下几部分:
PS:
- 博客内容可能会出现在自己之后的论文中,不知道论文查重会不会和博客内容进行比对,为了防止之后出现这种情况,博客内容尽量简写了。
- 使用环境为:windows 8.1 + V-rep 3.6.1,最新版本的V-rep为3.6.2,之后的V-rep将停止更新,该公司将开放新的仿真平台,听说完全兼容V-rep,还挺期待的。
1.从Solidworks导出STL文件和URDF文件
机器人的机械结构图通常使用SolidWorks或者其他的3维制图软件进行绘制,绘制好的工程通常包括零件文件和装配体文件,3维制图软件提供了将原始结构图文件转换为其他文件的功能。
1.1 从solidworks中导出机器人的STL文件
在仿真软件中导入的机器人模型主要包含机器人的结构参数、动力学参数和外形等属性。而SolidWorks中的装配结构图文件细节较多、文件较大,需要经过简化后才能导入仿真软件,最终使仿真软件中的计算效率和速度更快。
通常将装配结构图导出成STL文件或者DAE文件来表征机器人的外形,STL文件相对原始的装配结构图是经过简化的,也就说STL文件在外形方面的信息丢失比较多,所以通常从装配结构图可以导出至STL文件,但是从STL文件反向得到装配图是比较困难的。
在SolidWorks导出STL文件可以直接进行,具体细节就不讲了。
1.2 从solidworks中导出URDF文件
SolidWorks提供了URDF插件,可以直接将装配结构图导出成URDF文件,导出的文件结构如下:
在urdf
文件夹下就是urdf源文件,在meshes
文件夹下是导出的包络图文件,通常是STL文件或者DEA文件。
2.使用Magics软件直接编辑STL文件
前面讲到设置好机器人的STL文件并编写好对应的URDF文件后,只需要通过修改STL文件就可以实现快速的对机器人机械进行调整。STL文件的调整可以使用Magics软件,该软件可以非常方便的对STL文件中的形状进行编辑,包括拉伸、剪切、布尔操作等等。
3.使用URDF文件描述机器人机械结构
URDF是常用的通过描述性文件对机器人的结构进行建模的方法,通过便签化的文本文件来描述机器人的机械结构、动力学参数、外形和颜色等特征。而xacro是URDF的升级版,可以在xacro中使用各种宏,利用xacro可以简化urdf文件,使urdf文件变得可读性强且优雅。但在使用时都是将xacro文件先解析为urdf文件后再使用,从SolidWorks直接导出的URDF文件其实是以xacro形式导出的。所以这里需要先解决xacro到urdf的转换问题。
从xacro到urdf的转换有两种方法:
- 借助ROS中的xacro包实现转换。不推荐这种方法,因为需要安装ROS环境,比较麻烦。
3.1
章节主要是记录了自己在使用这种方法过程中的一些尝试,所以3.1
章节可以跳过。 - 使用可以独立运行的xacro2urdf解析器实现xacro转换为urdf
将xacro文件转换为urdf文件,一种方式使用ROS的工具包进行,需要安装ROS和相关的软件包;另一种方式借助开源xacro转urdf代码实现。
3.1 借助ROS将xacro文件转换为urdf文件
需要使用的工具运行在Linux环境,方便起见,使用腾讯的Cloud Studio作为Linux环境(版本为Ubuntu 16.04.5 LTS)。
- 在Cloud Studio中安装ROS Kinetic:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
# 完整版ROS,接近2G
# sudo apt-get install ros-kinetic-desktop
# 核心版ROS,不到1G
sudo apt-get install ros-kinetic-ros-base
sudo rosdep init
rosdep update
#echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
#source ~/.bashrc
# Cloud studio使用zsh
echo "source /opt/ros/kinetic/setup.zsh" >> ~/.zshrc
source ~/.zshrc
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
- 在Cloud Studio中安装相关的软件包:xacro,依赖包catkin_pkg,urdf检查工具urdf_check
sudo apt-get install python-catkin-pkg
sudo apt-get install liburdfdom-tools
检查urdf文件是否语法合法:check_urdf xxxx.urdf
- 安装xacro包:
手动安装xacro包:- 将xacro包clone至本地
git clone https://github.com/ros/xacro.git
- 进入xacro根目录,进行安装
sudo python setup.py install
自动安装:
sudo apt-get install ros-kinetic-xacro
- 将xacro包clone至本地
3.2 使用可以独立运行的xacro2urdf解析器实现xacro转换为urdf
xacro2urdf解析器是自己在另一个开源转换代码xacro的基础上迁移过来的,而开源转换代码xacro是从ROS软件包中抽离出来可以单独运行的xacro解析器。
- 由于该代码使用python2编写,当前环境为python3,所以需要先将代码迁移为Python3。主要修改
print
,sort
和异常处理等几部分。可以边运行test_xacro.py
边根据报错来修改。 - 如果
python test_xacro.py
可以成功运行,则说明代码修改完成。 - 然后就可以使用
xacro.py
进行xacro到urdf的转换。使用方法示例:python xacro.py -o ./test_abb_4600.urdf urdf/irb4600_60_205.xacro
。可以直接运行python xacro.py
获取帮助信息。 - 要将
xacro.py
代码和urdf文件夹放置于同一目录
更多信息欢迎访问xacro2urdf解析器的代码仓库,在代码仓库中提供了一个将ABB 4600型机械臂的XACRO文件解析为URDF文件的例子。
4.将机器人通过URDF文件导入至V-rep仿真软件中
URDF相关的知识这里不打算细讲,相关的知识可以在一下网站进行学习:
- 古月居:http://www.guyuehome.com/372
- urdf语法规范(非常重要):http://wiki.ros.org/urdf/XML
- urdf官方教程:http://wiki.ros.org/urdf/Tutorials
- DH2URDF:https://github.com/AdoHaha/DH2URDF
- 在线URDF对应机器人3D模型展示:https://mymodelrobot.appspot.com/5629499534213120
- URDF基本知识:https://blog.csdn.net/sunbibei/article/details/52297524
V-rep中提供了通过URDF导入机器人模型的插件。
4.1 urdf文件导入V-rep例子1
尝试导入一个小车的urdf描述文件,小车urdf文件来自该博客,小车的URDF文件为:
<robot name="test_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
<joint name="joint_base_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
</joint>
<joint name="joint_base_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
</joint>
<joint name="joint_base_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
</joint>
</robot>
将上面的小车URDF文件保存在本地,然后使用V-rep的URDF插件导入后如下图:
- 发现只有wheel1是黑色,其他轮子的颜色不对,这是因为wheel1的
<material>
是完全的,其他三个轮子的<material>
属性没有写全,当严格按照wheel1的格式来写时,其他轮子的颜色就正常了。而在ROS下,这种写法是可以的。这可能是因为V-rep的URDF解析器没有把情况考虑周全。当然也可以导入URDF后在V-REP中设置模型的颜色。 - 另外还有一些ERROR,但是导入的模型是符合urdf文件描述的。
- urdf文件中
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
的rpy
表示绕轴 x , y , z x,y,z x,y,z分别旋转的角度(弧度制),这里的1.5表示绕y轴旋转差不多 90 ° 90\degree 90°。 - 关节
<joint>
属性<type>
是fixed
,导入V-rep后是用于连接刚性物体的力传感器模块。 - 导入的所有模型没有使能动力学属性。
4.2 urdf文件导入V-rep例子2–导入有STL文件构成的URDF文件
https://github.com/doctorsrn/xacro2urdf/blob/master/abb_irb4600_support/urdf/test_abb_4600_voxel1.urdf
在3.2
节介绍了xacro2urdf解析器,并给出了一个ABB 4600机械臂URDF文件导出的例子,而V-rep仿真软件中内置了ABB 4600机械臂模型,所以我们将通过URDF导入的机械臂和内置的机械臂模型进行一个简答的对比。
首先在xacro2urdf解析器代码仓库中可找到导出的ABB 4600机械臂的URDF文件test_abb_4600.urdf
,使用URDF插件导入V-rep,
导入ABB 4600型机械臂和V-rep中内置的模型对比如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XVMKKgM-1592535862447)(./urdf_pics/4_pics.png)]
左边是V-rep内置的ABB 4600机械臂模型,右边是通过URDF文件导入的机械臂模型。可以看到从外形上看区别不大,内置的模型细节更多一些。其他方面的差异:
- 通过URDF直接导入的模型,各个零部件的名字比较长且混乱,需要通过手动修改简化;
- URDF文件中零件颜色的设置存在一些问题,导致导入的模型颜色有时会不正常;
- 其他问题。。
4.3 urdf文件导入V-rep例子3–导入有URDF内置几何形状的模型文件
在4.2
中导入的ABB 4600机械臂它的<collision>
和<visual >
标签属性均有外部的STL文件或DEA文件来定义,如果不使用外部文件,直接使用URDF默认支持的长方体、圆柱体和球体等形状来定义也是可以的。在xacro2urdf解析器代码仓库中提供了使用URDF内置几何体表征<collision>
和<visual >
标签属性的模型文件test_abb_4600_voxel*.urdf,具体实现是简单粗暴的直接把<collision>
和<visual >
标签属性中的STL部分替换成内置的几何体,导入至V-rep中,对比的效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eajY7gxL-1592535862449)(./urdf_pics/5_pics.png)]
左边是使用URDF内置几何体的机械臂模型,右边是通过STL文件定义<collision>
和<visual >
标签属性的模型,虽然使用几何体基本可以表征机械臂的<collision>
和<visual >
标签属性,但是不太美观。所以这种方式只是一种尝试。
PS: V-rep在windows下的URDF中设置<mesh>
属性时路径的设置问题:需要使用绝对路径,示例:
<link name="right_leg">
<visual>
<geometry>
<mesh filename="c://users//Srn//Desktop//w1.stl"/>
</geometry>
<material name="blue"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
</visual>
</link>
4.4 urdf相关知识
- ABB公司常用机械臂资料
- 机械臂URDF模型:https://github.com/ros-industrial/abb
- 更全的URDF模型:https://github.com/ros-industrial/abb_experimental
- 不同机械臂型号:https://new.abb.com/products/robotics/zh/industrial-robots
- 小知识点
- urdf中模型位姿默认是竖直向上,旋转和平移变换时都是先旋转再平移
- urdf中的
box,cylinder,sphere
默认的<origin>
是其几何中心 - urdf中对导入的mesh进行缩放的写法是:
<mesh filename="package://dual_arm/meshes/xjt/collision/base_link.stl" scale="0.1 0.1 0.1"/>
- meshlab软件可用来查看3D结构,实现stl和dea文件的转换。
- 导入模型中包含dea或stl等3维模型,如果3D模型较大,导入时就会很慢甚至程序卡死。
- URDF坐标系定义、V-rep坐标系定义以及D-H参数坐标系定义都存在差异,注意这个点的一些坑。
- 其他相关
- 常用物体3D模型和URDF文件:http://www.ycbbenchmarks.org/
5.其他的一些尝试
5.1 通过修改D-H参数来达到快速调整机械臂机械臂结构的需求
D-H参数是表征机械臂机械结构的参数,通过修改D-H参数的确可以表征不同结构的机械臂,但是通过修改D-H参数来达到快速调整机械臂机械臂结构的需求,这种想法在逻辑上是不太合适的,因为通常是先根据性能需求设计好机械臂,然后才能得到机械臂的D-H参数,而不是先设计好D-H参数,再生成机械臂。
不过D-H参数和URDF中的几何参数之间从原理上的确是可以相互转换的,也就是说理论上,只要知道了机械臂的D-H参数,这个机械臂的骨架结构是可以绘制出来的,但是更多的外形信息是无法知道的。从D-H参数生成机器人的URDF文件,这方面的研究在网上主要找到以下两个:
- URDF Generator for Manipulator Robot:2019年的一篇介绍从D-H参数生成URDF文件的论文
- 开源项目DH2URDF,提供了在线实现D-H参数到URDF文件的转换功能,同时提供了在线URDF文件可视化的功能,D-H参数生成URDF的界面:
5.2 通过D-H参数快速导入机械臂模型至V-rep中
该部分内容请看博客通过D-H参数快速导入机械臂模型至V-rep中
------The End------------
写在最后,本篇博客主要是记录自己在将机器人3维模型导入至V-rep仿真软件过程中的各种尝试,由于是各种尝试,所以内容会看起比较杂乱,因为这篇博客并不是所谓的教程,只是一篇笔记。此外,以上所有内容主要是讲如何导入模型至V-rep中,而想要使用导入的模型进行仿真,还需要对导入的模型进行相关属性的设置,包括各种仿真参数的设置等等,以及一些控制脚本的编写等,这些之后有时间再去写。欢迎针对博客中的内容进行交流~
模型导入V-rep后的后续处理
参考博客:
- https://blog.csdn.net/weixin_34378045/article/details/85881945
- https://blog.csdn.net/weixin_34218579/article/details/85882238
-
形状的设置问题
导入后模型默认为Compound convex shapes:
这种形状不适合快速进行动力学仿真,可以通过[Menu bar --> Edit -->Morph Selection into convex shapes]
将其转化为convex shapes来提高仿真计算速度。
如果是符合形状,可以使用[Menu bar --> Edit -->Morph Selection into its convex decomposition shapes]
将其转化为Compound convex shape来提高仿真计算速度。
不同形状的速度参考官方文档。
将原始形状可以作为visual层用于可视化,将生成的convex形状用于动力学仿真,并可以隐藏。通常将用于动力学仿真的convex形状的dynamic属性先设置为Body is respondable
,但Body is dynamic
先不勾选,在需要动力学仿真时再勾选。
注意: 用于可视化的形状和用于动力学仿真的convex形状在文件结构上属于同一层,且convex形状通常是父节点。 -
设置response形状的属性为dynamic,并且把基座设置为"Set to dynamic if gets parent"