Files
massive-cloud/alg/delivery_v1.2.1/underframe_deflection/structures.py
lipan 29f1d45d66 feat: 算法升级、整车配准集成与性能分析文档
算法更新: delivery v1.2.1、平整度v1.5、测距v2.2、整车配准v1.3
适配器: vehicle-registration 新增、各算法 manifest 和 adapter 更新
后端: taskCadFiles/source 字段迁移、derivedPointClouds 注册、取消任务联动
前端: ElapsedTime 时长显示、两步算法流程、canRun 逻辑修复
文档: 新增5份算法性能分析报告
2026-06-25 08:22:20 +00:00

127 lines
2.6 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
import numpy as np
@dataclass(slots=True)
class FrameHypothesis:
name: str
axes: np.ndarray
origin: np.ndarray
score: float
bottom_score: float
symmetry_score: float
flatness_score: float
hole_score: float
continuity_score: float
@dataclass(slots=True)
class CandidateBand:
candidate_id: str
slice_index: int
x_start: float
x_end: float
x_center: float
y_min: float
y_max: float
y_center: float
z_low: float
width: float
point_count: int
low_point_count: int
flatness: float
normal_alignment: float
score: float
edge_ratio: float
side: str
y_mid: float
bin_start: int
bin_end: int
@dataclass(slots=True)
class SliceResult:
slice_index: int
x_start: float
x_end: float
x_center: float
y_mid: float
candidate_bands: list[CandidateBand] = field(default_factory=list)
left_candidates: list[CandidateBand] = field(default_factory=list)
right_candidates: list[CandidateBand] = field(default_factory=list)
point_count: int = 0
@dataclass(slots=True)
class TrackSolution:
side: str
rank: int
score: float
coverage_ratio: float
coverage_count: int
candidate_ids: list[str | None]
candidates: list[CandidateBand]
score_margin: float | None
confidence: float
@dataclass(slots=True)
class RepresentativePoint:
side: str
slice_index: int
x: float
y: float
z: float
width: float
point_count: int
residual: float
confidence: float
x_start: float
x_end: float
@dataclass(slots=True)
class FittedLine:
side: str
x_support: np.ndarray
y_support: np.ndarray
z_support: np.ndarray
y_spline: Any
z_spline: Any
y_residual_rms: float
z_residual_rms: float
low_confidence_segments: list[tuple[float, float]]
gaps: list[tuple[float, float]]
@dataclass(slots=True)
class HoleCandidate:
side: str
region: str
axis: str
center: np.ndarray
radius: float
score: float
inlier_count: int
coverage_ratio: float
residual: float
confidence: float
@dataclass(slots=True)
class ReferenceLine:
side: str
available: bool
point_front: np.ndarray | None
point_back: np.ndarray | None
direction: np.ndarray | None
confidence: float
residual: float | None
candidates_front: list[HoleCandidate] = field(default_factory=list)
candidates_back: list[HoleCandidate] = field(default_factory=list)
alternates: list[dict[str, Any]] = field(default_factory=list)