# Ros2\_control in Lyrical Luth: what's new

**URL:** <https://discourse.openrobotics.org/t/ros2-control-in-lyrical-luth-whats-new/59593>\
**Category:** ros-controls Announcements and News\
**Tags:** release, lyrical\
**Created:** [November 6, 2026, 2:30pm UTC](https://discourse.openrobotics.org/t/ros2-control-in-lyrical-luth-whats-new/59593 "2026-11-06T14:30:25Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![christophfroehlich](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/christophfroehlich/32/31526_2.png) [@christophfroehlich](https://discourse.openrobotics.org/u/christophfroehlich)\
**Post date:** [November 6, 2026, 2:30pm UTC](https://discourse.openrobotics.org/t/ros2-control-in-lyrical-luth-whats-new/59593/1 "2026-11-06T14:30:25Z")

</div>

Lyrical Luth has been marked as **stable/released** in ros2\_control, ros2\_controllers, control\_toolbox and realtime\_tools. Here are the main changes since Kilted Kaiju. A few of them change default behaviour, so read the **⚠ Breaking / behaviour changes** subsections before you upgrade.  
For what the stable label means for API and ABI stability from here on, see [Releases, versioning and public API claim of ros-controls](https://discourse.openrobotics.org/t/releases-versioning-and-public-api-claim-of-ros-controls/50388/3).

> 🎷 **= backported to Jazzy.** The number after the icon is the first Jazzy release of that package to include the change. If you’re still on Jazzy, you can already use these.

Full details:

- [Release notes](https://control.ros.org/lyrical/doc/release_notes/release_notes.html)
- [Migration guides](https://control.ros.org/lyrical/doc/migration/migration.html)
- `CHANGELOG.rst` of each package

* * *

## ros2\_control

### ⚠ Breaking / behaviour changes

- **The handle and export APIs deprecated since Jazzy have been removed** ([#3610](https://github.com/ros-controls/ros2_control/pull/3610)). See the [announcement](https://discourse.openrobotics.org/t/upcoming-breaking-changes-in-ros2-control-deprecated-handle-export-apis-removed/58708) and the [migration guide](https://control.ros.org/lyrical/doc/ros2_control/doc/migration.html) for step-by-step instructions.
  - Hardware components: `export_state_interfaces()` / `export_command_interfaces()` are gone. The framework now creates the interfaces from the `<ros2_control>` tag; use `set_state`/`get_state` and `set_command`/`get_command` to access the values.
  - `StateInterface` / `CommandInterface` can no longer be built from a `double*`. Handles now own their value.
  - Chainable controllers: `on_export_state_interfaces()` / `on_export_reference_interfaces()` are replaced by `on_export_*_interfaces_list()`, which return shared pointers.

- **`switch_controller` is now `strict` by default** ([#2742](https://github.com/ros-controls/ros2_control/pull/2742)).
- **`configure_controller` only accepts `unconfigured` controllers.** The `spawner` now skips controllers that are already configured; pass `--reconfigure` to clean up and configure them again ([#3196](https://github.com/ros-controls/ros2_control/pull/3196)).
- **The controller manager’s ROS arguments are no longer forwarded to controllers** ([#3016](https://github.com/ros-controls/ros2_control/pull/3016)).
- **A failing controller now deactivates its whole chain** ([#2681](https://github.com/ros-controls/ros2_control/pull/2681)). 🎷 4.39.0
- **Controller update rates are rounded to the nearest achievable rate** when the requested rate does not divide evenly into the controller manager’s rate ([#2828](https://github.com/ros-controls/ros2_control/pull/2828)). 🎷 4.41.0

### New features

- **More data types in handles:** besides `double` and `bool`, handles now also support `float32`, `int8/16/32` and `uint8/16/32` ([#2879](https://github.com/ros-controls/ros2_control/pull/2879)). 🎷 4.42.0
- **New interface configuration types `INDIVIDUAL_BEST_EFFORT` and `REGEX`** for more flexible interface claiming ([#2902](https://github.com/ros-controls/ros2_control/pull/2902)). 🎷 4.42.0
- New `MagneticFieldSensor` semantic component ([#2627](https://github.com/ros-controls/ros2_control/pull/2627)). 🎷 4.39.0
- New `cleanup_controller` service and CLI verb ([#2414](https://github.com/ros-controls/ros2_control/pull/2414)), and `ros2 control unload_controller --all-inactive` ([#3466](https://github.com/ros-controls/ros2_control/pull/3466)). 🎷 4.42.0 / 4.48.0
- New `handle_exceptions` parameter: choose whether exceptions thrown in a controller’s `update()` are caught by the controller manager or propagated ([#2807](https://github.com/ros-controls/ros2_control/pull/2807)). 🎷 4.40.0
- **spawner:** separate arguments for each controller when using `--controller` ([#2895](https://github.com/ros-controls/ros2_control/pull/2895)) 🎷 4.44.0. Parameter files are matched the same way `rclcpp` does it, including namespaces and wildcards ([#3719](https://github.com/ros-controls/ros2_control/pull/3719)).
- `simple_transmission` and `differential_transmission` support the `force` interface ([#2588](https://github.com/ros-controls/ros2_control/pull/2588)). 🎷 4.39.0

* * *

## ros2\_controllers

### ⚠ Breaking / behaviour changes

- **joint\_trajectory\_controller: `constraints.goal_time` now defaults to `10.0` s, and its meaning has changed.** A negative value now waits indefinitely; `0.0` now means no grace period. `action_execution_timeout` has been removed ([#2592](https://github.com/ros-controls/ros2_controllers/pull/2592)).
- **joint\_state\_broadcaster no longer publishes `dynamic_joint_states`.** Use `state_interfaces_broadcaster` or `gpio_controllers` instead ([#2187](https://github.com/ros-controls/ros2_controllers/pull/2187)).
- **`JointGroupPositionController`, `JointGroupVelocityController` and `JointGroupEffortController` are deprecated.** Use `forward_command_controller` with the `interface_name` parameter instead ([#1913](https://github.com/ros-controls/ros2_controllers/pull/1913)).
- **diff\_drive / mecanum\_drive / omni\_wheel\_drive controllers:** `tf_frame_prefix_enable` is deprecated. Set `tf_frame_prefix: ""` instead, or `"~"` to use the node namespace ([#1997](https://github.com/ros-controls/ros2_controllers/pull/1997)). diff\_drive\_controller’s `publish_rate` parameter has been removed ([#2259](https://github.com/ros-controls/ros2_controllers/pull/2259)).

### 🚀 New controllers

- **battery\_state\_broadcaster** ([#2086](https://github.com/ros-controls/ros2_controllers/pull/2086)). 🎷 4.42.0
- **state\_interfaces\_broadcaster** ([#2006](https://github.com/ros-controls/ros2_controllers/pull/2006)). 🎷 4.36.0
- **magnetometer\_broadcaster** ([#2214](https://github.com/ros-controls/ros2_controllers/pull/2214)). 🎷 4.41.0

### New features

- **joint\_trajectory\_controller:**
  - **Trajectory replacement from ROS 1 is back** (`allow_trajectory_replacement`): a new goal is spliced into the running trajectory instead of replacing it ([#2419](https://github.com/ros-controls/ros2_controllers/pull/2419)).
  - **Decelerate to stop on cancel/preempt** with `max_deceleration_on_cancel` ([#2163](https://github.com/ros-controls/ros2_controllers/pull/2163)). 🎷 4.39.0
  - **Upsampling of positions-only action chunks** into a smooth spline, useful for learned policies that run at a low rate (`positions_upsampling.enable`) ([#2491](https://github.com/ros-controls/ros2_controllers/pull/2491)).

- **Mobile robot controllers:** new service to set the odometry at runtime ([#2096](https://github.com/ros-controls/ros2_controllers/pull/2096), [#2110](https://github.com/ros-controls/ros2_controllers/pull/2110), [#2148](https://github.com/ros-controls/ros2_controllers/pull/2148), [#2244](https://github.com/ros-controls/ros2_controllers/pull/2244)).
- **force\_torque\_sensor\_broadcaster:** can publish the wrench transformed into a list of target frames ([#2021](https://github.com/ros-controls/ros2_controllers/pull/2021)). 🎷 4.35.0
- **pid\_controller:** `set_current_state_as_first_setpoint` avoids jumps on activation ([#2205](https://github.com/ros-controls/ros2_controllers/pull/2205)) 🎷 4.39.0; `reset_commands_at_deactivation` ([#2602](https://github.com/ros-controls/ros2_controllers/pull/2602)) 🎷 4.43.0.

* * *

## control\_toolbox

- New templated `ExponentialFilter` class ([#493](https://github.com/ros-controls/control_toolbox/pull/493)).
- `LowPassFilter::configure()` can set the filter’s initial state ([#657](https://github.com/ros-controls/control_toolbox/pull/657)).

## realtime\_tools

- New `LockFreePooledSPSCQueue` for large or move-only types ([#606](https://github.com/ros-controls/realtime_tools/pull/606)). 🎷 3.14.1

* * *

Thank you to everyone who contributed code, reviews, issues and testing this cycle! 🙏  
Please report problems on the [ros-controls GitHub](https://github.com/ros-controls).
