一种ROS机械臂末端执行器:vacuum真空吸盘的使用教程

2249
10
2020年6月28日 12时36分

说明

  机械臂末端执行器的种类很多,目前针对目标抓取最常使用的末端执行器就是夹抓和真空吸盘式。但是在gazebo仿真中,需要对抓取目标模型进行摩擦等物理属性进行设置,同时对机械臂的碰撞检测也需要进行一个调整,这个过程对与不熟悉ros仿真和gazebo模型设置的人来说是比较痛苦的,因此,我在本文介绍一种在工业上也经常使用的vacuum。

 

gazebo ur5

 

不了解vacuum的可以看一下这个视频,在这个ur5机械臂上安装了9组vacuum,对传送带上的目标进行抓取。

 

安装vacuum

  是的,在配置好ros和gazebo插件后,就不需要单独再去安装vacuum!
  vacuum已经集成在了gazebo的插件中,名称叫做:libgazebo_ros_vacuum_gripper.so。需要使用就在xacro模型文件中直接调用即可。

调用代码

  在你的机械臂的xacro模型文件中,像增加link和joint一样的方式使用:

 <link name="vacuum_gripper">
      <gravity>0</gravity>
      <visual>
        <origin rpy="0 0 0" xyz="0 0 0"/>
        <geometry>
          <cylinder radius="0.005" length="0.01"/>
        </geometry>
        <material name="transparent">
          <color rgba="0 0 0 0"/>
        </material>
      </visual>
      <inertial>
        <origin rpy="0 0 0" xyz="0.000000 0.000000 0.000000"/>
        <mass value="0.0001"/>
        <inertia ixx="1e-08" ixy="0" ixz="0" iyy="1e-08" iyz="0" izz="1e-08"/>
      </inertial>
    </link>

    <joint name="gripper_joint" type="revolute">
      <axis xyz="1 0 0" />
      <parent link="link6" />
      <child link="vacuum_gripper" />
      <origin rpy="0 1.5708 0" xyz="${vac_x} 0.0125 0" />
      <limit effort="50" velocity="50" lower="0" upper="0" />
      <dynamics damping="0.0" friction="10"/>
    </joint>

  <gazebo>
      <plugin name="gazebo_ros_vacuum_gripper" filename="libgazebo_ros_vacuum_gripper.so">
        <robotNamespace>/arm/vacuum_gripper</robotNamespace>
        <bodyName>vacuum_gripper</bodyName>
        <topicName>grasping</topicName>
        <maxForce>50</maxForce>
        <maxDistance>0.05</maxDistance>
        <minDistance>0.01</minDistance>
      </plugin>
  </gazebo>

  首先建立一个叫做vacuum_gripper的link,link_name是这个vacuum的名字,你可以在一个末端中增加多个vacuum的link,这样可以提升吸附能力。
  parent link是机械臂最后一个关节的名字,然后通过xyzrpy确定这个vacuum的位置。
  在plugin标签中,主要设置的话题名称是grasping,这个话题中包含了工作状态信息:on/off。
 随后,再设置对应的gazbeo参数:

<gazebo reference="vacuum_gripper">
            <mu1>50</mu1>
            <mu2>50</mu2>
       <minDepth>0.003</minDepth>
            <maxVel>0</maxVel>
            <kp>1000000.0</kp>
            <kd>1.0</kd>
            <material>Gazebo/Grey</material>
</gazebo>

  在这设置了vacuum在gazebo仿真中的一些物理属性,这些数值是我自己给出的,不一定是最佳设置,大家参考即可,因为这部分确实不是很好调,如果有人有好的方法,请在评论中赐教。
  这时候,对一个vacuum在模型文件中的全部设置就已经完成了。

gazebo界面

使用方法

  完成以上模型文件的设置,仅仅是将vacuum安装到了机械臂末端上,此时vacuum处于off状态,并不能进行抓取,还需要配置两个文件,一个是vacuum_control.py和一个发送开关指令的vacuum_switch.py。
  其中vacuum_control.py是订阅开关程序发布的指令然后去控制vacuum的on/off:

