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
29 changes: 29 additions & 0 deletions .github/workflows/kilted_ros2_ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# This config uses industrial_ci (https://github.com/ros-industrial/industrial_ci.git).
# For troubleshooting, see README (https://github.com/ros-industrial/industrial_ci/blob/master/README.rst)
name: ROS2 kilted - CI

on: [push, pull_request]

jobs:
industrial_ci:
name: ROS ${{ matrix.ROS_DISTRO }} (${{ matrix.ROS_REPO }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ROS_DISTRO: [kilted]
ROS_REPO: [main]
env:
CCACHE_DIR: "${{ github.workspace }}/.ccache" # directory for ccache (and how we enable ccache in industrial_ci)
steps:
- uses: actions/checkout@v4 # clone target repository
- uses: actions/cache@v4 # fetch/store the directory used by ccache before/after the ci run
with:
path: ${{ env.CCACHE_DIR }}
key: ccache-${{ matrix.ROS_DISTRO }}-${{ matrix.ROS_REPO }}-${{github.run_id}}
restore-keys: |
ccache-${{ matrix.ROS_DISTRO }}-${{ matrix.ROS_REPO }}-
- uses: 'ros-industrial/industrial_ci@master'
env:
ROS_DISTRO: ${{ matrix.ROS_DISTRO }}
ROS_REPO: ${{ matrix.ROS_REPO }}
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.11
32 changes: 15 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,20 @@
# CRISP - `ros2_control` cartesian torque-based controllers

<img src="https://github.com/user-attachments/assets/284983f8-2311-4699-86ab-06fc2ea9d5af" alt="CRISP Controllers Logo" width="160" align="right"/>
<img src="media/crisp_logo.png" alt="CRISP Controllers Logo"/>

<a href="https://github.com/utiasDSL/crisp_controllers/actions/workflows/humble_ros2_ci.yml"><img src="https://github.com/utiasDSL/crisp_controllers/actions/workflows/humble_ros2_ci.yml/badge.svg"/></a>
<a href="https://github.com/utiasDSL/crisp_controllers/actions/workflows/jazzy_ros2_ci.yml"><img src="https://github.com/utiasDSL/crisp_controllers/actions/workflows/jazzy_ros2_ci.yml/badge.svg"/></a>
<a href="https://github.com/utiasDSL/crisp_controllers/actions/workflows/kilted_ros2_ci.yml"><img src="https://github.com/utiasDSL/crisp_controllers/actions/workflows/kilted_ros2_ci.yml/badge.svg"/></a>
<a href="https://github.com/utiasDSL/crisp_controllers/actions/workflows/rolling_ros2_ci.yml"><img src="https://github.com/utiasDSL/crisp_controllers/actions/workflows/rolling_ros2_ci.yml/badge.svg"/></a>
<a href="https://danielsanjosepro.github.io/crisp_controllers/"><img alt="Static Badge" src="https://img.shields.io/badge/docs-passing-blue?style=flat&link=https%3A%2F%2Fdanielsanjosepro.github.io%2Fcrisp_controllers%2F"></a>

Collection of C++ controllers for torque-based control for manipulators compatible with `ros2_control`, including Operational Space Control and Cartesian Impedance Control. The controllers are developed with intend to be used with learning-based policies (VLA, Diffusion Policies, ...). The controllers are robot agnostic and tested on the Franka Robotics FR3 Robot hardware in single and bimanual operation, as well as on multiple robots in simulation. Check out the [website](https://utiasdsl.github.io/crisp_controllers/) for demos!

## Demos

Some of the things that you can do with our controllers. Check the [crisp_controller_demos](https://github.com/utiasDSL/crisp_controllers_demos) for more information on how to get the controllers running on you robot.

| ![Franka](media/franka.gif) | ![kinova](media/kinova.gif) | ![iiwa](media/iiwa.gif) |
|:--:|:--:|:--:|
| *Robot following a moving target, while base joint follows a sine curve.* | *Simulated kinova robot with continous joints and nullspace control* | *Simulated iiwa robot example...* |

| ![franka_eight_reduced](media/franka_eight_reduced.gif) ![franka_ns_reduced](media/franka_ns_reduced.gif) | ![vicon](media/franka_teleop.gif)|
|:--:|:--:|
| *Real robot following a target and being disturbed (contact) + null space control demonstration* | *Demonstration using a cartesian controller teleoperated using Vicon tracking system (Speed x4)*|
CRISP is a collection of C++ controllers for torque-based control for manipulators compatible with `ros2_control`, including Operational Space Control and Cartesian Impedance Control. Robot agnostic and tested on the Franka Robotics FR3 Robot in single and bimanual operation. Check the [docs](https://danielsanjosepro.github.io/crisp_controllers/)!
Check the [project website](utiasDSL.github.io/crisp_controllers) for videos and more!

## Features

- 🤖 Operational Space Controller as well as Cartesian Impedance Controller for torque-based control.
- 🚫 No MoveIt or complicated path-planning, just a simple C++ `ros2_controller`. Ready to use.
- ⚙️ Dynamically and highly parametrizable: powered by the `generate_parameter_library` you can modify stiffness and more during operation.
- 🐍 Python interface to move your ROS2 robot around without having to think about topics, spinning, and more ROS2 jargon! Check [crisp_py](https://github.com/utiasDSL/crisp_py) for more information and examples.
- 🐍 Python interface to move your ROS2 robot around without having to think about topics, spinning, and more ROS2 concepts. Check [crisp_py](https://github.com/utiasDSL/crisp_py) for more information and examples.
- ❓ Demos showcasing how to use the controller with FR3 of Franka Emika in single and bimanual setup. Check the [crisp_controller_demos](https://github.com/utiasDSL/crisp_controllers_demos).

## Getting Started
Expand All @@ -50,3 +38,13 @@ touch src/crisp_controllers/COLCON_IGNORE # Forget about it
### Docker
You can try the controller with the provided Dockerfile and devcontainer setup in [crisp_controller_demos](https://github.com/utiasDSL/crisp_controllers_demos). Our docker setup uses the RT-capabilities if available. If you are using VSCode, you should be able
to open the container directly from there using the devcontainer plugin. Check [the devcontainer documentation](https://code.visualstudio.com/docs/devcontainers/containers) for more information.

### Update the website for contributors

We use [mkdocs](https://www.mkdocs.org/) to generate the website from markdown. You can modify it within `docs/` in particular the `index.md`.
Then you can serve it locally or update the github pages with:
```bash
uv run mkdocs serve
uv run mkdocs gh-deploy
```

28 changes: 21 additions & 7 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,47 @@ hide:
- toc
---

<img src="media/crisp_logo.png" alt="CRISP Controllers Logo" width="160" align="right"/>
# CRISP - **C**a**R**tesian **I**mpedance and Operational **SP**ace control for robotic arm manipulators.
*Authors: Daniel San Jose Pro, Oliver Hausdoerfer, Martin Schuck and Angela Schoellig.*
<img src="media/crisp_logo.webp" alt="CRISP Controllers Logo"/>

# CRISP - **C**a**R**tesian **I**mpedance and Operational **SP**ace Control for Learning-based Policies
*Authors: Daniel San Jose Pro, Oliver Hausdoerfer, Ralf Roemer, Martin Schuck and Angela Schoellig.*

> Collection of C++ controllers for torque-based control for manipulators compatible with `ros2_control`, including Operational Space Control and Cartesian Impedance Control.

Check the [controllers :simple-github:](https://github.com/utiasDSL/crisp_controllers) , robot [demos :simple-github:](https://github.com/utiasDSL/crisp_controllers_demos), and simple [python interface :simple-github:](https://github.com/utiasDSL/crisp_py).
Check the [controllers (crisp_controllers) :simple-github:](https://github.com/utiasDSL/crisp_controllers) , robot [demos (crisp_controllers_demos) :simple-github:](https://github.com/utiasDSL/crisp_controllers_demos), a simple [python interface (crisp_py) :simple-github:](https://github.com/utiasDSL/crisp_py), and a [gym wrapper (crisp_gym) :simple-github:](https://github.com/utiasDSL/crisp_gym) for real-world experiments.

| <video src="media/pap_demo.mp4" controls="true" loop="true" autoplay="true" width="800"/> | <video src="media/policy.mp4" controls="true" loop="true" autoplay="true" width="800"/> |
|:--:|:--:|
| Robot teleoperated using a Follower-Leader system in [crisp_gym :simple-github:](https://github.com/utiasDSL/crisp_gym) | Diffusion Policy trained and deployed from the same demonstrations. |


| ![Franka](media/franka.gif) | ![kinova](media/kinova.gif) | ![iiwa](media/iiwa.gif) |
|:--:|:--:|:--:|
| *Robot following a moving target, while base joint follows a sine curve.* | *Simulated kinova robot with continous joints and nullspace control* | *Another simulated robot example...* |

| ![franka_eight_reduced](media/franka_eight_reduced.gif) ![franka_ns_reduced](media/franka_ns_reduced.gif) | ![vicon](media/franka_teleop.gif)|
| ![franka_eight_reduced](media/franka_eight_reduced.gif)![franka_ns_reduced](media/franka_ns_reduced.gif) | ![vicon](media/franka_teleop.gif)|
|:--:|:--:|
| *Real robot following a target and being disturbed (contact) + null space control demonstration* | *Demonstration using a cartesian controller teleoperated using Vicon tracking system (Speed x4)*|


## Why?

Learning-based controllers, such as diffusion policies, deep reinforcement learning, and foundation models, typically output low-frequency or sporadic target poses, necessitating a low-level controller to track these references smoothly, especially in contact-rich environments.
Learning-based controllers, such as diffusion policies, deep reinforcement learning, and vision-action-models in general, typically output low-frequency or sporadic target poses, necessitating a low-level controller to track these references smoothly, especially in contact-rich environments.
While `ROS2` frameworks like `MoveIt` offer comprehensive motion planning capabilities, they are often unnecessarily complex for tasks requiring simple, real-time pose or joint servoing.

We present a set of lightweight, torque-based Cartesian and joint-space controllers implemented in C++ for `ros2_control`, compatible with any robot exposing an effort interface—a common standard among modern manipulators.
Our controllers incorporate friction compensation, joint limit avoidance, and error clipping, and have been validated on the Franka Robotics FR3 manipulator.

Designed for fast integration and real-time control, our implementation lowers the barrier to deploying learning-based algorithms on `ROS2`-compatible platforms.
The code is available at [github.com/utiasDSL/crisp_controllers](https://github.com/utiasDSL/crisp_controllers).

## Features

- 🤖 Operational Space Controller as well as Cartesian Impedance Controller for torque-based control.
- 🚫 No MoveIt or complicated path-planning, just a simple C++ `ros2_controller`. Ready to use.
- ⚙️ Dynamically and highly parametrizable: powered by the `generate_parameter_library` you can modify stiffness and more during operation.
- 🐍 Python interface to move your ROS2 robot around without having to think about topics, spinning, and more ROS2 concepts but without loosing the powerful ROS2 API. Check [crisp_py](https://github.com/utiasDSL/crisp_py) for more information and examples.
- 🔁 Gym environment with utilities to record trajectories in LeRobotFormat and deploy trained policies. Check [crisp_gym](https://github.com/utiasDSL/crisp_gym).
- ❓ Demos showcasing how to use the controller with FR3 of Franka Emika in single and bimanual setup. Check the [crisp_controller_demos](https://github.com/utiasDSL/crisp_controllers_demos).

## Citing

Expand Down
Binary file modified docs/media/crisp_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/crisp_logo.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/media/franka.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/media/iiwa.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/media/kinova.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/pap_demo.mp4
Binary file not shown.
Binary file added docs/media/policy.mp4
Binary file not shown.
Binary file added media/crisp_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/crisp_logo.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified media/franka.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified media/iiwa.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified media/kinova.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/pap_demo.mp4
Binary file not shown.
10 changes: 1 addition & 9 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,6 @@ theme:
favicon: images/favicon.png
palette:

# Palette toggle for automatic mode
- media: "(prefers-color-scheme)"
primary: grey
accent: grey
toggle:
icon: material/brightness-auto
name: Switch to light mode

# Palette toggle for light mode
- media: "(prefers-color-scheme: light)"
scheme: default
Expand All @@ -32,7 +24,7 @@ theme:
accent: grey
toggle:
icon: material/brightness-4
name: Switch to system preference
name: Switch to light mode
font:
text: Poppins
# text: Montserrat
Expand Down
10 changes: 10 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[project]
name = "crisp-controllers"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"mkdocs>=1.6.1",
"mkdocs-material>=9.6.15",
]
Loading