Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Test

# Runs scripts/update-readme.test.mjs on every PR into main. Intended to be
# added as a required status check on the prToMain ruleset, so a PR that
# breaks scripts/update-readme.mjs (including one opened by
# update-readme.yml's own daily run) can't merge — see the "required check"
# discussion on PR #2.

on:
pull_request:
branches: [main]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20

- run: node --test scripts/*.test.mjs
111 changes: 111 additions & 0 deletions .github/workflows/update-readme.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Update README

# Daily refresh of profile/README.md's auto-generated sections (see
# scripts/update-readme.mjs): the repository table (from the GitHub API) and
# the software tools tables (imported from robotiq/robotiq.github.io's
# docs/intro.mdx). Opens a PR only when the regenerated content actually
# differs, then auto-merges it — mirroring
# robotiq.github.io's .github/workflows/dependabot-auto-merge.yml.
#
# Why this needs a PAT instead of just GITHUB_TOKEN: the prToMain ruleset's
# required-review rule blocks a PR's *author* from approving its own PR. In
# dependabot-auto-merge.yml, Dependabot (a distinct actor) opens the PR and
# GITHUB_TOKEN (github-actions[bot]) approves it — two different actors, so
# it's not self-approval. Here there's no Dependabot; this workflow itself
# generates the content. So the "open PR" step authenticates as
# README_BOT_PAT (a fine-grained PAT scoped to just this repo, Contents +
# Pull requests: write) instead of GITHUB_TOKEN, making its author a
# distinct actor from the github-actions[bot] identity that then approves
# and merges it in the next step.
#
# Why this is safe to merge without further human review: the generated
# content is either the GitHub API's own repo descriptions or
# robotiq.github.io's own published docs/intro.mdx — both already public and
# already reviewed upstream. What actually gates the merge is the "Test"
# workflow (.github/workflows/test.yml) as a required status check on the
# prToMain ruleset: `gh pr merge --auto` waits on it, so a change that breaks
# update-readme.mjs sits as an open, failing PR instead of reaching the org's
# public landing page. Without that required check, `--auto` has nothing to
# wait on and errors out instead of merging — see the review on PR #2.
#
# Also requires: `allow_auto_merge` enabled on this repo (Settings → General
# → Pull Requests), and the commit's author email resolving to a real GitHub
# account (below) so prToMain's require_extra_approval_for_unattributed_changes
# rule doesn't kick in and demand a second approval nothing here can produce.

on:
schedule:
- cron: '17 6 * * *'
workflow_dispatch: {}

permissions:
contents: write
pull-requests: write

jobs:
update-readme:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.README_BOT_PAT }}

- uses: actions/setup-node@v4
with:
node-version: 20

- name: Regenerate README
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node scripts/update-readme.mjs

- name: Open PR if content changed
id: pr
env:
GH_TOKEN: ${{ secrets.README_BOT_PAT }}
run: |
if git diff --quiet -- profile/README.md; then
echo "changed=false" >> "$GITHUB_OUTPUT"
exit 0
fi

# Fixed name rather than one timestamped per run: a run that lands
# before yesterday's PR merged (still waiting on the required
# check) force-pushes onto the same branch/PR instead of piling up
# a new branch and a new unmergeable PR each day.
BRANCH="auto/update-readme"
git config user.name "robotiq-readme-bot"
# This must resolve to a real GitHub account (github-actions[bot]'s
# own noreply address) or the prToMain ruleset's
# require_extra_approval_for_unattributed_changes rule treats the
# commit as unattributed and demands a second approval this
# workflow has no way to produce.
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git checkout -b "$BRANCH"
git add profile/README.md
git commit -m "chore: update README repository table and software tools section"
git push --force origin "$BRANCH"

EXISTING_PR=$(gh pr list --base main --head "$BRANCH" --state open --json url --jq '.[0].url')
if [ -n "$EXISTING_PR" ]; then
PR_URL="$EXISTING_PR"
else
PR_URL=$(gh pr create \
--base main \
--head "$BRANCH" \
--title "chore: update README repository table" \
--body "Automated daily refresh of the repository table (GitHub API) and software tools section (robotiq.github.io docs/intro.mdx) — see \`scripts/update-readme.mjs\`.")
fi

echo "changed=true" >> "$GITHUB_OUTPUT"
echo "url=$PR_URL" >> "$GITHUB_OUTPUT"

- name: Approve and auto-merge
if: steps.pr.outputs.changed == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ steps.pr.outputs.url }}
run: |
gh pr review --approve "$PR_URL"
gh pr merge --auto --squash --delete-branch "$PR_URL"
92 changes: 79 additions & 13 deletions profile/README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,88 @@
# Robotiq

Open-source tools and drivers for Robotiq products.
Open-source software tools for Robotiq developers.

<p align="center">
<a href="https://robotiq.github.io/docs/intro">
<img src="https://img.shields.io/badge/📖_Documentation-robotiq.github.io-blue?style=for-the-badge" alt="Robotiq documentation website" />
</a>
</p>

<p align="center">
Full documentation, guides, and API references for `Robotiq` software tools.<br/>
Start there to find your product, then jump into the matching repository below.
</p>

## Repositories

<!-- This section is auto-generated by scripts/update-readme.mjs from the
robotiq GitHub org's public repositories — do not edit by hand. -->
<!-- AUTO-GENERATED-REPOS-TABLE:START -->
| Repository | Description |
|---|---|
| [grippers](https://github.com/Robotiq/grippers) | Standalone C++ SDK for the 2F adaptive grippers (2F-85 / 2F-140 / Hand-E) over Modbus RTU |
| [tactile_sensors](https://github.com/Robotiq/tactile_sensors) | SDK, sensor I/O, and quickstart tools for the TSF-85 tactile sensor |
| [ros](https://github.com/Robotiq/ROS_Packages) | Robotiq ROS packages (grippers, tactile sensor) |
| [grippers](https://github.com/robotiq/grippers) | Standalone C++ SDK for Robotiq 2F adaptive grippers (2F-85 / 2F-140 / Hand-E) over Modbus RTU |
| [isaacsim_assets](https://github.com/robotiq/isaacsim_assets) | Our Isaac Sim assets available to the public |
| [ros](https://github.com/robotiq/ros) | Collection of ROS packages for controlling Robotiq hardware. |
| [tactile_sensors](https://github.com/robotiq/tactile_sensors) | Get started with Robotiqs TSF-85 tactile sensors |
Comment thread
bcastets-robotiq marked this conversation as resolved.
<!-- AUTO-GENERATED-REPOS-TABLE:END -->

## Community & Third-Party
## Software tools

A curated list of community-maintained drivers and useful third-party projects related to Robotiq products and robotic grasping.
<!-- This section is auto-generated by scripts/update-readme.mjs from
https://github.com/robotiq/robotiq.github.io/blob/main/docs/intro.mdx — do not edit by hand. -->
<!-- AUTO-GENERATED-SOFTWARE-TOOLS:START -->
#### SDKs/languages

| Repository | Description |
| Product | C | C++ | Python |
|---|---|---|---|
| [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](https://robotiq.github.io/docs/drivers/2F%20hande/SDK/C++) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/SDK/Python) |
| [FT300-S](https://robotiq.github.io/docs/drivers/FT300) | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](https://robotiq.github.io/docs/drivers/FT300/SDK/C) | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/FT300/SDK/Python) |
| [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](https://robotiq.github.io/docs/drivers/TSF-85/SDK/C++) | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](https://robotiq.github.io/docs/drivers/TSF-85/SDK/Python) |

- **C** — Low-level C driver talking directly to the hardware's communication protocol (e.g. Modbus RTU, serial).
- **C++** — Low-level C++ driver/SDK for direct hardware integration.
- **Python** — Python driver/SDK for scripting and rapid prototyping.

#### ROS2

| Product | Rolling | Jazzy | Iron | Humble |
|---|---|---|---|---|
| [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Rolling) | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Iron) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS2-Humble) |
| [FT300-S](https://robotiq.github.io/docs/drivers/FT300) | - | - | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/FT300/ROS/ROS2-Humble) |
| [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](https://robotiq.github.io/docs/drivers/TSF-85/ROS/ROS2-Jazzy) | - | - |

- **Rolling** — ROS 2 rolling development distro, always tracking the latest sources.
- **Jazzy** — ROS 2 LTS release (2024), supported until 2029.
- **Iron** — ROS 2 release (2023), end of life.
- **Humble** — ROS 2 LTS release (2022), supported until 2027.

#### ROS1

| Product | Melodic | Kinetic | Jade | Indigo |
|---|---|---|---|---|
| [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Melodic) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Kinetic) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Jade) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/ROS/ROS1-Indigo) |

- **Melodic** — ROS 1 release (2018), end of life.
- **Kinetic** — ROS 1 release (2016), end of life.
- **Jade** — ROS 1 release (2015), end of life.
- **Indigo** — ROS 1 release (2014), end of life.

#### Physics engine

| Product | Isaac Sim | PyBullet |
|---|---|---|
| [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/Physics%20Engine/Isaac%20Sim) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/Physics%20Engine/PyBullet) |
| [TSF-85](https://robotiq.github.io/docs/drivers/TSF-85) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/TSF-85/Physics%20Engine/Isaac%20Sim) | - |

- **Isaac Sim** — NVIDIA Isaac Sim integration for simulating the hardware.
- **PyBullet** — PyBullet integration for physics-based simulation.

#### Other community projects

| Product | GraspGen |
|---|---|
| [TSF-85 Isaac Sim Extension](https://github.com/Lab-CORO/TSF-85) | An Isaac Sim extension generating synthetic tactile maps for the TSF-85 |
| [pyRobotiqGripper](https://github.com/castetsb/pyRobotiqGripper) | Python library for controlling Robotiq grippers (2F-85, 2F-140, Hand-E) via Modbus RTU |
| [ur_rtde](https://sdurobotics.gitlab.io/ur_rtde) | Provides some useful [instructions](https://sdurobotics.gitlab.io/ur_rtde/guides/guides.html#use-with-robotiq-gripper) on how to control a Robotiq gripper directly using a raw TCP socket |
| [pyFT300](https://github.com/castetsb/pyFT300) | Python library for reading data from the Robotiq FT-300 force-torque sensor |
| [pybullet_ur5_robotiq](https://github.com/ElectronicElephant/pybullet_ur5_robotiq) | UR5 + Robotiq 85/140 gripper simulation in PyBullet |
| [GraspGen](https://github.com/NVlabs/GraspGen) | GraspGen: a diffusion-based framework for 6-DOF grasping |
Comment thread
bcastets-robotiq marked this conversation as resolved.
| [2F / Hand-E](https://robotiq.github.io/docs/drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](https://robotiq.github.io/docs/drivers/2F%20hande/Other/GraspGen) |

- **GraspGen** — NVIDIA GraspGen asset/model package with Robotiq gripper definitions for grasp synthesis research.
<!-- AUTO-GENERATED-SOFTWARE-TOOLS:END -->

83 changes: 83 additions & 0 deletions scripts/fixtures/intro.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
title: Overview
sidebar_label: Overview
sidebar_position: 0
---

## Hardware documentation

Robotiq hardware communication protocols are described in detail in the product
manuals, which serve as the reference for developing custom drivers.

Hardware manuals are available on Robotiq support website:
https://robotiq.com/support

## Software tools

Badge colors indicate who maintains the integration: ![Robotiq](https://img.shields.io/badge/Robotiq-blue) an official Robotiq-maintained driver, ![Third party](https://img.shields.io/badge/Third_party-lightgrey) a community-maintained project.

### SDKs/languages

{/* AUTO-GENERATED-SDK-TABLE:START */}
| Product | C | C++ | Python |
|---|---|---|---|
| [2F / Hand-E](drivers/2F%20hande) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](drivers/2F%20hande/SDK/C++) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/SDK/Python) |
| [FT300-S](drivers/FT300) | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](drivers/FT300/SDK/C) | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/FT300/SDK/Python) |
| [TSF-85](drivers/TSF-85) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](drivers/TSF-85/SDK/C++) | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](drivers/TSF-85/SDK/Python) |

