Industry News 6 min read

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.

M
med Developer and robotics enthusiast tracking the open source humanoid robot ecosystem.
ROS 2 Lyrical Luth Is Out: What's New in the Latest LTS

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

Share:

Newsletter

Weekly robotics digest, no spam.

Related Articles