.crln graph file, and Cerulion handles transport, discovery, and routing automatically.
Think of topics like labeled conveyor belts in a factory β a node places a part on a belt, and every downstream station watching that belt gets it instantly, without anyone stopping to make a photocopy.

How It Works
Every pub/sub connection has three parts:- A publisher declares output ports with
#[out("name")] - A subscriber receives data as function parameters
- A graph file (
.crln) wires outputs to inputs by name
Publishing (Outputs)
Use#[out("name")] on return values to declare output ports. Return a tuple of your outputs.
Single Output
Multiple Outputs
Subscribing (Inputs)
Inputs are function parameters. The parameter name must match the input port name in your graph wiring.Single Input
Multiple Inputs
Trigger Types
Pick the trigger that matches your data flow pattern:| Trigger | Attribute | Fires when⦠|
|---|---|---|
| Default | #[node] | Any input receives new data |
| Specific Input | #[node(trigger = "input_name")] | A named input receives new data |
| Periodic | #[node(period_ms = N)] | Every N milliseconds (clock-driven) |
| Synchronized | #[node(sync = {"a": 50, "b": 50})] | Multiple inputs arrive within time windows |
| External | #[node(external_trigger = "fn_name")] | A custom function returns true |
Periodic β clock-driven publishers
Periodic β clock-driven publishers
Runs on a fixed interval. Ideal for sensors, data sources, and anything that produces data at a known rate.
Specific input β event-driven processing
Specific input β event-driven processing
Runs when a named input receives new data. The most common pattern for processing pipelines.
Default β any input fires
Default β any input fires
Runs whenever any input has new data. Useful for fusion nodes that should react to whichever sensor updates first.
With the default trigger, the node reads the latest value from all inputs β even ones that didnβt trigger the current run.
Synchronized β time-aligned inputs
Synchronized β time-aligned inputs
Waits for multiple inputs to arrive within specified time windows (in milliseconds). Essential for stereo vision, multi-sensor fusion, and any pipeline where data must be temporally aligned.
External β custom trigger logic
External β custom trigger logic
Runs when a custom function returns
true. Use this for button presses, external signals, hardware interrupts, or any trigger logic that doesnβt come from a Cerulion topic.Graph Wiring
Connect node outputs to inputs in your.crln file. This is where your pipeline takes shape.
Transport
Cerulion automatically selects the fastest transport based on where nodes are running β you never configure this.| Scenario | Transport | Latency |
|---|---|---|
| Same machine | iceoryx2 (shared memory) | < 1 ΞΌs |
| Different machines | Zenoh (network) | 1β10 ms |
Core ROS2 message types β
Image, Twist, PointCloud2, LaserScan, and more β work with both transports. See Wireformat Messages for the full list of included types.