← Source browser

src/end_effectors/onrobot_2fg7_description/urdf/onrobot_2fg7.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro">
  <!--
    OnRobot 2FG7 parallel gripper URDF.

    Dimensions (approximate, from datasheet + URScript TCP values):
      - QC adapter height: ~15mm (OnRobot Quick Changer tool-side adapter)
      - Body height: ~83mm (from adapter top to finger base)
      - Finger height: ~55mm (from body to fingertip)
      - Body width: ~75mm, depth: ~80mm
      - External grip range: 1-73mm (with standard fingers)
      - Total stroke: 38mm
      - Weight: 0.78kg (gripper only, without QC)

    Kinematic chain: parent -> 2fg7_base -> 2fg7_body -> fingers -> tip
  -->

  <xacro:macro name="onrobot_2fg7"
    params="parent prefix:=''
            xyz:='0 0 0'
            rpy:='0 0 0'
            grip_pos_min:=0.0
            grip_pos_max:=0.0365"
  >

    <!-- 2FG7 dimensions in meters -->
    <xacro:property name="qc_adapter_height" value="0.015"/>
    <xacro:property name="body_height" value="0.083"/>
    <xacro:property name="body_width" value="0.075"/>
    <xacro:property name="body_depth" value="0.080"/>
    <xacro:property name="body_mass" value="0.78"/>
    <xacro:property name="finger_height" value="0.055"/>
    <xacro:property name="finger_width" value="0.012"/>
    <xacro:property name="finger_depth" value="0.025"/>
    <xacro:property name="finger_mass" value="0.02"/>
    <!-- Finger base offset from body center axis (half the min external width) -->
    <xacro:property name="finger_base_offset" value="0.0005"/>

    <!-- Base joint: attaches to parent (tool_block) -->
    <joint name="${prefix}2fg7_base_joint" type="fixed">
      <origin xyz="${xyz}" rpy="${rpy}"/>
      <parent link="${parent}"/>
      <child link="${prefix}2fg7_base_link"/>
    </joint>

    <!-- QC adapter (thin cylinder representing the tool-side Quick Changer adapter) -->
    <link name="${prefix}2fg7_base_link">
      <visual>
        <origin xyz="0 0 ${qc_adapter_height/2}" rpy="0 0 0"/>
        <geometry>
          <cylinder radius="0.0315" length="${qc_adapter_height}"/>
        </geometry>
        <material name="2fg7_adapter_grey">
          <color rgba="0.7 0.7 0.7 1.0"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${qc_adapter_height/2}" rpy="0 0 0"/>
        <geometry>
          <cylinder radius="0.0315" length="${qc_adapter_height}"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.05"/>
        <origin xyz="0 0 ${qc_adapter_height/2}" rpy="0 0 0"/>
        <inertia ixx="1e-5" ixy="0" ixz="0" iyy="1e-5" iyz="0" izz="1e-5"/>
      </inertial>
    </link>

    <!-- Body joint -->
    <joint name="${prefix}2fg7_body_joint" type="fixed">
      <origin xyz="0 0 ${qc_adapter_height}" rpy="0 0 0"/>
      <parent link="${prefix}2fg7_base_link"/>
      <child link="${prefix}2fg7_body"/>
    </joint>

    <!-- Main gripper body -->
    <link name="${prefix}2fg7_body">
      <visual>
        <origin xyz="0 0 ${body_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${body_width} ${body_depth} ${body_height}"/>
        </geometry>
        <material name="2fg7_body_silver">
          <color rgba="0.85 0.85 0.85 1.0"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${body_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${body_width} ${body_depth} ${body_height}"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="${body_mass}"/>
        <origin xyz="0 0 ${body_height/2}" rpy="0 0 0"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>

    <!-- Left finger (prismatic, moves in +X direction) -->
    <joint name="${prefix}twofg7_left_finger_joint" type="prismatic">
      <origin xyz="${finger_base_offset} 0 ${body_height}" rpy="0 0 0"/>
      <parent link="${prefix}2fg7_body"/>
      <child link="${prefix}2fg7_left_finger"/>
      <axis xyz="1 0 0"/>
      <limit effort="140" lower="${grip_pos_min}" upper="${grip_pos_max}" velocity="0.450"/>
    </joint>

    <link name="${prefix}2fg7_left_finger">
      <visual>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${finger_width} ${finger_depth} ${finger_height}"/>
        </geometry>
        <material name="2fg7_finger_dark">
          <color rgba="0.15 0.15 0.15 1.0"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${finger_width} ${finger_depth} ${finger_height}"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="${finger_mass}"/>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6"/>
      </inertial>
    </link>

    <!-- Right finger (mimic of left, moves in -X direction) -->
    <joint name="${prefix}twofg7_right_finger_joint" type="prismatic">
      <origin xyz="${-finger_base_offset} 0 ${body_height}" rpy="0 0 0"/>
      <parent link="${prefix}2fg7_body"/>
      <child link="${prefix}2fg7_right_finger"/>
      <axis xyz="-1 0 0"/>
      <limit effort="140" lower="${grip_pos_min}" upper="${grip_pos_max}" velocity="0.450"/>
      <mimic joint="${prefix}twofg7_left_finger_joint" multiplier="1" offset="0"/>
    </joint>

    <link name="${prefix}2fg7_right_finger">
      <visual>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${finger_width} ${finger_depth} ${finger_height}"/>
        </geometry>
        <material name="2fg7_finger_dark">
          <color rgba="0.15 0.15 0.15 1.0"/>
        </material>
      </visual>
      <collision>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <geometry>
          <box size="${finger_width} ${finger_depth} ${finger_height}"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="${finger_mass}"/>
        <origin xyz="0 0 ${finger_height/2}" rpy="0 0 0"/>
        <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6"/>
      </inertial>
    </link>

    <!-- Tip frame: center point between fingertips (for MoveIt IK) -->
    <joint name="${prefix}2fg7_tip_joint" type="fixed">
      <origin xyz="0 0 ${body_height + finger_height}" rpy="0 0 0"/>
      <parent link="${prefix}2fg7_body"/>
      <child link="${prefix}2fg7_tip"/>
    </joint>

    <link name="${prefix}2fg7_tip"/>

  </xacro:macro>
</robot>