nuscenes-data-nalgebra 0.1.0

Extension crate to nuscenes-data adding `nalgebra` integration
Documentation
use nalgebra as na;
use nuscenes_data::serializable::{CalibratedSensor, EgoPose, SampleAnnotation};

pub use nalgebra;

pub mod prelude {
    pub use super::{CalibratedSensorNalgebraExt, EgoPoseNalgebraExt, SampleAnnotationNalgebraExt};
}

pub trait CalibratedSensorNalgebraExt {
    fn na_camera_intrinsic_matrix(&self) -> Option<na::Matrix3<f64>>;
    fn na_translation(&self) -> na::Translation3<f64>;
}

impl CalibratedSensorNalgebraExt for CalibratedSensor {
    fn na_camera_intrinsic_matrix(&self) -> Option<na::Matrix3<f64>> {
        let iter = self.camera_intrinsic.as_ref()?.iter().flatten().cloned();
        Some(na::Matrix3::from_iterator(iter))
    }

    fn na_translation(&self) -> na::Translation3<f64> {
        self.translation.into()
    }
}

pub trait EgoPoseNalgebraExt {
    fn na_rotation(&self) -> na::UnitQuaternion<f64>;
    fn na_translation(&self) -> na::Translation3<f64>;
    fn na_transofrm(&self) -> na::Isometry3<f64>;
}

impl EgoPoseNalgebraExt for EgoPose {
    fn na_rotation(&self) -> na::UnitQuaternion<f64> {
        let quat: na::Quaternion<f64> = self.rotation.into();
        na::Unit::new_normalize(quat)
    }

    fn na_translation(&self) -> na::Translation3<f64> {
        self.translation.into()
    }

    fn na_transofrm(&self) -> na::Isometry3<f64> {
        na::Isometry3::from_parts(self.na_translation(), self.na_rotation())
    }
}

pub trait SampleAnnotationNalgebraExt {
    fn na_size(&self) -> na::Vector3<f64>;
    fn na_rotation(&self) -> na::UnitQuaternion<f64>;
    fn na_translation(&self) -> na::Translation3<f64>;
    fn na_transofrm(&self) -> na::Isometry3<f64>;
}

impl SampleAnnotationNalgebraExt for SampleAnnotation {
    fn na_rotation(&self) -> na::UnitQuaternion<f64> {
        let quat: na::Quaternion<f64> = self.rotation.into();
        na::Unit::new_normalize(quat)
    }

    fn na_translation(&self) -> na::Translation3<f64> {
        self.translation.into()
    }

    fn na_transofrm(&self) -> na::Isometry3<f64> {
        na::Isometry3::from_parts(self.na_translation(), self.na_rotation())
    }

    fn na_size(&self) -> na::Vector3<f64> {
        self.size.into()
    }
}