#!/usr/bin/env python
import rospy, sys, numpy as np
import geometry_msgs.msg
import moveit_msgs.msg
from ur5_notebook.msg import Tracker
from std_msgs.msg import Header
from std_msgs.msg import Bool
from std_srvs.srv import Empty
def gripper_status(msg):
    if msg.data:
        return True
        # print('gripper status = {}'.format(msg.data))
def gripper_on():
    # Wait till the srv is available
    rospy.wait_for_service('/arm/vacuum_gripper/on')
    try:
        # Create a handle for the calling the srv
        turn_on = rospy.ServiceProxy('/arm/vacuum_gripper/on', Empty)
        # Use this handle just like a normal function and call it
        resp = turn_on()
        return resp
    except rospy.ServiceException, e:
        print "Service call failed: %s" % e
def gripper_off():
    rospy.wait_for_service('/arm/vacuum_gripper/off')
    try:
        turn_off = rospy.ServiceProxy('/arm/vacuum_gripper/off', Empty)
        resp = turn_off()
        return resp
    except rospy.ServiceException, e:
        print "Service call failed: %s" % e
def trigger(msg):
    gripper_trigger = msg.flag2
    if gripper_trigger:
        gripper_on()
  else:
        gripper_off()
rospy.init_node("arm_gripper", anonymous=False)
gripper_status_sub = rospy.Subscriber('/arm/vacuum_gripper/grasping', Bool, gripper_status, queue_size=1)
cxy_sub = rospy.Subscriber('switch', Tracker, trigger, queue_size=1)
rospy.spin()

  代码很简单,我就不带着大家读了。
 接下来是发布开关的程序,思想就是根据控制程序中需要订阅的话题去编写一个发布器,将这个话题在你需要的时候发布一个布尔型变量即可,每个人的on/off条件不同,所以我给出发布器的部分程序:

def talker():
    track = rospy.Publisher('switch', Tracker, queue_size=1)
    rospy.init_node('vacuum_control',anonymous=True)   
    r = rospy.Rate(10) 
    while not rospy.is_shutdown():   
        tracker.flag2 = 1
        track.publish(tracker)
        r.sleep()
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:pass

这部分程序是发布了一个值为true的话题,这用控制程序订阅后,就会启动vacuum。
当然,想关闭vacuum,就设置tracker.flag2 = 0 即可。

效果展示

  最后,结合之前的教程,在实现二维码跟踪的基础上,加入了vacuum末端,跟踪到二维码后,再对其进行一个抓取实验,可以看到视频中我多次调整机械臂的位置,令其在一个合理的位置进行吸附。

抓取测试

 

发表评论

后才能评论

评论列表(10条)

  • 布剪刀石头 2020年7月20日 上午10:59

    您好,请教下这个流水线是怎么做的呢?

  • 古月光翟氵青 2020年7月16日 下午10:30

    大神您好,请问ur5_notebook这个库是怎么安装的?我这里一直提示无法找到这个库

  • 古月光翟氵青 2020年7月7日 下午5:02

    博主您好,我也用了9个吸盘,Gazebo plugin要配置9个吗?还是只要配置一个就可以了?我是北京某高校自动化硕士,研究课题是在仿真环境中实现移动抓取机器人,希望向大神请教些问题,如果您愿意赐教的话,希望和您取得联系,我的VX号: h1259222635

  • 古月光翟氵青 2020年7月2日 下午10:36

    博主您好,请问这里加入的吸盘是一个小圆柱体吗?我按照您的代码,在我的机械臂的xacro模型文件中,末端加入了吸盘部分,发现方向不对,但我改成之后,方向好像对了,可能是我们的坐标系设置的不太一样。

    • 神秘老铁 回复 古月光翟氵青 2020年7月3日 下午4:21

      是的 都是小圆柱体 我的坐标系是根据动力学计算设置的 所以跟正常的不太一样

  • 古月光翟氵青 2020年7月2日 下午9:24

    大神您好,ur5机械臂使用vacuum对传送带上的目标进行抓取,Github链接可以提供一下吗?谢谢大佬!效果很好,做的很不错!

  • 走在路上 2020年6月29日 下午9:13

    古月老师,能请教force_torque_sensor_controller这个插件是如何使用的,需要在urdf中编辑吗

  • 神秘老铁 2020年6月28日 下午4:18

    欢迎对gazebo模型中摩擦及碰撞检测有经验的研究者提供宝贵的经验