- **C** — Low-level C driver talking directly to the hardware's communication protocol (e.g. Modbus RTU, serial).
- **C++** — Low-level C++ driver/SDK for direct hardware integration.
- **Python** — Python driver/SDK for scripting and rapid prototyping.
{/* AUTO-GENERATED-SDK-TABLE:END */}

### ROS

#### ROS2

{/* AUTO-GENERATED-ROS2-TABLE:START */}
| Product | Rolling | Jazzy | Iron | Humble |
|---|---|---|---|---|
| [2F / Hand-E](drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS2-Rolling) | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS2-Iron) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS2-Humble) |
| [FT300-S](drivers/FT300) | - | - | - | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/FT300/ROS/ROS2-Humble) |
| [TSF-85](drivers/TSF-85) | - | [![Robotiq](https://img.shields.io/badge/Robotiq-blue)](drivers/TSF-85/ROS/ROS2-Jazzy) | - | - |

- **Rolling** — ROS 2 rolling development distro, always tracking the latest sources.
- **Jazzy** — ROS 2 LTS release (2024), supported until 2029.
- **Iron** — ROS 2 release (2023), end of life.
- **Humble** — ROS 2 LTS release (2022), supported until 2027.
{/* AUTO-GENERATED-ROS2-TABLE:END */}

#### ROS1

{/* AUTO-GENERATED-ROS1-TABLE:START */}
| Product | Melodic | Kinetic | Jade | Indigo |
|---|---|---|---|---|
| [2F / Hand-E](drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS1-Melodic) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS1-Kinetic) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS1-Jade) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/ROS/ROS1-Indigo) |

