nuscenes-data 0.4.0

NuScenes dataset loader in Rust
Documentation
use super::serde_utils;
use crate::{
    serializable::{Token, VisibilityToken},
    utils::WithToken,
};
use chrono::naive::{NaiveDate, NaiveDateTime};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Attribute {
    pub token: Token,
    pub description: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibratedSensor {
    pub token: Token,
    pub sensor_token: Token,
    pub rotation: [f64; 4],
    #[serde(with = "serde_utils::camera_intrinsic")]
    pub camera_intrinsic: Option<[[f64; 3]; 3]>,
    pub translation: [f64; 3],
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Category {
    pub token: Token,
    pub description: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EgoPose {
    pub token: Token,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
    pub rotation: [f64; 4],
    pub translation: [f64; 3],
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Instance {
    pub token: Token,
    pub nbr_annotations: usize,
    pub category_token: Token,
    pub first_annotation_token: Token,
    pub last_annotation_token: Token,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Log {
    pub token: Token,
    pub date_captured: NaiveDate,
    pub location: String,
    pub vehicle: String,
    #[serde(with = "serde_utils::logfile")]
    pub logfile: Option<PathBuf>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Map {
    pub token: Token,
    pub log_tokens: Vec<Token>,
    pub filename: PathBuf,
    pub category: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sample {
    pub token: Token,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    pub scene_token: Token,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SampleAnnotation {
    pub token: Token,
    pub num_lidar_pts: isize,
    pub num_radar_pts: isize,
    pub size: [f64; 3],
    pub rotation: [f64; 4],
    pub translation: [f64; 3],
    pub sample_token: Token,
    pub instance_token: Token,
    pub attribute_tokens: Vec<Token>,
    pub visibility_token: Option<VisibilityToken>,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SampleData {
    pub token: Token,
    pub fileformat: FileFormat,
    pub is_key_frame: bool,
    pub filename: PathBuf,
    #[serde(with = "serde_utils::timestamp")]
    pub timestamp: NaiveDateTime,
    pub sample_token: Token,
    pub ego_pose_token: Token,
    pub calibrated_sensor_token: Token,
    #[serde(with = "serde_utils::opt_token")]
    pub prev: Option<Token>,
    #[serde(with = "serde_utils::opt_token")]
    pub next: Option<Token>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scene {
    pub token: Token,
    pub name: String,
    pub description: String,
    pub log_token: Token,
    pub nbr_samples: usize,
    pub first_sample_token: Token,
    pub last_sample_token: Token,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sensor {
    pub token: Token,
    pub modality: Modality,
    pub channel: Channel,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Visibility {
    pub token: VisibilityToken,
    pub level: VisibilityLevel,
    pub description: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum Modality {
    Camera,
    Lidar,
    Radar,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum FileFormat {
    Pcd,
    Jpg,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "kebab-case")]
pub enum VisibilityLevel {
    V0_40,
    V40_60,
    V60_80,
    V80_100,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Channel {
    CamBack,
    CamBackLeft,
    CamBackRight,
    CamFront,
    CamFrontLeft,
    CamFrontRight,
    CamFrontZoomed,
    LidarTop,
    RadarFront,
    RadarFrontLeft,
    RadarFrontRight,
    RadarBackLeft,
    RadarBackRight,
}

macro_rules! impl_with_token {
    ($name:path) => {
        impl WithToken for $name {
            fn token(&self) -> Token {
                self.token
            }
        }
    };
}

impl_with_token!(Attribute);
impl_with_token!(CalibratedSensor);
impl_with_token!(Category);
impl_with_token!(EgoPose);
impl_with_token!(Instance);
impl_with_token!(Log);
impl_with_token!(Map);
impl_with_token!(Sample);
impl_with_token!(SampleAnnotation);
impl_with_token!(SampleData);
impl_with_token!(Scene);
impl_with_token!(Sensor);