UR5机械臂仿真实例(三)1 末端添加robotiq夹爪 [ubuntu20.04+ROSnoetic+gazebo11]

【ur5机械臂末端添加robotiq 2f 85夹爪】

分别给出以下场景的实现过程:

一、实现rviz中ur5与robotiq85的连接和控制【本文】

二、实现gazebo中ur5与robotiq85的连接和控制

三、Moveit配置实现rivz与gazebo的联合控制

一、实现rviz中ur5与robotiq85的连接和控制(新版本)

(一)功能包下载

创建工作空间,下载好ur机械臂和robotiq夹爪相关工具包。

ur:

cd ~/catkin_ws/
git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git src/Universal_Robots_ROS_Driver
git clone -b calibration_devel https://github.com/fmauch/universal_robot.git src/fmauch_universal_robot
git clone https://github.com/ros-industrial/ur_msgs.git src/ur_msgs
rosdep update
rosdep install --from-paths src --ignore-src -y
catkin_make

 robotiq:由于ros-industrial官方的包有些问题,所以使用如下链接

cd ~/catkin_ws
git clone https://github.com/jr-robotics/robotiq.git src/robotiq
catkin_make

(二)launch文件

rviz的启动文件为fmauch_universal_robot/ur_description/launch/view_ur5.launch,内容如下:

<?xml version="1.0"?>
<launch>
  <include file="$(find ur_description)/launch/load_ur5.launch"/>

  <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find ur_description)/cfg/view_robot.rviz" required="true" />
</launch>

load_ur5.launch:加载模型。将robot_description加载到参数服务器,我们需要修改的模型文件为:load_ur5.launch—>load_ur.launch—>ur_description/urdf/ur.xacro。

joint_state_publisher_gui:发布关节状态、通过gui控制关节角度。拖动gui滑块可以控制rviz中的机械臂关节角度。

robot_state_publisher:发布机器人状态。

rviz:启动rviz。

(三)修改ur.xacro

 ur_description/urdf/ur.xacro中添加以下两处代码。

<!--继承robotiq_arg2f_85宏-->
<xacro:include filename="$(find robotiq_2f_85_gripper_visualization)/urdf/robotiq_arg2f_85_macro.xacro"/>
<!--定义fixed关节,将robotiq_arg2f_base_link连接到机械臂末端的tool0-->
<joint name="ur_robotiq_joint" type="fixed">
  <parent link="tool0"/>
  <child link="robotiq_arg2f_base_link"/>
  <origin xyz="0 0 0" rpy="0 0 0"/>
</joint>

<!--调用robotiq_arg2f_85,加入夹爪的link和joint-->
<xacro:robotiq_arg2f_85
  prefix=""
  transmission_hw_interface="$(arg transmission_hw_interface)"
/>

打开robotiq_2f_85_gripper_visualization/urdf/robotiq_arg2f_85_macro.xacro,将第200行左右这段代码注释掉。如果单独仿真夹爪,要将其取消注释。

<!-- base link -->
<!-- <link name="${prefix}base_link"/> -->
<!-- <joint name="${prefix}base_link-${prefix}robotiq_arg2f_base_link" type="fixed"> -->
  <!-- <parent link="${prefix}base_link" /> -->
  <!-- <child link="${prefix}robotiq_arg2f_base_link" /> -->
<!-- </joint> -->

(四)启动

cd ~/catkin_ws/
catkin_make
source devel/setup.bash
roslaunch ur_description view_ur5.launch

 rviz启动, 机械臂成功添加夹爪,拖动gui中的滑动条,可以实现机械臂关节和夹爪的控制。

———————————以上为更新的新版本,直接继承robotiq宏———————————

———————————以下为旧版本,继承robotiq宏失败的改法———————————

(保留旧版本,因为旧版本对各个嵌套写的比较详细,有助于理解代码结构和语句)

一、实现rviz中ur5与robotiq85的连接和控制

(一)功能包下载

创建工作空间,下载好ur机械臂和robotiq夹爪相关工具包。

ur:

cd ~/catkin_ws/
git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git src/Universal_Robots_ROS_Driver
git clone -b calibration_devel https://github.com/fmauch/universal_robot.git src/fmauch_universal_robot
git clone https://github.com/ros-industrial/ur_msgs.git src/ur_msgs
rosdep update
rosdep install --from-paths src --ignore-src -y
catkin_make

 robotiq:由于ros-industrial官方的包有些问题,所以使用如下链接

cd ~/catkin_ws
git clone https://github.com/jr-robotics/robotiq.git src/robotiq
catkin_make

(二)修改urdf

我们需要修改的urdf文件所在路径为src/fmauch_universal_robot/ur_description/urdf。

PART1

