Your middleware is eating 18% of your frame budget. At 30 Hz, your camera driver has 33 ms per frame. ROS2’s default transport burns 6 ms just moving a camera image from one node to another. That’s 18% of your frame budget gone — before your perception, planning, or control code even runs.Documentation Index
Fetch the complete documentation index at: https://docs.cerulion.com/llms.txt
Use this file to discover all available pages before exploring further.

How Cerulion Compares
| Dimension | ROS2 | Cerulion |
|---|---|---|
| ⚡ Latency | Several ms, scales with payload | ~60 ns, payload-agnostic |
| 🧠 Shared memory | Available but not default; expert config required | Default, zero-copy, no config — just works |
| 📐 Variable-size messages | Cannot do zero-copy SHM for unsized arrays | Zero-copy SHM even for variable-size messages |
| 🔄 Serialization | Always serializes — even for SHM, even without subscribers | Only serializes for network transport, only if subscriber exists |
| 📦 Wire format | Heap-allocated, fragmented | Contiguous, zero-copy friendly |
| ✂️ Lines of code | Massive boilerplate | Fraction of the code |
| 🌐 Transport | Entire stack locked to one transport | Automatic per-topic transport selection |
| 🎯 Determinism | Non-deterministic | Deterministic runtime |
| 📝 Logging | Bag recording slows the stack | Zero-copy logging — no performance impact |
| 🔨 Build system | colcon/ament | Cargo-based |
| ⏱️ Scheduler | Limited triggers | Periodic, input, synchronized, and external triggers — explicit and deterministic |
| 🦀 Backend | C++ | Rust (memory safety, no undefined behavior) |
| 🔗 Your ROS2 code | Stays in ROS2 | Same patterns reimplemented in Cerulion’s Rust API |
The Problems With ROS2
Seven pain points. All of them solved.Expert-only efficiency
Expert-only efficiency
To use ROS2 efficiently, you need deep knowledge of shared memory configuration, transport tuning, and camera synchronization. It’s a secret society of documentation. You shouldn’t need to be a middleware expert to build robots — it should just work, like how Python dictionaries just work without you understanding hash tables.
Wasted frame budget
Wasted frame budget
At 30 Hz, you have 33 ms per frame. ROS2’s default transport burns 6 ms moving a camera image between nodes. That’s 18% of your frame budget gone before your application code runs.
Unnecessary serialization
Unnecessary serialization
ROS2 always serializes, whether or not there’s a subscriber. CPU cycles wasted on every publish, every topic, even when data stays on the same machine.
Debug/production divergence
Debug/production divergence
Bag recording slows the stack, so your robot behaves differently when you’re logging. The failure you’re trying to debug isn’t the behavior you recorded.
Non-determinism breaks resim
Non-determinism breaks resim
You can’t replay logs and get the same behavior. For self-driving and safety-critical applications, this is disqualifying.
Transport inflexibility
Transport inflexibility
You can’t use TCP for reliable inter-robot communication and UDP for fast visualization on the same system. One transport for everything.
Variable-size message pain
Variable-size message pain
ROS2 can’t do zero-copy shared memory for messages with unsized arrays (like images). You either accept the copy overhead or force vendors to specify exact pixel counts.
The Case for Switching
100x Faster
Sub-microsecond shared memory transport. ~60 ns, not 6 ms.

Incremental Migration
Same message types, same pub/sub architecture — port one node at a time.

0% Overhead
Zero-copy logging that never slows your robot.
Bridge vs Cerulion

Code Comparison
The same pub/sub pattern — publishing an image from a camera node. Compare what it takes in ROS2 vs Cerulion.main() function. Cerulion requires a function with an attribute macro.
Both publish the same sensor_msgs/Image. But Cerulion’s version uses zero-copy shared memory for local subscribers and only serializes if a network subscriber exists. ROS2 serializes on every publish, regardless.
Coming Soon Python SDK and C++ SDK are in development.
Backwards Compatibility
Cerulion preserves your ROS2 mental model — same message types, same pub/sub patterns, faster backend.- Standard message types —
sensor_msgs/Image,geometry_msgs/Twist,sensor_msgs/PointCloud2, andsensor_msgs/LaserScanall work with zero-copy shared memory. No type changes needed. - Familiar patterns — Nodes, topics, pub/sub — the same architecture you know from ROS2. Reimplemented in Rust with Cerulion’s API, your nodes get zero-copy transport, deterministic scheduling, and zero-copy logging automatically.
- Incremental migration — Start by migrating one node at a time. No big-bang rewrite.
- Rust backend safety — Memory safety (no segfaults from middleware bugs), no undefined behavior, and fearless concurrency. Your middleware shouldn’t be a source of production crashes. Learn more about the Rust backend.
Your existing ROS2 pub/sub patterns work out of the box. Standard message types like
Image, Twist, PointCloud2, and LaserScan are all supported.