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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Changelog

## [0.6.0] - 2026-09-17

- Updated the driver for ROS 2 Rolling.
- Added support for up to ten axes.
- Added generic linear-axis position and velocity support.
- Added mock hardware support.
- Replaced Python launch files with XML launch files.
- Updated controller configuration, visual meshes, Docker configuration, and documentation.
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,11 @@ We currently support the Comau NJ-130-2.6. To add support for another Comau CRCO
* `ruckig_max_vel`, `ruckig_max_acc`, `ruckig_max_jrk` based on robot specs.
* `cal_data` from teach pendant (Setup → Motion → Calib).
* `tx_rate` from system variables (`$TX_RATE[i]`).
* Optional `is_linear`, which defaults to `false`; set it to `true` for a linear axis.
* `vr_TorqConst` for torque-to-current conversion.

5. **Configure controllers**
* Copy `controllers/controllers.yaml` and update controller names and joint lists if needed.
* Copy `config/controllers.yaml` and update controller names and joint lists if needed.

6. **Test your package and Verify on hardware**
* Ensure you have access to the physical robot for validation
Expand Down
26 changes: 15 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

[![DOI](https://zenodo.org/badge/1075309612.svg)](https://doi.org/10.5281/zenodo.17969100)

| ROS 2 Distro | **Humble** | **Jazzy** | **Rolling** |
|---|---|---|---|
| **Branch** | `humble` | `jazzy` | `main` |
| **Release status** | [![CI (humble)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=humble&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) | [![CI (jazzy)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=jazzy&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) | [![CI (main)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) |
| ROS 2 Distro | **Humble** | **Jazzy** | **Lyrical** | **Rolling** |
|---|---|---|---|---|
| **Branch** | `humble` | `jazzy` | `lyrical` | `main` |
| **Release status** | [![CI (humble)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=humble&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) | [![CI (jazzy)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=jazzy&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) | Coming soon | [![CI (main)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/ukaea/CRCOpenROS2Driver/actions/workflows/ci.yml) |


CRCOpen is an option available on Comau robot controller (CRC) cabinets to enable control of a robotic
Expand All @@ -31,7 +31,7 @@ A ROS 2 package with useful launch files as explained in the usage section of th

## Installation

Install ROS 2 Rolling following the [offical instructions for Ubuntu](https://docs.ros.org/en/rolling/Installation/Ubuntu-Install-Debs.html).
The `main` branch targets ROS 2 Rolling on Ubuntu 26.04. Install ROS 2 Rolling following the [offical instructions for Ubuntu](https://docs.ros.org/en/rolling/Installation/Ubuntu-Install-Debs.html).

Clone via Git or download the ZIP archive, depending on your preference:
```bash
Expand Down Expand Up @@ -106,21 +106,23 @@ This driver conforms as much as possible to the standards of [ros2_control](http

The `comau_bringup` package provides some launch files for convenience to be used as follows:

The launch files accept a `robot` argument, which defaults to `comau_nj_130_2_6`, and a `hardware` argument, which defaults to `crcopen` and can be set to `mock` for mock hardware. The core launch also accepts `activate_hardware`, which defaults to `false`; set it to `true` when hardware activation is required. The topic-control and custom-controller launch files activate the selected hardware automatically.

### Minimal usage

```
ros2 launch comau_bringup comau_core.launch.py
ros2 launch comau_bringup comau_core.launch.xml
```

This starts the core functionality of the driver, including a controller manager node and joint states publisher. For example, this can be used when wanting to publish the robot state in ROS 2 while moving the robot using the teach pendant.

### Topic based control

```
ros2 launch comau_bringup comau_control.launch.py mode:=*
ros2 launch comau_bringup comau_control.launch.xml mode:=*
```

This starts the core functionality in addition to a topic-based controller of the specified mode (`position`, `velocity`, `acceleration`, `current`, `effort`). The robot can then be controlled by sending `Float64MultiArray` messages to the `/*_controller/commands` topic.
This starts the core functionality in addition to a topic-based controller of the specified mode (`position`, `velocity`, `acceleration`, `current`, `effort`) or the controller `joint_trajectory` which can take actions or topics. The robot can then be controlled by sending `Float64MultiArray` messages to the `/*_controller/commands` topic.

### Other ros2_control controllers

Expand All @@ -129,10 +131,10 @@ If you want a controller beyond the built-in **topic-based** ones, you can imple
You can also reuse one of the generic controllers provided by [ros2_controllers](https://github.com/ros-controls/ros2_controllers). Some of these use topics in different ways (for example, a PID controller can take a reference input from a topic), while others are action- or service-driven (e.g. trajectory controllers).

```
ros2 launch comau_bringup comau_custom_controller.launch.py controller:=* param_file:=**
ros2 launch comau_bringup comau_custom_controller.launch.xml controller:=* param_file:=**
```

This starts the core functionality in addition to a custom ros2_control controller. The path to a controller parameter YAML file must be provided.
This starts the core functionality in addition to a custom ros2_control controller. The path to a controller parameter YAML file must be provided. Use `robot:=*` and `hardware:=mock` when selecting a different robot description or mock hardware.

## Driver Details

Expand Down Expand Up @@ -181,12 +183,14 @@ A suitable URDF will need to be created which can be based on [published CAD fil
In addition, the parameters for each joint in a `*.ros2_control.xacro` will need to be populated.
- `ruckig_max_vel` can be set based on the robot's technical specifications.

The interface can address up to ten open axes. Additional revolute axes can be described with the normal joint configuration. For a prismatic/linear joint, set `<param name="is_linear">true</param>` inside its `ros2_control` joint entry. Linear position and velocity use ROS SI units: metres and metres per second, so the corresponding linear Ruckig limits must also be supplied in those units. Linear force/effort conversion is not supplied because it requires actuator-specific mechanical data.

## Disclaimers

This ROS 2 driver was developed by UKAEA RACE Cybernetics engineers for internal research. While it has been tested extensively on our Comau NJ-130-2.6, it is provided as-is for research and development use only. **It is not intended for production or safety-critical applications** and may contain unforeseen bugs or limitations.

**Community-maintained**
- At the time of writing, we are actively building and testing against ROS 2 Rolling and Jazzy on Ubuntu 24.04; future support for newer ROS 2 or Ubuntu releases will depend on available resources.
- At the time of writing, we are actively building and testing against ROS 2 Jazzy on Ubuntu 24.04; future support for newer ROS 2 or Ubuntu releases will depend on available resources.
- Contributions of new robot descriptions or enhancements are welcome — see CONTRIBUTING.md for details.
- At the time of writing, this driver has been verified with ORL driver 4.41.5.31647. Older versions such as 4.41.4.31545 may partially work but are known to have issues. Compatibility with other ORL driver releases is therefore not guaranteed; however, we expect this driver to work with ORL 4.41.5 and above.

Expand Down
2 changes: 1 addition & 1 deletion comau_bringup/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.20)
project(comau_bringup)

# find dependencies
Expand Down
54 changes: 0 additions & 54 deletions comau_bringup/launch/comau_control.launch.py

This file was deleted.

49 changes: 49 additions & 0 deletions comau_bringup/launch/comau_control.launch.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<!--
This launch file launches the core ros2_control stack and spawns
a topic-based controller for a Comau robot.

Arguments:
robot
mode

Usage:
ros2 launch comau_bringup comau_control.launch.xml mode:=position
-->

<launch>

<arg name="robot"
default="comau_nj_130_2_6"
description="Robot model number (note: use '_' instead of '.' or ' ')">
</arg>

<arg name="hardware"
default="crcopen"
description="Parameter passed to the xacro to select the hardware used in the ros2_control tag.">
</arg>

<arg name="mode" description="Topic command controller to spawn.">
<choice value="position" />
<choice value="velocity" />
<choice value="acceleration" />
<choice value="current" />
<choice value="effort" />
<choice value="joint_trajectory" />
</arg>

<!-- Resolve the description package location -->
<let name="robot_package_share"
value="$(find-pkg-share $(var robot)_description)" />

<!-- Start Comau ROS2 core bringup -->
<include file="$(find-pkg-share comau_bringup)/launch/comau_core.launch.xml">
<arg name="robot" value="$(var robot)" />
<arg name="hardware" value="$(var hardware)" />
<arg name="activate_hardware" value="true" />
</include>

<!-- Spawn selected controller -->
<node pkg="controller_manager" exec="spawner"
args="$(var mode)_controller --param-file $(var robot_package_share)/config/controllers.yaml" />

</launch>
104 changes: 0 additions & 104 deletions comau_bringup/launch/comau_core.launch.py

This file was deleted.

56 changes: 56 additions & 0 deletions comau_bringup/launch/comau_core.launch.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<!--
This launch file starts the nodes that are always needed to control a Comau robot with ros2_control
Arguments:
robot
Usage:
ros2 launch comau_bringup comau_core.launch.xml
ros2 launch comau_bringup comau_core.launch.xml robot:=my_robot hardware:=mock
activate_hardware:=true
-->

<launch>

<arg name="activate_hardware"
default="false"
description="If true, activate hardware component and request drives on (requires teach pendant in Auto). Defaults to false to suit teach pendant manual mode.">
</arg>

<arg name="robot"
default="comau_nj_130_2_6"
description="Robot model number (note: use '_' instead of '.' or ' ')">
</arg>

<arg name="hardware"
default="crcopen"
description="Parameter passed to the xacro to select the hardware used in the ros2_control tag.">
</arg>

<!-- Resolve the description package location -->
<let name="robot_package_share"
value="$(find-pkg-share $(var robot)_description)" />

<!-- Main ros2_control node -->
<node pkg="controller_manager" exec="ros2_control_node" output="both"
if="$(var activate_hardware)">
<param name="update_rate" value="2500" />
<param name="enforce_command_limits" value="false" />
</node>

<node pkg="controller_manager" exec="ros2_control_node" output="both"
unless="$(var activate_hardware)">
<param name="update_rate" value="2500" />
<param name="enforce_command_limits" value="false" />
<param name="hardware_components_initial_state.inactive" value="$(var robot)" value-sep=", " />
</node>

<!-- Publishes TF -->
<node pkg="robot_state_publisher" exec="robot_state_publisher" output="both">
<param name="robot_description"
value="$(command 'xacro $(var robot_package_share)/urdf/$(var robot).urdf.xacro hardware:=$(var hardware)')" />
</node>

<!-- Publishes /joint_states -->
<node pkg="controller_manager" exec="spawner"
args="joint_state_broadcaster --param-file $(var robot_package_share)/config/controllers.yaml" />

</launch>
Loading
Loading