ROS 2 Lyrical Luth Is Out: What's New in the Latest LTS
ROS 2 Lyrical Luth is now available as the twelfth ROS 2 release and the latest Long Term Support (LTS) edition, supported until May 2031. Here's a breakdown of the features that matter most for robotics developers.
The Open Robotics team has shipped ROS 2 Lyrical Luth — the twelfth release of the Robot Operating System 2 and the newest Long Term Support (LTS) edition. It will receive updates until May 2031, making it a solid foundation for production robots.
Here’s what changed, why it matters, and what you should know before upgrading.
Platform Support
Lyrical bumps the Tier 1 platform lineup:
- Ubuntu 26.04 (amd64) — new Tier 1
- Ubuntu 24.04 (amd64) — remains Tier 1
- Red Hat Enterprise Linux 10 — new Tier 1
If you are still on Ubuntu 22.04, note that it is no longer a Tier 1 target for this release. The shift to newer base systems allows the ROS 2 core to adopt newer compiler features and system libraries.
Performance & Concurrency
Callback Group Events Executor
The new EventsCBGExecutor in rclcpp extends the existing EventsExecutor with support for multiple ROS time sources and multiple threads. The result is a 10–15% CPU reduction compared to the single- and multi-threaded executors. You can instantiate it directly in code or launch a composable container with --executor-type events-cbg.
Zero-Copy Publishing with rosidl::Buffer
You can now publish messages without copying the underlying data by using rosidl::Buffer. This lets you reuse existing memory allocations across publish calls, which is a meaningful win for high-frequency sensor nodes and embedded targets with tight memory budgets.
Python & Launch Improvements
AsyncIO Support in rclpy
The new AsyncNode base class in rclpy lets you write ROS 2 nodes using Python’s asyncio event loop. That means you can await ROS service calls, timers, and subscriptions without blocking the main thread or spinning up extra threads manually. For teams already using async patterns in their Python stack, this removes a lot of glue code.
Per-Message Log Severity in Launch Files
Launch files now support <log> tags with a level attribute, so you can override the severity of individual log messages. This is useful when you want to suppress noisy info logs from third-party nodes without touching their source code.
New XML/YAML Launch Substitutions
Four new substitutions are available in XML and YAML launch files: ENV, VAR, PYEVAL, and XMLEVAL. You can read environment variables, resolve YAML variables, evaluate inline Python, and evaluate inline XML expressions directly inside launch descriptions.
Pluggable Logging Backends
You can now choose the ROS logging backend at runtime via the RCUTILS_LOGGING_BACKEND environment variable. Supported values are stdout and rcutils. This makes it easier to redirect logs to custom infrastructure without recompiling anything.
Bag Recording & Playback
Remote Control via ROS Services
rosbag2 now exposes ROS services for controlling recording and playback. You can pause, resume, stop, and split bags programmatically from any node on the network. This is a big deal for long-duration field tests where you want to start recording only when a specific event triggers.
Circular Recording with Bag Limits
You can configure circular recording with a --max-bag-size limit in bytes. Once the limit is hit, rosbag2 starts deleting the oldest split files. This keeps disk usage bounded during extended deployments.
Message-Loss Observability
rosbag2 now reports message loss metrics. If your recorder is dropping messages because the disk or network cannot keep up, you will see it in the output rather than silently losing data.
More Descriptive Split Names
Split bag files now include timestamps and sequence numbers in their filenames, making it much easier to identify which file contains which time range without inspecting metadata.
Developer Experience
fish Shell Support
ROS 2 setup files now include fish shell support out of the box, alongside bash and zsh.
Bulk Parameter Operations
ros2 param get can now fetch a parameter from all nodes at once. ros2 param set supports setting multiple parameters on a single node in one call. Both are small but real time-savers during bring-up and debugging.
Richer ros2 doctor --report
The report now includes Actions, Services, and environment variables, giving a more complete snapshot of your running system.
Verbose Service Info
ros2 service info --verbose prints detailed metadata about services, including type names and QoS policies.
Multi-Topic Bandwidth
ros2 topic bw can now monitor multiple topics simultaneously, which simplifies diagnosing bandwidth bottlenecks on multi-sensor robots.
Modeling & Simulation
URDF Improvements
URDF parsing is now stricter: continuous joints without <limit> elements, missing <joint> tags inside <transmission>, and <link> without <inertial> elements will all raise errors instead of being silently ignored. This catches broken robot descriptions earlier in the pipeline.
robot_state_publisher Reads from Topic
The robot_state_publisher can now receive the robot description from a /robot_description topic in addition to the traditional parameter. This makes it easier to swap robot models at runtime and plays nicer with systems that already publish descriptions dynamically.
Resource Retriever Service
A new resource retriever service allows nodes to fetch external resources via resource:// URIs using a centralized service rather than direct filesystem access. This is especially useful in sandboxed or containerized deployments.
Tracing
Runtime Opt-Out
You can now disable LTTng tracing at runtime with --ros-args --enclave <no_tracing>, even if tracing is compiled in. This is useful when you want tracing available in debug builds but completely disabled in production without recompiling.
Dual-Session Tracing
The new dual-session mode solves the initialization-data-loss problem. It starts an initialization session in snapshot mode alongside a normal runtime session, so you can start tracing at any moment without losing the early boot events.
Should You Upgrade?
If you are starting a new project, Lyrical is the obvious choice. The LTS promise, combined with the executor and bag recording improvements, makes it the most production-ready ROS 2 release to date.
If you are on Jazzy, you have until May 2029, but the new AsyncNode, remote bag control, and zero-copy publishing are compelling reasons to plan a migration. If you are on Iron or earlier, the upgrade path is well worth the effort.
Release date: May 2026
LTS support ends: May 2031
Tier 1: Ubuntu 26.04, Ubuntu 24.04, RHEL 10
Official announcement: discourse.openrobotics.org
Release notes: docs.ros.org