use crate::Error;
use nalgebra::{DVector, DVectorView, Quaternion, UnitQuaternion, Vector3};
use vision_calibration_core::Iso3;
pub fn iso3_to_se3_dvec(pose: &Iso3) -> DVector<f64> {
let q = pose.rotation.into_inner();
let t = pose.translation.vector;
nalgebra::dvector![
q.coords[0],
q.coords[1],
q.coords[2],
q.coords[3],
t.x,
t.y,
t.z
]
}
pub fn se3_dvec_to_iso3(v: DVectorView<'_, f64>) -> Result<Iso3, Error> {
if v.len() != 7 {
return Err(Error::invalid_input(format!(
"expected se3 vector of length 7, got {}",
v.len()
)));
}
let quat = Quaternion::new(v[3], v[0], v[1], v[2]);
let rot = UnitQuaternion::from_quaternion(quat);
let trans = Vector3::new(v[4], v[5], v[6]);
Ok(Iso3::from_parts(trans.into(), rot))
}