按照嵌套顺序从外向里,将.xacro文件复制和重命名:(1)ur5.xacro改为ur5_gripper.xacro,(2)inc/ur5_macro.xacro改为inc/ur5_gripper_macro.xacro,(3)inc/ur_macro.xacro改为inc/ur_gripper_macro.xacro。按照嵌套顺序从里向外,分别修改三个文件:

1. ur_gripper_macro.xacro
因为我直接继承robotiq的宏一直失败,所以直接将机械臂和夹爪的结构拼成一个文件,即ur_gripper_macro.xacro。

打开robotiq/robotiq_2f_85_gripper_visualization/urdf/robotiq_arg2f_85_macro.xacro,复制include添加至文件,添加后include为

<xacro:include filename="$(find ur_description)/urdf/inc/ur_transmissions.xacro" />
<xacro:include filename="$(find ur_description)/urdf/inc/ur_common.xacro" />
<xacro:include filename="$(find robotiq_2f_85_gripper_visualization)/urdf/inc/robotiq_arg2f_85_transmissions.xacro" />

将宏命名修改为“ur_gripper_robot”

<xacro:macro name="ur_gripper_robot" params="
  prefix
  joint_limits_parameters_file
  kinematics_parameters_file
  physical_parameters_file
  visual_parameters_file
  transmission_hw_interface:=hardware_interface/PositionJointInterface
  safety_limits:=false
  safety_pos_margin:=0.15
  safety_k_position:=20"
>

复制Add URDF transmission elements,添加后transmission为

<!-- Add URDF transmission elements (for ros_control) -->
<xacro:ur_arm_transmission prefix="${prefix}" hw_interface="${transmission_hw_interface}" />
<xacro:robotiq_arg2f_85_transmission prefix="${prefix}" hw_interface="${transmission_hw_interface}"/>

复制从<!-- fingers links macros -->到倒数第三行,添加后模型为

<!-- links: main serial chain -->
<link name="${prefix}base_link"/>
<link name="${prefix}base_link_inertia">
...
<!-- ROS-Industrial 'tool0' frame: all-zeros tool frame -->
  <link name="${prefix}tool0"/>
  <joint name="${prefix}flange-tool0" type="fixed">
  <!-- default toolframe: X+ left, Y+ up, Z+ front -->
  <origin xyz="0 0 0" rpy="${pi/2.0} 0 ${pi/2.0}"/>
  <parent link="${prefix}flange"/>
  <child link="${prefix}tool0"/>
</joint>




<!-- fingers links macros -->
<xacro:macro name="outer_knuckle" params="prefix fingerprefix">
  <link name="${prefix}${fingerprefix}_outer_knuckle">
...
<!-- right finger -->
<xacro:finger_joints prefix="${prefix}" fingerprefix="right" reflect="-1.0"/>
<xacro:finger_links prefix="${prefix}" fingerprefix="right"/>
  <joint name="${prefix}right_finger_joint" type="revolute">
    <origin xyz="0 0.0306011 0.054904" rpy="0 0 0"/>
    <parent link="${prefix}robotiq_arg2f_base_link" />
    <child link="${prefix}right_outer_knuckle" />
    <axis xyz="1 0 0" />
    <limit lower="0" upper="0.81" velocity="0.5" effort="1000" />
    <mimic joint="${prefix}finger_joint" multiplier="1" offset="0" />
  </joint>

