use nalgebra as na;
use std::path::PathBuf;
use crate::core::camera::Intrinsics;
use crate::misc::type_aliases::{Float, Iso3};
pub const DEPTH_SCALE: Float = 5000.0;
pub const VARIANCE_ICL_NUIM: Float = 0.0001;
pub const INTRINSICS_ICL_NUIM: Intrinsics = Intrinsics {
principal_point: (319.5, 239.5),
focal: (481.20, -480.00),
skew: 0.0,
};
#[allow(clippy::excessive_precision)]
pub const INTRINSICS_FR1: Intrinsics = Intrinsics {
principal_point: (318.643_040, 255.313_989),
focal: (517.306_408, 516.469_215),
skew: 0.0,
};
#[allow(clippy::excessive_precision)]
pub const INTRINSICS_FR2: Intrinsics = Intrinsics {
principal_point: (325.141_442, 249.701_764),
focal: (520.908_620, 521.007_327),
skew: 0.0,
};
#[allow(clippy::excessive_precision)]
pub const INTRINSICS_FR3: Intrinsics = Intrinsics {
principal_point: (320.106_653, 247.632_132),
focal: (535.433_105, 539.212_524),
skew: 0.0,
};
#[derive(Debug)]
pub struct Frame {
pub timestamp: f64,
pub pose: Iso3,
}
#[derive(Debug)]
pub struct Association {
pub depth_timestamp: f64,
pub depth_file_path: PathBuf,
pub color_timestamp: f64,
pub color_file_path: PathBuf,
}
impl std::string::ToString for Frame {
fn to_string(&self) -> String {
let t = self.pose.translation.vector;
let q = self.pose.rotation.into_inner().coords;
format!(
"{} {} {} {} {} {} {} {}",
self.timestamp, t.x, t.y, t.z, q.x, q.y, q.z, q.w
)
}
}
pub mod parse {
use super::*;
use nom::{
alt, anychar, do_parse, double, float, is_not, many0, map, named, space, tag,
types::CompleteStr,
};
pub fn associations(file_content: &str) -> Result<Vec<Association>, String> {
multi_line(association_line, file_content)
}
pub fn trajectory(file_content: &str) -> Result<Vec<Frame>, String> {
multi_line(trajectory_line, file_content)
}
fn multi_line<F, T>(line_parser: F, file_content: &str) -> Result<Vec<T>, String>
where
F: Fn(CompleteStr) -> nom::IResult<CompleteStr, Option<T>>,
{
let mut vec_data = Vec::new();
for line in file_content.lines() {
match line_parser(CompleteStr(line)) {
Ok((_, Some(data))) => vec_data.push(data),
Ok(_) => (),
Err(_) => return Err("Parsing error".to_string()),
}
}
Ok(vec_data)
}
named!(association_line<CompleteStr, Option<Association> >,
alt!( map!(comment, |_| None) | map!(association, Some) )
);
named!(association<CompleteStr, Association>,
do_parse!(
depth_timestamp: double >> space >>
depth_file_path: path >> space >>
color_timestamp: double >> space >>
color_file_path: path >>
(Association { depth_timestamp, depth_file_path, color_timestamp, color_file_path })
)
);
named!(path<CompleteStr, PathBuf>,
map!(is_not!(" \t\r\n"), |s| PathBuf::from(*s))
);
named!(trajectory_line<CompleteStr, Option<Frame> >,
alt!( map!(comment, |_| None) | map!(frame, Some) )
);
named!(comment<CompleteStr,()>,
do_parse!( tag!("#") >> many0!(anychar) >> ())
);
named!(frame<CompleteStr, Frame>,
do_parse!(
t: double >> space >>
p: pose >>
(Frame { timestamp: t, pose: p })
)
);
named!(pose<CompleteStr, Iso3 >,
do_parse!(
t: translation >> space >>
r: rotation >>
(Iso3::from_parts(t, r))
)
);
named!(translation<CompleteStr, na::Translation3<Float> >,
do_parse!(
x: float >> space >>
y: float >> space >>
z: float >>
(na::Translation3::new(x, y, z))
)
);
named!(rotation<CompleteStr, na::UnitQuaternion<Float> >,
do_parse!(
qx: float >> space >>
qy: float >> space >>
qz: float >> space >>
qw: float >>
(na::UnitQuaternion::from_quaternion(na::Quaternion::new(qw, qx, qy, qz)))
)
);
}