Skip to content

Robotiq ROS 2 packages 1.1.0

Latest

Choose a tag to compare

@ebarnett3 ebarnett3 released this 14 Aug 00:20
3ab3bef

Robotiq ROS 2 packages 1.1.0

This release introduces the gripper packagesrobotiq_driver, robotiq_controllers, robotiq_description, robotiq_hardware_tests — and carries the accumulated TSF-85 work. Humble, Jazzy and Lyrical are supported from the single main branch; Rolling is built and watched but does not gate.

From this release the repository is versioned as a whole: every package carries the same version and one v<version> tag covers both stacks. Earlier tags were per-stack — V1.0.0 released the TSF packages, 0.0.1 was PickNik's original gripper release — so the first unified tag continues from the highest of them rather than restarting.

Gripper packages

Robotiq's ROS 2 ros2_control driver for the 2F adaptive grippers, running on the Robotiq C++ grippers SDK 1.0.0 — the extern/grippers submodule — instead of an in-tree Modbus implementation.

Descriptions ship for the 2F-85 and 2F-140. This release is hardware-validated on a 2F-85; the 2F-140 description ships untested on hardware. The driver itself is model-agnostic — it needs a serial link and gripper_closed_position — so a Hand-E works once you supply a URDF for it, but no Hand-E description ships yet.

It continues PickNik Robotics' ros2_robotiq_gripper (BSD-3-Clause), which Robotiq now develops and supports: issues go to robotiq/ros/issues.

Migrating from PickNik

Migration is easy at the workspace level. Package names, launch files, controller names, the xacro macro arguments and the /robotiq_gripper_controller/gripper_cmd action are unchanged, and on Humble the controller and action types are identical to PickNik's humble branch — existing action clients, launch overrides and xacro arguments keep working untouched. robotiq_control.launch.py picks the matching controller config from $ROS_DISTRO on its own.

Watch for these, though:

  • Clone with --recurse-submodules. The SDK arrives as the extern/grippers submodule; without it robotiq_driver will not build. Already cloned? git submodule update --init.
  • Remove both old sources from the workspace:
    1. the PickNik clone (rm -rf src/ros2_robotiq_gripper, otherwise colcon fails on duplicate package names)
    2. the vcs imported serial package (rm -rf src/serial)
      Then rm -rf build install to clear artifacts built from the PickNik sources.
  • No more vcs import. The .repos file no longer pulls tylerjw/serial; the transport comes from the SDK submodule. Any script or CI job that ran vcs import < ros2_robotiq_gripper.*.repos needs that step deleted.
  • libserialport has no rosdep key. Install it yourself (sudo apt install libserialport-dev) and run rosdep install --from-paths src --ignore-src -y --skip-keys libserialport. Plain rosdep install fails.
  • Jazzy / Lyrical action type. If you move off Humble at the same time, the goal type changes from control_msgs/action/GripperCommand to ParallelGripperCommand (a JointState naming the knuckle joint). This break is upstream ROS's — gripper_controllers is gone in Kilted+ — not ours (PickNik PR #103). Staying on Humble requires no change.
  • On Humble, per-goal speed and force still come from the xacro. Humble's gripper_controllers has no parameters for the set_gripper_max_effort / set_gripper_max_velocity interfaces, so it cannot claim them (PickNik's use_effort_interface / use_speed_interface entries were silently ignored there too). Use gripper_speed_multiplier / gripper_force_multiplier.
  • use_dummy changed meaning: it now drives the SDK's fake gripper — no port opened, instant activation, fingers report their last command — while keeping the real plugin loaded so the gripper and activation controllers still bind. That is what distinguishes it from use_fake_hardware:=true, which swaps in mock_components/GenericSystem and exports neither the speed/effort interfaces nor the reactivate_gripper GPIO.
  • Activating the hardware component still releases any grip and runs the full calibration sweep, and deactivating resets the gripper the same way — unchanged PickNik behaviour, but keep the workspace clear and do not restart the stack with a part held. A conservative alternative exists in the SDK and is not wired up yet: #28.
  • Exchange rate is platform-limited. connection_frequency defaults to 100 Hz; the default macOS FTDI driver caps around 60 Hz and Windows timer quantization (~15.6 ms) limits periods below ~16 ms. Set it to what your platform can carry.

