from abc import ABC, abstractmethod from typing import Optional import numpy as np from models.processing import RotationResult from models.flight import HeadingRecord class ImageRotationManagerBase(ABC): @abstractmethod async def estimate_rotation( self, uav_image: np.ndarray, satellite_image: np.ndarray ) -> RotationResult: pass @abstractmethod async def get_rotation_for_frame( self, flight_id: str, frame_id: int ) -> Optional[float]: pass @abstractmethod async def update_heading_history( self, flight_id: str, record: HeadingRecord ) -> None: pass @abstractmethod async def predict_heading(self, flight_id: str) -> Optional[float]: pass @abstractmethod async def is_sharp_turn( self, flight_id: str, current_heading: float ) -> bool: pass @abstractmethod def rotate_image(self, image: np.ndarray, angle: float) -> np.ndarray: pass