use kornia_3d::{camera::PinholeCamera, pose::Pose3d};
use kornia_sensors::imu::ImuCalib;
#[derive(Debug, Clone)]
pub struct SensorRig {
pub camera: PinholeCamera,
pub imu: Option<ImuCalibration>,
}
impl SensorRig {
pub fn new(camera: PinholeCamera) -> Self {
Self { camera, imu: None }
}
pub fn with_imu(mut self, camera_to_body: Pose3d) -> Self {
self.imu = Some(ImuCalibration::new(camera_to_body));
self
}
pub fn camera_to_body(&self) -> Option<Pose3d> {
self.imu.as_ref().map(|imu| imu.camera_to_body)
}
pub fn imu_noise(&self) -> ImuCalib {
self.imu
.as_ref()
.map_or_else(default_imu_noise, |imu| imu.noise)
}
}
#[derive(Debug, Clone, Copy)]
pub struct ImuCalibration {
pub noise: ImuCalib,
pub camera_to_body: Pose3d,
}
impl ImuCalibration {
pub fn new(camera_to_body: Pose3d) -> Self {
Self {
noise: default_imu_noise(),
camera_to_body,
}
}
}
pub(crate) fn default_imu_noise() -> ImuCalib {
ImuCalib {
gyro_noise: 1.6968e-4,
accel_noise: 2.0e-3,
gyro_bias_noise: 1.9393e-5,
accel_bias_noise: 3.0e-3,
}
}