Skip to main content

Recording Modes

Cerulion Core supports three different recording modes for MCAP logging. Choose the mode that best fits your use case.

Recording Mode Comparison

ModeUse CaseWhen Messages are LoggedBest For
Publisher LoggingRecord all messages sent by a publisherWhen send() is calledRecording your own node’s output
Subscriber LoggingRecord all messages received by a subscriberWhen receive() gets a messageRecording external sources (ROS2, other nodes)
Standalone RecorderRecord for a specific durationContinuously for a time periodTime-limited recording sessions

Publisher Logging

Enable logging on a publisher to record all sent messages.

When to Use

  • Recording messages from your own nodes
  • Logging sensor data your application produces
  • Capturing control commands your system sends

Example

use cerulion_core::prelude::*;
use std::sync::Arc;

#[derive(Copy, Clone, Debug)]
#[repr(C)]
struct SensorData {
    temperature: f32,
    timestamp: u64,
}

// Create MCAP recorder
let recorder = Arc::new(
    McapRecorder::create("publisher_log.mcap", None, None)?
);

// Create publisher
let mut publisher = Publisher::<SensorData>::create("sensors/data")?;

// Enable MCAP logging
publisher.enable_mcap_logging(recorder.clone());

// Messages will now be logged automatically when sent
let data = SensorData {
    temperature: 23.5,
    timestamp: 1234567890,
};
publisher.send(data)?;  // Automatically logged to MCAP
Once logging is enabled, all messages sent via publisher.send() are automatically logged to the MCAP file.

Subscriber Logging

Enable logging on a subscriber to record all received messages.

When to Use

  • Recording messages from external sources (ROS2 nodes via RCL Hooks)
  • Logging specific topics without modifying the publisher
  • Capturing network traffic for debugging

Example

use cerulion_core::prelude::*;
use std::sync::Arc;

// Create MCAP recorder
let recorder = Arc::new(
    McapRecorder::create("subscriber_log.mcap", None, None)?
);

// Create subscriber
let mut subscriber = Subscriber::<SensorData>::create("sensors/data", None)?;

// Enable MCAP logging
subscriber.enable_mcap_logging(recorder.clone());

// Messages will be logged automatically when received
if let Ok(Some(data)) = subscriber.receive() {
    // Message is automatically logged to MCAP
    println!("Received: {:?}", data);
}
Subscriber logging is particularly useful when you want to record messages from external sources (e.g., ROS2 nodes via RCL Hooks) or when you want to log only specific topics without modifying the publisher.

Standalone Recorder

Use a standalone recorder to record messages for a specific duration without modifying publishers or subscribers.

When to Use

  • Time-limited recording sessions (e.g., “record for 10 seconds”)
  • Recording without modifying existing code
  • Automated data collection scripts

Example

use cerulion_core::prelude::*;
use std::sync::Arc;
use std::time::{Duration, Instant};

// Create standalone recorder
let recorder = Arc::new(
    McapRecorder::create("standalone_log.mcap", None, None)?
);

// Create subscriber (without enabling logging on it)
let subscriber = Subscriber::<SensorData>::create("sensors/data", None)?;

// Record messages for a duration
let start = Instant::now();
recorder.record_from_subscriber(&subscriber, "sensors/data", || {
    start.elapsed() < Duration::from_secs(10)  // Record for 10 seconds
})?;

println!("Recording complete!");
The standalone recorder pattern is useful for time-limited recording or when you want to record messages from a subscriber without modifying the subscriber itself.

Using Multiple Recorders

You can use multiple recorders for different topics or recording sessions:
// Create separate recorders for different topics
let sensor_recorder = Arc::new(
    McapRecorder::create("sensors.mcap", None, None)?
);
let control_recorder = Arc::new(
    McapRecorder::create("control.mcap", None, None)?
);

// Enable logging with different recorders
sensor_publisher.enable_mcap_logging(sensor_recorder.clone());
control_publisher.enable_mcap_logging(control_recorder.clone());

Sharing a Single Recorder

Multiple publishers/subscribers can share the same recorder:
// Create one recorder
let recorder = Arc::new(
    McapRecorder::create("all_messages.mcap", None, None)?
);

// Share across multiple publishers/subscribers
publisher1.enable_mcap_logging(recorder.clone());
publisher2.enable_mcap_logging(recorder.clone());
subscriber1.enable_mcap_logging(recorder.clone());
Use a single shared recorder when you want all messages in one file for synchronized playback. Use separate recorders when you want to organize by topic or recording session.

Next Steps