- **Melodic** — ROS 1 release (2018), end of life.
- **Kinetic** — ROS 1 release (2016), end of life.
- **Jade** — ROS 1 release (2015), end of life.
- **Indigo** — ROS 1 release (2014), end of life.
{/* AUTO-GENERATED-ROS1-TABLE:END */}

### Physics engine

{/* AUTO-GENERATED-PHYSICS_ENGINE-TABLE:START */}
| Product | Isaac Sim | PyBullet |
|---|---|---|
| [2F / Hand-E](drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/Physics%20Engine/Isaac%20Sim) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/Physics%20Engine/PyBullet) |
| [TSF-85](drivers/TSF-85) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/TSF-85/Physics%20Engine/Isaac%20Sim) | - |

- **Isaac Sim** — NVIDIA Isaac Sim integration for simulating the hardware.
- **PyBullet** — PyBullet integration for physics-based simulation.
{/* AUTO-GENERATED-PHYSICS_ENGINE-TABLE:END */}

### Other community projects

{/* AUTO-GENERATED-OTHER-TABLE:START */}
| Product | GraspGen |
|---|---|
| [2F / Hand-E](drivers/2F%20hande) | [![Third party](https://img.shields.io/badge/Third_party-lightgrey)](drivers/2F%20hande/Other/GraspGen) |

- **GraspGen** — NVIDIA GraspGen asset/model package with Robotiq gripper definitions for grasp synthesis research.
{/* AUTO-GENERATED-OTHER-TABLE:END */}
Loading
Loading