最后ur_gripper_macro.xacro(超长代码警告)文件为

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">
  <!--
    Base UR robot series xacro macro.

    NOTE: this is NOT a URDF. It cannot directly be loaded by consumers
    expecting a flattened '.urdf' file. See the top-level '.xacro' for that
    (but note: that .xacro must still be processed by the xacro command).

    For use in '.launch' files: use one of the 'load_urX.launch' convenience
    launch files.

    This file models the base kinematic chain of a UR robot, which then gets
    parameterised by various configuration files to convert it into a UR3(e),
    UR5(e), UR10(e) or UR16e.

    NOTE: the default kinematic parameters (ie: link lengths, frame locations,
    offets, etc) do not correspond to any particular robot. They are defaults
    only. There WILL be non-zero offsets between the Forward Kinematics results
    in TF (ie: robot_state_publisher) and the values reported by the Teach
    Pendant.

    For accurate (and robot-specific) transforms, the 'kinematics_parameters_file'
    parameter MUST point to a .yaml file containing the appropriate values for
    the targetted robot.

    If using the UniversalRobots/Universal_Robots_ROS_Driver, follow the steps
    described in the readme of that repository to extract the kinematic
    calibration from the controller and generate the required .yaml file.

    Main author of the migration to yaml configs: Ludovic Delval.

    Contributors to previous versions (in no particular order):

     - Felix Messmer
     - Kelsey Hawkins
     - Wim Meeussen
     - Shaun Edwards
     - Nadia Hammoudeh Garcia
     - Dave Hershberger
     - G. vd. Hoorn
     - Philip Long
     - Dave Coleman
     - Miguel Prada
     - Mathias Luedtke
     - Marcel Schnirring
     - Felix von Drigalski
     - Felix Exner
     - Jimmy Da Silva
     - Ajit Krisshna N L
     - Muhammad Asif Rana
  -->

  <xacro:include filename="$(find ur_description)/urdf/inc/ur_transmissions.xacro" />
  <xacro:include filename="$(find ur_description)/urdf/inc/ur_common.xacro" />
  <xacro:include filename="$(find robotiq_2f_85_gripper_visualization)/urdf/inc/robotiq_arg2f_85_transmissions.xacro" />

  <xacro:macro name="ur_gripper_robot" params="
    prefix
    joint_limits_parameters_file
    kinematics_parameters_file
    physical_parameters_file
    visual_parameters_file
    transmission_hw_interface:=hardware_interface/PositionJointInterface
    safety_limits:=false
    safety_pos_margin:=0.15
    safety_k_position:=20"
  >
    <!-- Load configuration data from the provided .yaml files -->
    <xacro:read_model_data
      joint_limits_parameters_file="${joint_limits_parameters_file}" 
      kinematics_parameters_file="${kinematics_parameters_file}"
      physical_parameters_file="${physical_parameters_file}"
      visual_parameters_file="${visual_parameters_file}"/>

    <!-- Add URDF transmission elements (for ros_control) -->
    <xacro:ur_arm_transmission prefix="${prefix}" hw_interface="${transmission_hw_interface}" />
    <xacro:robotiq_arg2f_85_transmission prefix="${prefix}" hw_interface="${transmission_hw_interface}"/>

    <!-- links: main serial chain -->
    <link name="${prefix}base_link"/>
    <link name="${prefix}base_link_inertia">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
        <geometry>
          <mesh filename="${base_visual_mesh}"/>
        </geometry>
        <material name="${base_visual_material_name}">
          <color rgba="${base_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
        <geometry>
          <mesh filename="${base_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${base_inertia_radius}" length="${base_inertia_length}" mass="${base_mass}">
        <origin xyz="0 0 0" rpy="0 0 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}shoulder_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
        <geometry>
          <mesh filename="${shoulder_visual_mesh}"/>
        </geometry>
        <material name="${shoulder_visual_material_name}">
          <color rgba="${shoulder_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
        <geometry>
          <mesh filename="${shoulder_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${shoulder_inertia_radius}" length="${shoulder_inertia_length}" mass="${shoulder_mass}">
        <origin xyz="0 0 0" rpy="0 0 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}upper_arm_link">
      <visual>
        <origin xyz="0 0 ${shoulder_offset}" rpy="${pi/2} 0 ${-pi/2}"/>
        <geometry>
          <mesh filename="${upper_arm_visual_mesh}"/>
        </geometry>
        <material name="${upper_arm_visual_material_name}">
          <color rgba="${upper_arm_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${shoulder_offset}" rpy="${pi/2} 0 ${-pi/2}"/>
        <geometry>
          <mesh filename="${upper_arm_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${upperarm_inertia_radius}" length="${upperarm_inertia_length}" mass="${upper_arm_mass}">
        <origin xyz="${-0.5 * upperarm_inertia_length} 0.0 ${upper_arm_inertia_offset}" rpy="0 ${pi/2} 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}forearm_link">
      <visual>
        <origin xyz="0 0 ${elbow_offset}" rpy="${pi/2} 0 ${-pi/2}"/>
        <geometry>
          <mesh filename="${forearm_visual_mesh}"/>
        </geometry>
        <material name="${forearm_visual_material_name}">
          <color rgba="${forearm_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${elbow_offset}" rpy="${pi/2} 0 ${-pi/2}"/>
        <geometry>
          <mesh filename="${forearm_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${forearm_inertia_radius}" length="${forearm_inertia_length}"  mass="${forearm_mass}">
        <origin xyz="${-0.5 * forearm_inertia_length} 0.0 ${elbow_offset}" rpy="0 ${pi/2} 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}wrist_1_link">
      <visual>
        <!-- TODO: Move this to a parameter -->
        <origin xyz="0 0 ${wrist_1_visual_offset}" rpy="${pi/2} 0 0"/>
        <geometry>
          <mesh filename="${wrist_1_visual_mesh}"/>
        </geometry>
        <material name="${wrist_1_visual_material_name}">
          <color rgba="${wrist_1_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${wrist_1_visual_offset}" rpy="${pi/2} 0 0"/>
        <geometry>
          <mesh filename="${wrist_1_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${wrist_1_inertia_radius}" length="${wrist_1_inertia_length}"  mass="${wrist_1_mass}">
        <origin xyz="0 0 0" rpy="0 0 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}wrist_2_link">
      <visual>
        <origin xyz="0 0 ${wrist_2_visual_offset}" rpy="0 0 0"/>
        <geometry>
          <mesh filename="${wrist_2_visual_mesh}"/>
        </geometry>
        <material name="${wrist_2_visual_material_name}">
          <color rgba="${wrist_2_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${wrist_2_visual_offset}" rpy="0 0 0"/>
        <geometry>
          <mesh filename="${wrist_2_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${wrist_2_inertia_radius}" length="${wrist_2_inertia_length}"  mass="${wrist_2_mass}">
        <origin xyz="0 0 0" rpy="0 0 0" />
      </xacro:cylinder_inertial>
    </link>
    <link name="${prefix}wrist_3_link">
      <visual>
        <origin xyz="0 0 ${wrist_3_visual_offset}" rpy="${pi/2} 0 0"/>
        <geometry>
          <mesh filename="${wrist_3_visual_mesh}"/>
        </geometry>
        <material name="${wrist_3_visual_material_name}">
          <color rgba="${wrist_3_visual_material_color}"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${wrist_3_visual_offset}" rpy="${pi/2} 0 0"/>
        <geometry>
          <mesh filename="${wrist_3_collision_mesh}"/>
        </geometry>
      </collision>
      <xacro:cylinder_inertial radius="${wrist_3_inertia_radius}" length="${wrist_3_inertia_length}"  mass="${wrist_3_mass}">
        <origin xyz="0.0 0.0 ${-0.5 * wrist_3_inertia_length}" rpy="0 0 0" />
      </xacro:cylinder_inertial>
    </link>

    <!-- joints: main serial chain -->
    <joint name="${prefix}base_link-base_link_inertia" type="fixed">
      <parent link="${prefix}base_link" />
      <child link="${prefix}base_link_inertia" />
      <!-- 'base_link' is REP-103 aligned (so X+ forward), while the internal
           frames of the robot/controller have X+ pointing backwards.
           Use the joint between 'base_link' and 'base_link_inertia' (a dummy
           link/frame) to introduce the necessary rotation over Z (of pi rad).
      -->
      <origin xyz="0 0 0" rpy="0 0 ${pi}" />
    </joint>
    <joint name="${prefix}shoulder_pan_joint" type="revolute">
      <parent link="${prefix}base_link_inertia" />
      <child link="${prefix}shoulder_link" />
      <origin xyz="${shoulder_x} ${shoulder_y} ${shoulder_z}" rpy="${shoulder_roll} ${shoulder_pitch} ${shoulder_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${shoulder_pan_lower_limit}" upper="${shoulder_pan_upper_limit}"
        effort="${shoulder_pan_effort_limit}" velocity="${shoulder_pan_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${shoulder_pan_lower_limit + safety_pos_margin}" soft_upper_limit="${shoulder_pan_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>
    <joint name="${prefix}shoulder_lift_joint" type="revolute">
      <parent link="${prefix}shoulder_link" />
      <child link="${prefix}upper_arm_link" />
      <origin xyz="${upper_arm_x} ${upper_arm_y} ${upper_arm_z}" rpy="${upper_arm_roll} ${upper_arm_pitch} ${upper_arm_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${shoulder_lift_lower_limit}" upper="${shoulder_lift_upper_limit}"
        effort="${shoulder_lift_effort_limit}" velocity="${shoulder_lift_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${shoulder_lift_lower_limit + safety_pos_margin}" soft_upper_limit="${shoulder_lift_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>
    <joint name="${prefix}elbow_joint" type="revolute">
      <parent link="${prefix}upper_arm_link" />
      <child link="${prefix}forearm_link" />
      <origin xyz="${forearm_x} ${forearm_y} ${forearm_z}" rpy="${forearm_roll} ${forearm_pitch} ${forearm_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${elbow_joint_lower_limit}" upper="${elbow_joint_upper_limit}"
        effort="${elbow_joint_effort_limit}" velocity="${elbow_joint_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${elbow_joint_lower_limit + safety_pos_margin}" soft_upper_limit="${elbow_joint_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>
    <joint name="${prefix}wrist_1_joint" type="revolute">
      <parent link="${prefix}forearm_link" />
      <child link="${prefix}wrist_1_link" />
      <origin xyz="${wrist_1_x} ${wrist_1_y} ${wrist_1_z}" rpy="${wrist_1_roll} ${wrist_1_pitch} ${wrist_1_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${wrist_1_lower_limit}" upper="${wrist_1_upper_limit}"
        effort="${wrist_1_effort_limit}" velocity="${wrist_1_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${wrist_1_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_1_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>
    <joint name="${prefix}wrist_2_joint" type="revolute">
      <parent link="${prefix}wrist_1_link" />
      <child link="${prefix}wrist_2_link" />
      <origin xyz="${wrist_2_x} ${wrist_2_y} ${wrist_2_z}" rpy="${wrist_2_roll} ${wrist_2_pitch} ${wrist_2_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${wrist_2_lower_limit}" upper="${wrist_2_upper_limit}"
             effort="${wrist_2_effort_limit}" velocity="${wrist_2_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${wrist_2_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_2_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>
    <joint name="${prefix}wrist_3_joint" type="revolute">
      <parent link="${prefix}wrist_2_link" />
      <child link="${prefix}wrist_3_link" />
      <origin xyz="${wrist_3_x} ${wrist_3_y} ${wrist_3_z}" rpy="${wrist_3_roll} ${wrist_3_pitch} ${wrist_3_yaw}" />
      <axis xyz="0 0 1" />
      <limit lower="${wrist_3_lower_limit}" upper="${wrist_3_upper_limit}"
             effort="${wrist_3_effort_limit}" velocity="${wrist_3_velocity_limit}"/>
      <xacro:if value="${safety_limits}">
         <safety_controller soft_lower_limit="${wrist_3_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_3_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
      </xacro:if>
      <dynamics damping="0" friction="0"/>
    </joint>

    <!-- ROS-Industrial 'base' frame: base_link to UR 'Base' Coordinates transform -->
    <link name="${prefix}base"/>
    <joint name="${prefix}base_link-base_fixed_joint" type="fixed">
      <!-- Note the rotation over Z of pi radians: as base_link is REP-103
           aligned (ie: has X+ forward, Y+ left and Z+ up), this is needed
           to correctly align 'base' with the 'Base' coordinate system of
           the UR controller.
      -->
      <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
      <parent link="${prefix}base_link"/>
      <child link="${prefix}base"/>
    </joint>

    <!-- ROS-Industrial 'flange' frame: attachment point for EEF models -->
    <link name="${prefix}flange" />
    <joint name="${prefix}wrist_3-flange" type="fixed">
      <parent link="${prefix}wrist_3_link" />
      <child link="${prefix}flange" />
      <origin xyz="0 0 0" rpy="0 ${-pi/2.0} ${-pi/2.0}" />
    </joint>

    <!-- ROS-Industrial 'tool0' frame: all-zeros tool frame -->
    <link name="${prefix}tool0"/>
    <joint name="${prefix}flange-tool0" type="fixed">
      <!-- default toolframe: X+ left, Y+ up, Z+ front -->
      <origin xyz="0 0 0" rpy="${pi/2.0} 0 ${pi/2.0}"/>
      <parent link="${prefix}flange"/>
      <child link="${prefix}tool0"/>
    </joint>






    <!-- fingers links macros -->
    <xacro:macro name="outer_knuckle" params="prefix fingerprefix">
      <link name="${prefix}${fingerprefix}_outer_knuckle">
        <inertial>
          <origin xyz="-0.000200000000003065 0.0199435877845359 0.0292245259211331" rpy="0 0 0" />
          <mass value="0.00853198276973456" />
          <inertia ixx="2.89328108496468E-06" ixy="-1.57935047237397E-19" ixz="-1.93980378593255E-19" iyy="1.86719750325683E-06" iyz="-1.21858577871576E-06" izz="1.21905238907251E-06" />
          </inertial>
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/visual/robotiq_arg2f_85_outer_knuckle.dae" scale="0.001 0.001 0.001"/>
          </geometry>
          <material name="">
            <color rgba="0.792156862745098 0.819607843137255 0.933333333333333 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/collision/robotiq_arg2f_85_outer_knuckle.dae" scale="0.001 0.001 0.001"/>
          </geometry>
        </collision>
      </link>
    </xacro:macro>

    <xacro:macro name="outer_finger" params="prefix fingerprefix">
      <link name="${prefix}${fingerprefix}_outer_finger">
        <inertial>
          <origin xyz="0.00030115855001899 0.0373907951953854 -0.0208027427000385" rpy="0 0 0" />
          <mass value="0.022614240507152" />
          <inertia ixx="1.52518312458174E-05" ixy="9.76583423954399E-10" ixz="-5.43838577022588E-10" iyy="6.17694243867776E-06" iyz="6.78636130740228E-06" izz="1.16494917907219E-05" />
          </inertial>
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/visual/robotiq_arg2f_85_outer_finger.dae" scale="0.001 0.001 0.001"/>
          </geometry>
          <material name="">
            <color rgba="0.1 0.1 0.1 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/collision/robotiq_arg2f_85_outer_finger.dae" scale="0.001 0.001 0.001"/>
          </geometry>
        </collision>
      </link>
    </xacro:macro>

    <xacro:macro name="inner_knuckle" params="prefix fingerprefix">
      <link name="${prefix}${fingerprefix}_inner_knuckle">
        <inertial>
          <origin xyz="0.000123011831763771 0.0507850843201817 0.00103968640075166" rpy="0 0 0" />
        <mass value="0.0271177346495152" />
          <inertia ixx="2.61910379223783E-05" ixy="-2.43616858946494E-07" ixz="-6.37789906117123E-09" iyy="2.8270243746167E-06" iyz="-5.37200748039765E-07" izz="2.83695868220296E-05" />
          </inertial>
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/visual/robotiq_arg2f_85_inner_knuckle.dae" scale="0.001 0.001 0.001"/>
          </geometry>
          <material name="">
            <color rgba="0.1 0.1 0.1 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/collision/robotiq_arg2f_85_inner_knuckle.dae" scale="0.001 0.001 0.001"/>
          </geometry>
        </collision>
      </link>
    </xacro:macro>

    <xacro:macro name="inner_finger" params="prefix fingerprefix">
      <link name="${prefix}${fingerprefix}_inner_finger">
        <inertial>
          <origin xyz="0.000299999999999317 0.0160078233491243 -0.0136945669206257" rpy="0 0 0" />
          <mass value="0.0104003125914103" />
          <inertia ixx="2.71909453810972E-06" ixy="1.35402465472579E-21" ixz="-7.1817349065269E-22" iyy="7.69100314106116E-07" iyz="6.74715432769696E-07" izz="2.30315190420171E-06" />
          </inertial>
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/visual/robotiq_arg2f_85_inner_finger.dae" scale="0.001 0.001 0.001"/>
          </geometry>
          <material name="">
            <color rgba="0.1 0.1 0.1 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/collision/robotiq_arg2f_85_inner_finger.dae" scale="0.001 0.001 0.001" />
          </geometry>
        </collision>
      </link>
    </xacro:macro>

    <!-- Finger pad link, the default are the "big pads" with rubber-->
    <xacro:macro name="inner_finger_pad" params="prefix fingerprefix">
      <link name="${prefix}${fingerprefix}_inner_finger_pad">
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <box size="0.022 0.00635 0.0375"/>
          </geometry>
          <material name="">
            <color rgba="0.9 0.9 0.9 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <box size="0.022 0.00635 0.0375"/>
          </geometry>
          <material name="">
            <color rgba="0.9 0.0 0.0 1" />
          </material>
        </collision>
      </link>
    </xacro:macro>

    <xacro:macro name="finger_links" params="prefix fingerprefix">
      <xacro:outer_knuckle prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:outer_finger prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:inner_finger prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:inner_finger_pad prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:inner_knuckle prefix="${prefix}" fingerprefix="${fingerprefix}"/>
    </xacro:macro>


    <!-- fingers joints macros -->
    <xacro:macro name="outer_finger_joint" params="prefix fingerprefix">
      <joint name="${prefix}${fingerprefix}_outer_finger_joint" type="fixed">
        <origin xyz="0 0.0315 -0.0041" rpy="0 0 0"/>
        <parent link="${prefix}${fingerprefix}_outer_knuckle" />
        <child link="${prefix}${fingerprefix}_outer_finger" />
        <axis xyz="1 0 0" />
      </joint>
    </xacro:macro>

    <xacro:macro name="inner_knuckle_joint" params="prefix fingerprefix reflect">
      <joint name="${prefix}${fingerprefix}_inner_knuckle_joint" type="revolute">
        <!-- <origin xyz="0 ${reflect * -0.0127} 0.06142" rpy="${pi / 2 + .725} 0 ${(reflect - 1) * pi / 2}" /> -->
        <origin xyz="0 ${reflect * -0.0127} 0.06142" rpy="0 0 ${(1 + reflect) * pi / 2}"/>
        <parent link="${prefix}robotiq_arg2f_base_link" />
        <child link="${prefix}${fingerprefix}_inner_knuckle" />
        <axis xyz="1 0 0" />
        <limit lower="0" upper="0.8757" velocity="0.5" effort="1000" />
        <mimic joint="${prefix}finger_joint" multiplier="1" offset="0" />
      </joint>
    </xacro:macro>

    <xacro:macro name="inner_finger_joint" params="prefix fingerprefix">
      <joint name="${prefix}${fingerprefix}_inner_finger_joint" type="revolute">
        <origin xyz="0 0.0061 0.0471" rpy="0 0 0"/>
        <parent link="${prefix}${fingerprefix}_outer_finger" />
        <child link="${prefix}${fingerprefix}_inner_finger" />
        <axis xyz="1 0 0" />
        <limit lower="-0.8757" upper="0" velocity="0.5" effort="1000" />
        <mimic joint="${prefix}finger_joint" multiplier="-1" offset="0" />
      </joint>
    </xacro:macro>

    <xacro:macro name="inner_finger_pad_joint" params="prefix fingerprefix">
      <joint name="${prefix}${fingerprefix}_inner_finger_pad_joint" type="fixed">
        <origin xyz="0 -0.0220203446692936 0.03242" rpy="0 0 0"/>
        <parent link="${prefix}${fingerprefix}_inner_finger" />
        <child link="${prefix}${fingerprefix}_inner_finger_pad" />
        <axis xyz="0 0 1" />
      </joint>
    </xacro:macro>

    <xacro:macro name="finger_joints" params="prefix fingerprefix reflect">
      <xacro:outer_finger_joint prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:inner_knuckle_joint prefix="${prefix}" fingerprefix="${fingerprefix}" reflect="${reflect}"/>
      <xacro:inner_finger_joint prefix="${prefix}" fingerprefix="${fingerprefix}"/>
      <xacro:inner_finger_pad_joint prefix="${prefix}" fingerprefix="${fingerprefix}"/>
    </xacro:macro>

    <!-- base link -->
    <joint name="${prefix}attach_gripper" type="fixed">
        <parent link="${prefix}tool0" />
        <child link="${prefix}robotiq_arg2f_base_link" />
    </joint>
    <link name="${prefix}robotiq_arg2f_base_link">
        <inertial>
          <origin xyz="8.625E-08 -4.6583E-06 0.03145" rpy="0 0 0" />
          <mass value="0.22652" />
          <inertia ixx="0.00020005" ixy="-4.2442E-10" ixz="-2.9069E-10" iyy="0.00017832" iyz="-3.4402E-08" izz="0.00013478" />
        </inertial>
        <visual>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/visual/robotiq_arg2f_base_link.stl" />
          </geometry>
          <material name="">
            <color rgba="0.1 0.1 0.1 1" />
          </material>
        </visual>
        <collision>
          <origin xyz="0 0 0" rpy="0 0 0" />
          <geometry>
            <mesh filename="package://robotiq_2f_85_gripper_visualization/meshes/collision/robotiq_arg2f_base_link.stl" />
          </geometry>
        </collision>
      </link>

    <!-- left finger -->
    <xacro:finger_links prefix="${prefix}" fingerprefix="left"/>
    <xacro:finger_joints prefix="${prefix}" fingerprefix="left" reflect="1.0"/>
    <joint name="${prefix}finger_joint" type="revolute">
      <origin xyz="0 -0.0306011 0.054904" rpy="0 0 ${pi}"/>
      <parent link="${prefix}robotiq_arg2f_base_link" />
      <child link="${prefix}left_outer_knuckle" />
      <axis xyz="1 0 0" />
      <limit lower="0" upper="0.8" velocity="0.5" effort="1000" />
    </joint>

    <!-- right finger -->
    <xacro:finger_joints prefix="${prefix}" fingerprefix="right" reflect="-1.0"/>
    <xacro:finger_links prefix="${prefix}" fingerprefix="right"/>
    <joint name="${prefix}right_finger_joint" type="revolute">
      <origin xyz="0 0.0306011 0.054904" rpy="0 0 0"/>
      <parent link="${prefix}robotiq_arg2f_base_link" />
      <child link="${prefix}right_outer_knuckle" />
      <axis xyz="1 0 0" />
      <limit lower="0" upper="0.81" velocity="0.5" effort="1000" />
      <mimic joint="${prefix}finger_joint" multiplier="1" offset="0" />
    </joint>

  </xacro:macro>