Improvements over PickNik

  • One FC 0x17 (read/write multiple registers) transaction per cycle, in the SDK's background exchange thread, replacing the separate read and write transactions issued from inside read() / write(). Half the bus traffic per cycle, the gripper link no longer paced by the controller manager's update loop, and read() / write() become process-image copies that never block on serial.
  • libserialport replaces the vcs imported tylerjw/serial fork — a maintained, cross-platform transport with no workspace-level dependency step, and the FTDI latency_timer lowered to 1 ms automatically on Linux (the 16 ms kernel default triples Modbus latency).
  • Configurable hardware parameters in the <hardware> block: baudrate, timeout (default 500 ms), slave_address, connection_frequency (default 100 Hz), activation_timeout (default 15 s), gripper_max_speed / gripper_max_force (SI full scale for the command interfaces), use_dummy. A malformed value is reported and the default stands; only gripper_closed_position fails the transition.
  • Activation and fault recovery are bounded by activation_timeout. The old driver had no timeout and could block a lifecycle transition indefinitely.
  • Three live LTS distros from one branch (Humble / Jazzy / Lyrical), with GitHub Actions building all of them plus Rolling as a non-blocking heads-up.
  • Docs and CI back in-tree. PickNik's README and CI were removed upstream; documentation lives in the repo README and issues go to robotiq/ros/issues. A unified Docker image with device mapping is included (./docker/run.sh gripper).

PickNik bugs fixed

  • PickNikRobotics/ros2_robotiq_gripper#114robotiq_controllers.yaml referenced command interfaces that the hardware interface does not export, so the controller failed to activate on real hardware. Interface names corrected to set_gripper_max_effort / set_gripper_max_velocity, and the temporary sed patch in the Dockerfile removed.
  • PickNikRobotics/ros2_robotiq_gripper#88ros2_control_node crashed when the gripper was not connected at startup. Connection failures now fail on_configure cleanly with an actionable message (24 V power, RS-485 wiring, COM_port / slave_address / baudrate hints) instead of escaping as an unhandled exception.

Still open

  • #26 — the hardware interface still exports only position and velocity state interfaces; object detection (gOBJ) and measured effort (gCU) are not exposed. Carried over from PickNikRobotics/ros2_robotiq_gripper#118.
  • #27 — the ros2_control spawners keep retrying after ros2_control_node exits, so a bringup with no gripper attached ends in a retry loop rather than a clean exit.
  • #28on_activate runs the full reset-then-activate handshake every time, so it releases anything held; a conservative activate-only path is wanted.
  • #29 — the velocity state interface is always 0.0 (the gripper's status block carries position and current only), which trips the gripper controller's velocity-based stall detection on every goal: motion completes normally and the action reports SUCCEEDED, but result.reached_goal is false and stalled is true. Check the action status, or the joint position against your tolerance, rather than reached_goal. Carried over from PickNik.

TSF-85 packages

Because the repository is now versioned as a whole, this tag also publishes the robotiq_tsf work accumulated since V1.0.0:

  • poll_data_node is replaced by poll_data_sdk_node, which parses through the vendor SDK (extern/tactile_sensors, libserialport). The old node misparsed StaticData in a bistable per-plug-event way and segfaulted on Ctrl-C; the new one is hardware-verified, adds USB-descriptor autodetect and a first-data watchdog, and exits cleanly on SIGINT. Subscribers need no change — all seven topics (TactileSensor/StaticData, Dynamic, Accelerometer, Gyroscope, Quaternion, EulerAngle, Timestamp) keep their names and message types. Only the executable name changed, so a launch file, script or unit invoking poll_data_node directly must be repointed; launch files in this repo already default to the new poller, and expose a poller argument to override it.
  • extern/tactile_sensors updated to v2.0.0.
  • AHRS quaternion and per-finger IMU math migrated to Eigen.
  • Tactile sensor RViz visualization added.
  • Builds on Humble and Lyrical; one gtest binary per package; unused OpenCV and libusb dependencies dropped.

Repository

  • One version, one tag. VERSION at the repo root is the authoritative version string. package.xml must hold a literal version — ament, rosdep and bloom parse it statically — so dev/version.py propagates it into all five packages and a pre-commit hook fails on drift.
  • CI: colcon build and test on Humble, Jazzy and Lyrical (merge-gating) plus Rolling (non-blocking), a repo-wide pre-commit formatting job (clang-format, black, flake8, codespell) and ament lint.
  • Not released through bloom or the ROS build farm: libserialport has no rosdep key, so these are source installs — clone the tag and build.