Skip to main content

clankers_data/
sample.rs

1use std::path::Path;
2
3use clankers_core::{RobotResult, Timestamp};
4use clankers_ros2::{ImageMsg, RosMessage};
5
6use crate::writer::McapWriter;
7
8/// Generate a small sample camera MCAP for tests and demos.
9pub fn generate_camera_log(path: impl AsRef<Path>) -> RobotResult<()> {
10    let path = path.as_ref();
11    if let Some(parent) = path.parent() {
12        std::fs::create_dir_all(parent)?;
13    }
14
15    let mut writer = McapWriter::create(path)?;
16    let num_frames = 200u32;
17    for i in 0..num_frames {
18        let w = 64u32;
19        let h = 64u32;
20        let mut data = vec![100u8; (w * h * 3) as usize];
21        data[0] = (i % 255) as u8;
22        let msg = ImageMsg::new(w, h, data);
23        let bytes = msg.serialize();
24        let ts = Timestamp::from_nanos(i as u64 * 33_000_000);
25        writer.write_message("/camera/image_raw", "sensor_msgs/Image", "json", &bytes, ts)?;
26    }
27    writer.finish()
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::inspect::McapLog;
34
35    #[test]
36    fn generate_and_inspect_sample() {
37        let dir = tempfile::tempdir().unwrap();
38        let path = dir.path().join("camera_log.mcap");
39        generate_camera_log(&path).unwrap();
40        let log = McapLog::open(&path).unwrap();
41        assert!(!log.report().topics.is_empty());
42    }
43
44    #[test]
45    fn generate_workspace_sample_data() {
46        let workspace = Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");
47        let path = workspace.join("sample_data/camera_log.mcap");
48        if path.exists() {
49            return;
50        }
51        if let Some(parent) = path.parent() {
52            let _ = std::fs::create_dir_all(parent);
53        }
54        generate_camera_log(&path).expect("generate sample_data/camera_log.mcap");
55    }
56}