我感觉大多数用moveit做机械臂控制的,在一开始,都是控制一个光杆机械臂,但是随着自己对ros和moveit学习的深入,会发现只控制一个光杆机械臂好像没什么意思嘛。最起码要给自己的机械臂加一个夹爪让他做一个抓取和放置的操作吧。好,有需求那么接下来就有问题了。我的这个夹爪的结构应该是什么样子?我有了夹爪结构我该怎么加到机原来械臂上去?原来的机械臂URDF模型我已经做了无数修改了,我该怎么在保留这些设置的基础上,把我的夹爪装上去。接下来就从这两个问题出发,分享一下我解决问题的过程。
1、我的夹爪结构应该是什么样子的?
这里如果熟悉SW等绘图软件的,大家可以根据自己要抓取物体的形状自己画一个夹爪,如果就是想演示一下,那么给大家推荐一个叫机械图纸狗的公众号,里面又非常多的优秀图纸,去挑挑选选,总有一款适合你。
2、我有了夹爪结构我该怎么加到机原来械臂上去?
这里有两种解决办法,一种是你可以直接在sw内做好装配体,然后用swurdf插件生成完整的机械臂+夹爪的URDF文件,这种方式只适合从零开始做机械臂控制的。已经做过一段时间的光杆机械臂控制的兄弟肯定会有这个顾虑,就是一路控制过来,对原来的机械臂URDF 模型已经不知道做了多少修改,重新生成,将会带来一大堆问题。为了个夹爪,付出这么大的工作量肯定不划算。所以,第二种方式更适合这种情况。那就是单独生成夹爪的URDF模型。
第一步在sw中生成夹爪的urdf模型,能用到这种方法的兄弟肯定这都不陌生了,就不在此赘述了
第二步拿到生成的URDF文件,这是我的j夹爪urdf模型,这里记得掐头去尾。把<robot
name="finger">到</robot>之间的全部内容复制,然后找到自己原来的机械臂URDF文件,找到自己的模型的最后一个link,将刚才复制的内容全部复制他的后面。
<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com)
Commit Version: 1.5.1-0-g916b5db Build Version: 1.5.7152.31018
For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
<robot
name="finger">
<link
name="finger_base">
<inertial>
<origin
xyz="-6.35771586765532E-09 0.000115405302952606 -0.0246430464114306"
rpy="0 0 0" />
<mass
value="0.0633572386878576" />
<inertia
ixx="2.16498106909931E-05"
ixy="-4.42610892567155E-13"
ixz="-2.16945723545907E-14"
iyy="2.17602534542266E-05"
iyz="3.14411702751438E-08"
izz="4.20656899912343E-05" />
</inertial>
<visual>
<origin
xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="package://finger/meshes/finger_base.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_base.STL" />
</geometry>
</collision>
</link>
<link
name="finger_1">
<inertial>
<origin
xyz="0.0051124 0.051489 -0.0084464"
rpy="0 0 0" />
<mass
value="0.0084416" />
<inertia
ixx="1.5817E-06"
ixy="-2.3593E-07"
ixz="-5.438E-13"
iyy="3.5578E-07"
iyz="-6.4675E-11"
izz="1.474E-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_1.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_1.STL" />
</geometry>
</collision>
</link>
<joint
name="finger_joint_1"
type="revolute">
<origin
xyz="-0.0084 -0.027341 -0.051905"
rpy="-1.5708 0 1.5708" />
<parent
link="finger_base" />
<child
link="finger_1" />
<axis
xyz="0 0 -1" />
<limit
lower="-3.14"
upper="3.14"
effort="0"
velocity="0" />
</joint>
<link
name="finger_2">
<inertial>
<origin
xyz="-0.013757 0.04988 -0.0084464"
rpy="0 0 0" />
<mass
value="0.0084416" />
<inertia
ixx="1.5814E-06"
ixy="2.3673E-07"
ixz="2.2795E-11"
iyy="3.5609E-07"
iyz="-6.0454E-11"
izz="1.474E-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_2.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_2.STL" />
</geometry>
</collision>
</link>
<joint
name="finger_joint_2"
type="revolute">
<origin
xyz="0.027885 0.0063046 -0.051905"
rpy="-1.5708 0 -2.618" />
<parent
link="finger_base" />
<child
link="finger_2" />
<axis
xyz="0 0 -1" />
<limit
lower="-3.14"
upper="3.14"
effort="0"
velocity="0" />
</joint>
<link
name="finger_3">
<inertial>
<origin
xyz="-0.0061103 0.051381 -0.0084136"
rpy="0 0 0" />
<mass
value="0.0084416" />
<inertia
ixx="1.5721E-06"
ixy="2.5953E-07"
ixz="-1.7953E-12"
iyy="3.654E-07"
iyz="6.4629E-11"
izz="1.474E-06" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_3.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://finger/meshes/finger_3.STL" />
</geometry>
</collision>
</link>
<joint
name="finger_joint_3"
type="revolute">
<origin
xyz="-0.027885 0.0063046 -0.051905"
rpy="-1.5708 0 2.618" />
<parent
link="finger_base" />
<child
link="finger_3" />
<axis
xyz="0 0 1" />
<limit
lower="-3.14"
upper="3.14"
effort="0"
velocity="0" />
</joint>
</robot>
然后再自己夹爪的第一个link后,添加一个夹爪和机械臂最后一个link的关节,夹爪肯定是固定再最后一个link上的,所以添加的内容为:
<joint name="fixed_1" type="fixed">
<origin xyz="0 0.0115 0" rpy="1.5708 0 0" />
<parent link="link_5" />
<child link="finger_base" />
</joint>
如果夹爪位置不对,就微调origin后面的参数,一点一点试一下。到这里,urdf文件的拼接就算完成了,但是有个细节 ,记得把夹爪meshe文件内的stl文件复制到机械臂urdf模型内的meshes文件内,并对上述文件中的路径进行修改。否则夹爪的模型加载的时候会出错。
3、根据新的模型文件用moveit_setupassistant进行配置
这里和之前得区别就是增加一个规划组添加控制器 添加end effectors,我设置的是增加一个新的finger规划组。
添加end effectors,这里end effectors name 可以自定义,end effectors group选择自己刚才设定的规划组。end effectors parent选择机械臂的最后一个link及安装夹爪的link,parent group不用选。
最后添加控制器,就按照下面这种方式添加即可。
最后再gazbeo和rviz中验证自己的添加的夹爪是否能正常工作。如果moveit控制gazbeo中的夹爪出现问题,请参照我上一篇博文解决。我终于实现Moveit+gazbeo对机械臂的联合仿真控制了