<?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>