Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
9f19db0
build: bump flexiv_rdk to release/v2.1 and drop CycloneDDS RMW
munseng-flexiv Jun 24, 2026
f42eb75
flexiv_msgs: match RDK v2.1 RobotStates fields and generate FastRTPS …
munseng-flexiv Jun 24, 2026
2113361
flexiv_hardware: support RDK v2.1 JointGroup API with real-time joint…
munseng-flexiv Jun 24, 2026
8e5859d
flexiv_robot_states_broadcaster: drop removed tau_des field and build…
munseng-flexiv Jun 24, 2026
39930a7
flexiv_gripper: migrate to RDK v2.1 JointGroup API with dual-arm grip…
munseng-flexiv Jun 24, 2026
cd0a096
flexiv_bringup: add dual-arm and MICO launch topologies and controlle…
munseng-flexiv Jun 24, 2026
0125503
flexiv_moveit_config: add dual-arm and MICO planning groups, controll…
munseng-flexiv Jun 24, 2026
e735eaa
flexiv_test_nodes: update robot states publisher for RDK v2.1 JointGr…
munseng-flexiv Jun 24, 2026
27bc5a0
docs: document v2.1 multi-model support and corrected GPIO port count
munseng-flexiv Jun 24, 2026
3e68b61
flexiv_hardware: enhance joint group handling for single and dual-arm…
munseng-flexiv Jun 25, 2026
e0ed0fc
Update flexiv_rdk and flexiv_description to version release/v2.1
munseng-flexiv Jun 25, 2026
3d82743
flexiv_hardware: treat the uncommandable ARMS-only joint group layout…
munseng-flexiv Jun 25, 2026
fd26cd2
flexiv_gripper: validate joint_group is a single-arm group of the con…
munseng-flexiv Jun 25, 2026
cc7a770
flexiv_bringup, flexiv_moveit_config: use per-arm gripper joint names…
munseng-flexiv Jun 25, 2026
6d42a40
flexiv_moveit_config: add MICO torso joint acceleration limits
munseng-flexiv Jun 26, 2026
4326ac8
Update flexiv_rdk and flexiv_description version references
munseng-flexiv Jun 29, 2026
08418ef
Add release lines and branch information for RDK versions in README
munseng-flexiv Jun 29, 2026
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
5 changes: 1 addition & 4 deletions .github/workflows/humble-binary-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ jobs:
env:
ROS_DISTRO: humble
RDK_INSTALL_PREFIX: ${{ github.workspace }}/rdk_install
RMW_IMPLEMENTATION: rmw_cyclonedds_cpp
steps:
- name: Checkout
uses: actions/checkout@v3
Expand All @@ -42,14 +41,13 @@ jobs:
ros-humble-robot-state-publisher \
ros-humble-ros2-control \
ros-humble-ros2-controllers \
ros-humble-rmw-cyclonedds-cpp \
ros-humble-test-msgs \
ros-humble-tinyxml2-vendor \
ros-humble-xacro
- name: Build and install flexiv_rdk
shell: bash
run: |
git clone --branch v2.0 --depth 1 https://github.com/flexivrobotics/flexiv_rdk.git
git clone --branch v2.1 --depth 1 https://github.com/flexivrobotics/flexiv_rdk.git
cd flexiv_rdk/thirdparty
bash build_and_install_dependencies.sh "${RDK_INSTALL_PREFIX}"
cd ..
Expand All @@ -65,7 +63,6 @@ jobs:
uses: ros-tooling/action-ros-ci@v0.4
env:
CMAKE_PREFIX_PATH: ${{ env.RDK_INSTALL_PREFIX }}
RMW_IMPLEMENTATION: ${{ env.RMW_IMPLEMENTATION }}
with:
target-ros2-distro: ${{ env.ROS_DISTRO }}
vcs-repo-file-url: ${{ github.workspace }}/flexiv.humble.repos
Expand Down
44 changes: 19 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,20 @@ For ROS 2 users to easily work with [RDK](https://github.com/flexivrobotics/flex
| **Branch** | [humble](https://github.com/flexivrobotics/flexiv_ros2/tree/humble) | [jazzy](https://github.com/flexivrobotics/flexiv_ros2/tree/jazzy) |
| **Release Status** | [![Humble Binary Build](https://github.com/flexivrobotics/flexiv_ros2/actions/workflows/humble-binary-build.yml/badge.svg?branch=humble)](https://github.com/flexivrobotics/flexiv_ros2/actions/workflows/humble-binary-build.yml) | [![Jazzy Binary Build](https://github.com/flexivrobotics/flexiv_ros2/actions/workflows/jazzy-binary-build.yml/badge.svg?branch=jazzy)](https://github.com/flexivrobotics/flexiv_ros2/actions/workflows/jazzy-binary-build.yml) |

> [!NOTE]
> **Release lines.** Two parallel version lines are maintained per ROS 2 distribution:
>
> | Line | Branch | RDK | Supported robots |
> | ------ | ------------------------------------------------------------------------- | -------- | ------------------------------------------------------- |
> | **v2** | [humble](https://github.com/flexivrobotics/flexiv_ros2/tree/humble) | RDK v2.x | Enlight-L, Enlight-LL, MICO-Core, MICO-Plus, MICO-Ultra |
> | **v1** | [humble-v1](https://github.com/flexivrobotics/flexiv_ros2/tree/humble-v1) | RDK v1.x | Rizon 4/4s/4M/4R/10/10s, AICO1/2 |
>
> The default `humble`/`jazzy` branches track the current **v2** line. For Rizon support on RDK v1.x, use the `humble-v1`/`jazzy-v1` branches. The two lines use incompatible RDK APIs and are not interchangeable.

## Getting Started

This project was developed for ROS 2 Humble (Ubuntu 22.04) and Jazzy (Ubuntu 24.04). Other versions of Ubuntu and ROS 2 may work, but are not officially supported.

This project uses CycloneDDS middleware (`rmw_cyclonedds_cpp`) for ROS 2 communication.

> [!WARNING]
> Fast DDS middleware (`rmw_fastrtps_cpp`) is not supported in this project.
> It causes a compilation conflict with `flexiv_rdk` (conflicting DDS/CMake targets).
> This guide uses CycloneDDS (`rmw_cyclonedds_cpp`) in all setup and runtime examples.

1. Install [ROS 2 Humble via Debian Packages](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html)

2. Install `colcon` and additional ROS packages:
Expand All @@ -53,8 +56,7 @@ This project uses CycloneDDS middleware (`rmw_cyclonedds_cpp`) for ROS 2 communi
ros-humble-joint-state-publisher \
ros-humble-joint-state-publisher-gui \
ros-humble-robot-state-publisher \
ros-humble-rviz2 \
ros-humble-rmw-cyclonedds-cpp
ros-humble-rviz2
```

3. Setup workspace:
Expand Down Expand Up @@ -96,7 +98,6 @@ This project uses CycloneDDS middleware (`rmw_cyclonedds_cpp`) for ROS 2 communi
```bash
cd ~/flexiv_ros2_ws
source /opt/ros/humble/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
colcon build --symlink-install --cmake-args -DCMAKE_PREFIX_PATH=~/rdk_install
source install/setup.bash
```
Expand All @@ -106,7 +107,6 @@ This project uses CycloneDDS middleware (`rmw_cyclonedds_cpp`) for ROS 2 communi
>
> ```bash
> source /opt/ros/humble/setup.bash
> export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
> source ~/flexiv_ros2_ws/install/setup.bash
> ```

Expand All @@ -117,18 +117,12 @@ This project uses CycloneDDS middleware (`rmw_cyclonedds_cpp`) for ROS 2 communi

The prerequisites of using ROS 2 with Flexiv robots are [enable RDK on the robot server](https://www.flexiv.com/software/rdk/manual/activate_rdk_server.html) and [establish connection](https://www.flexiv.com/software/rdk/manual/establish_connection.html) between the workstation PC and the robot.

Before running any `ros2 launch` command below, make sure CycloneDDS is selected:

```bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
```

All provided launch files prepend `${rdk_install_prefix}/lib` to `LD_LIBRARY_PATH` before starting Flexiv-backed nodes. The default launch argument assumes `flexiv_rdk` was installed to `~/rdk_install`, matching the build steps above. If you installed `flexiv_rdk` to a different prefix, pass `rdk_install_prefix:=/path/to/prefix` to the launch command.

The launch file to start the single-arm robot driver is `flexiv.launch.py` - it loads and starts the robot hardware, joint states broadcaster, Flexiv robot states broadcasters, and robot controller and opens RViZ. The arguments for the launch file are as follows:

- `robot_sn` (*required*) - Serial number of the robot to connect to. Remove any space, for example: EnlightL-123456
- `robot_type` (default: *EnlightL*) - type of the Flexiv single-arm robot. Supported values: *EnlightL*
- `robot_sn` (*required*) - Serial number of the robot to connect to. Remove any space, for example: Enlight-L-123456
- `robot_type` (default: *Enlight-L*) - type of the Flexiv robot. Supported values: *Enlight-L* (single-arm), *Enlight-LL*, *MICO-Core*, *MICO-Plus*, *MICO-Ultra* (dual-arm). Dual-arm models share one RDK connection (one `robot_sn`) and expose `left_`/`right_` prefixed joints. **Note:** *MICO-Ultra*'s mobile base is not yet supported in `ros2_control` — its arms (and pan-tilt torso) are controllable, but the mobile base is not driven by this stack.
- `rdk_control_mode` (default: *joint_position*) - Flexiv RDK control mode for ROS 2 joint position and velocity interfaces. Options: *joint_position* or *joint_impedance*
- `load_gripper` (default: *false*) - loads the Flexiv Grav gripper as the end-effector of the robot and the gripper control node.
- `use_fake_hardware` (default: *false*) - starts `FakeSystem` instead of real hardware. This is a simple simulation that mimics joint command to their states.
Expand All @@ -143,13 +137,13 @@ The launch file to start the single-arm robot driver is `flexiv.launch.py` - it
- Test with real robot:

```bash
ros2 launch flexiv_bringup flexiv.launch.py robot_sn:=[robot_sn] robot_type:=EnlightL
ros2 launch flexiv_bringup flexiv.launch.py robot_sn:=[robot_sn] robot_type:=Enlight-L
```

- Test with fake hardware (`ros2_control` capability):

```bash
ros2 launch flexiv_bringup flexiv.launch.py robot_sn:=EnlightL-123456 use_fake_hardware:=true
ros2 launch flexiv_bringup flexiv.launch.py robot_sn:=Enlight-L-123456 use_fake_hardware:=true
```

> [!TIP]
Expand All @@ -176,7 +170,7 @@ ros2 launch flexiv_bringup flexiv_moveit.launch.py robot_sn:=[robot_sn]
Test with fake hardware:

```bash
ros2 launch flexiv_bringup flexiv_moveit.launch.py robot_sn:=EnlightL-123456 use_fake_hardware:=true
ros2 launch flexiv_bringup flexiv_moveit.launch.py robot_sn:=Enlight-L-123456 use_fake_hardware:=true
```

### Robot States
Expand All @@ -194,16 +188,16 @@ The robot driver (`flexiv.launch.py`) publishes the following feedback states to

The aggregated `/${robot_sn}/flexiv_robot_states` message also includes the unfiltered wrench fields `raw_tcp_wrench_local` and `raw_tcp_wrench`, which are not published as separate topics.

For single-arm launch files, `robot_type` is the model selector.
For dual-arm models (*Enlight-LL*, *MICO-Core*, *MICO-Plus*, *MICO-Ultra*) two robot-states broadcasters run, publishing per-arm states under `left_`/`right_`-prefixed names, e.g. `/left_${robot_sn}/flexiv_robot_states` and `/right_${robot_sn}/flexiv_robot_states` (and the corresponding `tcp_pose`, `tcp_twist`, wrench topics). `/joint_states` contains all 14 arm joints with `left_`/`right_` prefixes (plus the `${robot_sn}_torso_joint1/2` joints on *MICO-Plus*/*MICO-Ultra*).

### GPIO

All digital inputs can be accessed via the ROS topic `/{robot_sn}/gpio_inputs`, which publishes the current state of all 24 digital input ports exposed through the Flexiv control interface *(True: port high, false: port low)*.
All digital inputs can be accessed via the ROS topic `/{robot_sn}/gpio_inputs`, which publishes the current state of all 20 digital input ports (16 on the control box plus 2 in each wrist connector) exposed through the Flexiv control interface *(True: port high, false: port low)*.

The digital output ports on the control box can be set by publishing to the topic `/{robot_sn}/gpio_outputs`. For example:

```bash
ros2 topic pub /EnlightL_123456/gpio_outputs flexiv_msgs/msg/GPIOStates "{states: [{pin: 0, state: true}, {pin: 2, state: true}]}"
ros2 topic pub /Enlight_L_123456/gpio_outputs flexiv_msgs/msg/GPIOStates "{states: [{pin: 0, state: true}, {pin: 2, state: true}]}"
```

### Gripper Control
Expand Down
4 changes: 2 additions & 2 deletions flexiv.humble.repos
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ repositories:
flexiv_description:
type: git
url: https://github.com/flexivrobotics/flexiv_description.git
version: humble-v2.0
version: humble-v2.1
flexiv_rdk:
type: git
url: https://github.com/flexivrobotics/flexiv_rdk.git
version: v2.0
version: v2.1
57 changes: 57 additions & 0 deletions flexiv_bringup/config/flexiv_dual_controllers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
controller_manager:
ros__parameters:
update_rate: 1000 # Hz

flexiv_arm_controller:
type: joint_trajectory_controller/JointTrajectoryController

joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster

gpio_controller:
type: gpio_controller/GPIOController

left_flexiv_robot_states_broadcaster:
type: flexiv_robot_states_broadcaster/FlexivRobotStatesBroadcaster

right_flexiv_robot_states_broadcaster:
type: flexiv_robot_states_broadcaster/FlexivRobotStatesBroadcaster

flexiv_arm_controller:
ros__parameters:
joints:
- left_$(var robot_sn)_joint1
- left_$(var robot_sn)_joint2
- left_$(var robot_sn)_joint3
- left_$(var robot_sn)_joint4
- left_$(var robot_sn)_joint5
- left_$(var robot_sn)_joint6
- left_$(var robot_sn)_joint7
- right_$(var robot_sn)_joint1
- right_$(var robot_sn)_joint2
- right_$(var robot_sn)_joint3
- right_$(var robot_sn)_joint4
- right_$(var robot_sn)_joint5
- right_$(var robot_sn)_joint6
- right_$(var robot_sn)_joint7
command_interfaces:
- position
state_interfaces:
- position
- velocity
state_publish_rate: 100.0
action_monitor_rate: 20.0
# Allow MoveIt to command a single-arm planning group (left_arm / right_arm) on this 14-joint
# controller.
allow_partial_joints_goal: true
constraints:
stopped_velocity_tolerance: 0.01
goal_time: 0.0

left_flexiv_robot_states_broadcaster:
ros__parameters:
robot_sn: left_$(var robot_sn)

right_flexiv_robot_states_broadcaster:
ros__parameters:
robot_sn: right_$(var robot_sn)
61 changes: 61 additions & 0 deletions flexiv_bringup/config/flexiv_mico_controllers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
controller_manager:
ros__parameters:
update_rate: 1000 # Hz

flexiv_arm_controller:
type: joint_trajectory_controller/JointTrajectoryController

joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster

gpio_controller:
type: gpio_controller/GPIOController

left_flexiv_robot_states_broadcaster:
type: flexiv_robot_states_broadcaster/FlexivRobotStatesBroadcaster

right_flexiv_robot_states_broadcaster:
type: flexiv_robot_states_broadcaster/FlexivRobotStatesBroadcaster

flexiv_arm_controller:
ros__parameters:
joints:
- left_$(var robot_sn)_joint1
- left_$(var robot_sn)_joint2
- left_$(var robot_sn)_joint3
- left_$(var robot_sn)_joint4
- left_$(var robot_sn)_joint5
- left_$(var robot_sn)_joint6
- left_$(var robot_sn)_joint7
- right_$(var robot_sn)_joint1
- right_$(var robot_sn)_joint2
- right_$(var robot_sn)_joint3
- right_$(var robot_sn)_joint4
- right_$(var robot_sn)_joint5
- right_$(var robot_sn)_joint6
- right_$(var robot_sn)_joint7
# Pan-tilt / waist torso (2-DoF EXT_AXIS group). Folded into the single arm controller so all
# actuated joints switch command mode together, as required by FlexivHardwareInterface.
- $(var robot_sn)_torso_joint1
- $(var robot_sn)_torso_joint2
command_interfaces:
- position
state_interfaces:
- position
- velocity
state_publish_rate: 100.0
action_monitor_rate: 20.0
# Allow MoveIt to command a joint subset (e.g. the both_arms / single-arm planning groups)
# without the torso joints.
allow_partial_joints_goal: true
constraints:
stopped_velocity_tolerance: 0.01
goal_time: 0.0

left_flexiv_robot_states_broadcaster:
ros__parameters:
robot_sn: left_$(var robot_sn)

right_flexiv_robot_states_broadcaster:
ros__parameters:
robot_sn: right_$(var robot_sn)
Loading
Loading