</robot>

2. ur5_gripper_macro.xacro

修改宏命名:xacro:macro name="ur5_gripper_robot"

修改include:filename="$(find ur_description)/urdf/inc/ur_gripper_macro.xacro"

修改调用宏:xacro:ur_gripper_robot

修改后ur5_gripper_macro.xacro文件为

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">
  <!--
    Convenience wrapper for the 'ur_robot' macro which provides default values
    for the various "parameters files" parameters for a UR5.

    This file can be used when composing a more complex scene with one or more
    UR5 robots.

    While the generic 'ur_robot' macro could also be used, it would require
    the user to provide values for all parameters, as that macro does not set
    any model-specific defaults (not even for the generic parameters, such as
    the visual and physical parameters and joint limits).

    Refer to the main 'ur_macro.xacro' in this package for information about
    use, contributors and limitations.

    NOTE: users will most likely want to override *at least* the
          'kinematics_parameters_file' parameter. Otherwise, a default kinematic
          model will be used, which will almost certainly not correspond to any
          real robot.
  -->
  <xacro:macro name="ur5_gripper_robot" params="
   prefix
   joint_limits_parameters_file:='$(find ur_description)/config/ur5/joint_limits.yaml'
   kinematics_parameters_file:='$(find ur_description)/config/ur5/default_kinematics.yaml'
   physical_parameters_file:='$(find ur_description)/config/ur5/physical_parameters.yaml'
   visual_parameters_file:='$(find ur_description)/config/ur5/visual_parameters.yaml'
   transmission_hw_interface:=hardware_interface/PositionJointInterface
   safety_limits:=false
   safety_pos_margin:=0.15
   safety_k_position:=20"
  >
    <xacro:include filename="$(find ur_description)/urdf/inc/ur_gripper_macro.xacro"/>

    <xacro:ur_gripper_robot
      prefix="${prefix}"
      joint_limits_parameters_file="${joint_limits_parameters_file}"
      kinematics_parameters_file="${kinematics_parameters_file}"
      physical_parameters_file="${physical_parameters_file}"
      visual_parameters_file="${visual_parameters_file}"
      transmission_hw_interface="${transmission_hw_interface}"
      safety_limits="${safety_limits}"
      safety_pos_margin="${safety_pos_margin}"
      safety_k_position="${safety_k_position}"
    />

  </xacro:macro>
