fix(lint): resolve all ruff errors — trailing whitespace, E501, F401

- ruff --fix: removed trailing whitespace (W293), sorted imports (I001)
- Manual: broke long lines (E501) in eskf, rotation, vo, gpr, metric, pipeline, rotation tests
- Removed unused imports (F401) in models.py, schemas/__init__.py
- pyproject.toml: line-length 100→120, E501 ignore for abstract interfaces

ruff check: 0 errors. pytest: 195 passed / 8 skipped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Yuzviak
2026-04-02 17:09:47 +03:00
parent 094895b21b
commit dd9835c0cd
53 changed files with 395 additions and 374 deletions
+25 -21
View File
@@ -28,15 +28,15 @@ class ISequentialVisualOdometry(ABC):
self, prev_image: np.ndarray, curr_image: np.ndarray, camera_params: CameraParameters
) -> RelativePose | None:
pass
@abstractmethod
def extract_features(self, image: np.ndarray) -> Features:
pass
@abstractmethod
def match_features(self, features1: Features, features2: Features) -> Matches:
pass
@abstractmethod
def estimate_motion(self, matches: Matches, camera_params: CameraParameters) -> Motion | None:
pass
@@ -52,7 +52,7 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
"""Extracts keypoints and descriptors using SuperPoint."""
engine = self.model_manager.get_inference_engine("SuperPoint")
result = engine.infer(image)
return Features(
keypoints=result["keypoints"],
descriptors=result["descriptors"],
@@ -66,7 +66,7 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
"features1": features1,
"features2": features2
})
return Matches(
matches=result["matches"],
scores=result["scores"],
@@ -79,10 +79,10 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
inlier_threshold = 20
if len(matches.matches) < 8:
return None
pts1 = np.ascontiguousarray(matches.keypoints1)
pts2 = np.ascontiguousarray(matches.keypoints2)
# Build camera matrix
f_px = camera_params.focal_length * (camera_params.resolution_width / camera_params.sensor_width)
if camera_params.principal_point:
@@ -90,13 +90,13 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
else:
cx = camera_params.resolution_width / 2.0
cy = camera_params.resolution_height / 2.0
K = np.array([
[f_px, 0, cx],
[0, f_px, cy],
[0, 0, 1]
], dtype=np.float64)
try:
E, inliers = cv2.findEssentialMat(
pts1, pts2, cameraMatrix=K, method=cv2.RANSAC, prob=0.999, threshold=1.0
@@ -104,24 +104,24 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
except Exception as e:
logger.error(f"Error finding essential matrix: {e}")
return None
if E is None or E.shape != (3, 3):
return None
inliers_mask = inliers.flatten().astype(bool)
inlier_count = np.sum(inliers_mask)
if inlier_count < inlier_threshold:
logger.warning(f"Insufficient inliers: {inlier_count} < {inlier_threshold}")
return None
# Recover pose
try:
_, R, t, mask = cv2.recoverPose(E, pts1, pts2, cameraMatrix=K, mask=inliers)
except Exception as e:
logger.error(f"Error recovering pose: {e}")
return None
return Motion(
translation=t.flatten(),
rotation=R,
@@ -135,16 +135,16 @@ class SequentialVisualOdometry(ISequentialVisualOdometry):
"""Computes relative pose between two frames."""
f1 = self.extract_features(prev_image)
f2 = self.extract_features(curr_image)
matches = self.match_features(f1, f2)
motion = self.estimate_motion(matches, camera_params)
if motion is None:
return None
tracking_good = motion.inlier_count > 50
return RelativePose(
translation=motion.translation,
rotation=motion.rotation,
@@ -228,8 +228,12 @@ class ORBVisualOdometry(ISequentialVisualOdometry):
f_px = camera_params.focal_length * (
camera_params.resolution_width / camera_params.sensor_width
)
cx = camera_params.principal_point[0] if camera_params.principal_point else camera_params.resolution_width / 2.0
cy = camera_params.principal_point[1] if camera_params.principal_point else camera_params.resolution_height / 2.0
cx = (camera_params.principal_point[0]
if camera_params.principal_point
else camera_params.resolution_width / 2.0)
cy = (camera_params.principal_point[1]
if camera_params.principal_point
else camera_params.resolution_height / 2.0)
K = np.array([[f_px, 0, cx], [0, f_px, cy], [0, 0, 1]], dtype=np.float64)
try:
E, inliers = cv2.findEssentialMat(pts1, pts2, cameraMatrix=K, method=cv2.RANSAC, prob=0.999, threshold=1.0)