1use super::serde_utils;
2use crate::{
3 serializable::{Token, VisibilityToken},
4 utils::WithToken,
5};
6use chrono::naive::{NaiveDate, NaiveDateTime};
7use serde::{Deserialize, Serialize};
8use std::path::PathBuf;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Attribute {
12 pub token: Token,
13 pub description: String,
14 pub name: String,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct CalibratedSensor {
19 pub token: Token,
20 pub sensor_token: Token,
21 pub rotation: [f64; 4],
22 #[serde(with = "serde_utils::camera_intrinsic")]
23 pub camera_intrinsic: Option<[[f64; 3]; 3]>,
24 pub translation: [f64; 3],
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct Category {
29 pub token: Token,
30 pub description: String,
31 pub name: String,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct EgoPose {
36 pub token: Token,
37 #[serde(with = "serde_utils::timestamp")]
38 pub timestamp: NaiveDateTime,
39 pub rotation: [f64; 4],
40 pub translation: [f64; 3],
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Instance {
45 pub token: Token,
46 pub nbr_annotations: usize,
47 pub category_token: Token,
48 pub first_annotation_token: Token,
49 pub last_annotation_token: Token,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct Log {
54 pub token: Token,
55 pub date_captured: NaiveDate,
56 pub location: String,
57 pub vehicle: String,
58 #[serde(with = "serde_utils::logfile")]
59 pub logfile: Option<PathBuf>,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct Map {
64 pub token: Token,
65 pub log_tokens: Vec<Token>,
66 pub filename: PathBuf,
67 pub category: String,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct Sample {
72 pub token: Token,
73 #[serde(with = "serde_utils::opt_token")]
74 pub next: Option<Token>,
75 #[serde(with = "serde_utils::opt_token")]
76 pub prev: Option<Token>,
77 pub scene_token: Token,
78 #[serde(with = "serde_utils::timestamp")]
79 pub timestamp: NaiveDateTime,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct SampleAnnotation {
84 pub token: Token,
85 pub num_lidar_pts: isize,
86 pub num_radar_pts: isize,
87 pub size: [f64; 3],
88 pub rotation: [f64; 4],
89 pub translation: [f64; 3],
90 pub sample_token: Token,
91 pub instance_token: Token,
92 pub attribute_tokens: Vec<Token>,
93 pub visibility_token: Option<VisibilityToken>,
94 #[serde(with = "serde_utils::opt_token")]
95 pub prev: Option<Token>,
96 #[serde(with = "serde_utils::opt_token")]
97 pub next: Option<Token>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct SampleData {
102 pub token: Token,
103 pub fileformat: FileFormat,
104 pub is_key_frame: bool,
105 pub filename: PathBuf,
106 #[serde(with = "serde_utils::timestamp")]
107 pub timestamp: NaiveDateTime,
108 pub sample_token: Token,
109 pub ego_pose_token: Token,
110 pub calibrated_sensor_token: Token,
111 #[serde(with = "serde_utils::opt_token")]
112 pub prev: Option<Token>,
113 #[serde(with = "serde_utils::opt_token")]
114 pub next: Option<Token>,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct Scene {
119 pub token: Token,
120 pub name: String,
121 pub description: String,
122 pub log_token: Token,
123 pub nbr_samples: usize,
124 pub first_sample_token: Token,
125 pub last_sample_token: Token,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct Sensor {
130 pub token: Token,
131 pub modality: Modality,
132 pub channel: Channel,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct Visibility {
137 pub token: VisibilityToken,
138 pub level: VisibilityLevel,
139 pub description: String,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
143#[serde(rename_all = "lowercase")]
144pub enum Modality {
145 Camera,
146 Lidar,
147 Radar,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
151#[serde(rename_all = "lowercase")]
152pub enum FileFormat {
153 Pcd,
154 Jpg,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
158#[serde(rename_all = "kebab-case")]
159pub enum VisibilityLevel {
160 V0_40,
161 V40_60,
162 V60_80,
163 V80_100,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
167#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
168pub enum Channel {
169 CamBack,
170 CamBackLeft,
171 CamBackRight,
172 CamFront,
173 CamFrontLeft,
174 CamFrontRight,
175 CamFrontZoomed,
176 LidarTop,
177 RadarFront,
178 RadarFrontLeft,
179 RadarFrontRight,
180 RadarBackLeft,
181 RadarBackRight,
182}
183
184macro_rules! impl_with_token {
185 ($name:path) => {
186 impl WithToken for $name {
187 fn token(&self) -> Token {
188 self.token
189 }
190 }
191 };
192}
193
194impl_with_token!(Attribute);
195impl_with_token!(CalibratedSensor);
196impl_with_token!(Category);
197impl_with_token!(EgoPose);
198impl_with_token!(Instance);
199impl_with_token!(Log);
200impl_with_token!(Map);
201impl_with_token!(Sample);
202impl_with_token!(SampleAnnotation);
203impl_with_token!(SampleData);
204impl_with_token!(Scene);
205impl_with_token!(Sensor);