</robot>

3. ur5_gripper.xacro

修改1:filename="$(find ur_description)/urdf/inc/ur5_gripper_macro.xacro"

修改2:xacro:ur5_gripper_robot

修改后ur5_gripper.xacro文件为

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro" name="ur5_robot">
  <!--
    This is a convenience top-level xacro which loads the macro for the UR5e
    which defines the default values for the various "parameters files"
    parameters for a UR5e.

    This file is only useful when loading a stand-alone, completely isolated
    robot with only default values for all parameters such as the kinematics,
    visual and physical parameters and joint limits.

    This file is not intended to be integrated into a larger scene or other
    composite xacro.

    Instead, xacro:include 'inc/ur5e_macro.xacro' and override the defaults
    for the arguments to that macro.

    Refer to 'inc/ur_macro.xacro' for more information.
  -->
  <xacro:include filename="$(find ur_description)/urdf/inc/ur5_gripper_macro.xacro"/>
  <xacro:ur5_gripper_robot prefix="" />
</robot>

 PART2

此外,还需要将在launch中用到的文件复制和重命名:ur.xacro改为ur_gripper.xacro。

ur_gripper.xacro

修改:include filename="$(find ur_description)/urdf/inc/ur_gripper_macro.xacro"

修改后ur_gripper.xacro文件为

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro" name="ur">

   <!-- import main macro -->
   <xacro:include filename="$(find ur_description)/urdf/inc/ur_gripper_macro.xacro"/>

   <!-- parameters -->
   <xacro:arg name="joint_limit_params" default=""/>
   <xacro:arg name="kinematics_params" default=""/>
   <xacro:arg name="physical_params" default=""/>
   <xacro:arg name="visual_params" default=""/>
   <!-- legal values:
         - hardware_interface/PositionJointInterface
         - hardware_interface/VelocityJointInterface
         - hardware_interface/EffortJointInterface
   -->
   <xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/>
   <xacro:arg name="safety_limits" default="false"/>
   <xacro:arg name="safety_pos_margin" default="0.15"/>
   <xacro:arg name="safety_k_position" default="20"/>

   <!-- arm -->
   <xacro:ur_gripper_robot
     prefix=""
     joint_limits_parameters_file="$(arg joint_limit_params)"
     kinematics_parameters_file="$(arg kinematics_params)"
     physical_parameters_file="$(arg physical_params)"
     visual_parameters_file="$(arg visual_params)"
     transmission_hw_interface="$(arg transmission_hw_interface)"
     safety_limits="$(arg safety_limits)"
     safety_pos_margin="$(arg safety_pos_margin)"
     safety_k_position="$(arg safety_k_position)"/>
</robot>

(三)修改launch文件

我们需要修改的launch文件所在路径为src/fmauch_universal_robot/ur_description/launch。

同样地,按照嵌套顺序从外向里将.launch文件复制和重命名:(1)view_ur5.launch改为view_gripper_ur5.launch,(2)load_ur5.launch改为load_gripper_ur5.launch,(3)load_ur.launch改为load_gripper_ur.launch。按照嵌套顺序从里向外,分别修改三个文件:

load_gripper_ur.launch

修改:command="$(find xacro)/xacro '$(find ur_description)/urdf/ur_gripper.xacro'

load_gripper_ur5.launch

修改:file="$(find ur_description)/launch/load_gripper_ur.launch"

view_gripper_ur5.launch

修改:file="$(find ur_description)/launch/load_gripper_ur5.launch"

(四)启动

cd ~/catkin_ws
catkin_make
source devel/setup.bash

roslaunch ur_description view_gripper_ur5.launch

rviz启动, 机械臂成功添加夹爪,拖动gui中的滑动条,可以实现机械臂关节和夹爪的控制。

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值