#[derive(Debug, Clone)]
pub struct KeyframePolicy {
pub min_frames_between: usize,
pub max_frames_between: usize,
pub ref_ratio: f64,
}
impl Default for KeyframePolicy {
fn default() -> Self {
Self {
min_frames_between: 3,
max_frames_between: 8,
ref_ratio: 0.6,
}
}
}
impl KeyframePolicy {
pub fn should_insert(
&self,
curr_idx: usize,
last_keyframe_idx: Option<usize>,
tracked_inliers: usize,
n_ref_map_points: usize,
) -> bool {
let Some(last_kf_idx) = last_keyframe_idx else {
return true;
};
let frames_since_last_kf = curr_idx.saturating_sub(last_kf_idx);
if frames_since_last_kf < self.min_frames_between {
return false;
}
if frames_since_last_kf >= self.max_frames_between {
return true;
}
if n_ref_map_points == 0 {
return true;
}
let weak_threshold = (n_ref_map_points as f64 * self.ref_ratio) as usize;
tracked_inliers >= 15 && tracked_inliers < weak_threshold
}
}
#[derive(Debug, Clone)]
pub struct TrackingLossRecoveryPolicy {
pub min_keyframes_for_grace: usize,
pub timeout_imu_sec: f64,
pub timeout_visual_sec: f64,
pub min_imu_confidence_sec: f64,
}
impl Default for TrackingLossRecoveryPolicy {
fn default() -> Self {
Self {
min_keyframes_for_grace: 10,
timeout_imu_sec: 1.0,
timeout_visual_sec: 0.5,
min_imu_confidence_sec: 2.0,
}
}
}
impl TrackingLossRecoveryPolicy {
pub fn grace_period_sec(&self, imu_confident: bool) -> f64 {
if imu_confident {
self.timeout_imu_sec
} else {
self.timeout_visual_sec
}
}
}