1use std::path::Path;
2
3use clankers_core::{RobotResult, Timestamp};
4use clankers_ros2::{ImageMsg, RosMessage};
5
6use crate::writer::McapWriter;
7
8pub 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}