

How Cerulion Compares
How Cerulion compares across 14 dimensions:| 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 | 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 | Trigger topics, wait sets, synced topics, external triggers |
| 🧮 Smart serialization | Always serializes per topic | Only serializes if ≥1 network subscriber |
| 🦀 Backend | C++ | Rust (memory safety, no undefined behavior) |
| 🔗 Your ROS2 code | Stays in ROS2 | Runs faster in Cerulion — no changes needed |
The Case for Switching
100x Faster
Sub-microsecond shared memory transport. ~60 ns, not 6 ms.

0 Lines Changed
Your ROS2 nodes run directly in Cerulion’s runtime.

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 doesn’t ask you to rewrite your ROS2 nodes. It runs them faster.- 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. - Free upgrades — Existing nodes automatically get Cerulion’s transport, serialization, scheduling, and zero-copy logging. No code changes required.
- Incremental migration — Start by running your ROS nodes in Cerulion, then gradually adopt native APIs where it matters. 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.ROS2 Pain Points
Cerulion is built to eliminate the seven frustrations ROS2 teams run into every day: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 20% 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.