feat: publish full RELLIS qualification

This commit is contained in:
DCCONSTRUCTIONS
2026-07-25 21:38:22 +03:00
parent 21c7a5507c
commit d8b7ed4526
5 changed files with 156 additions and 33 deletions
@@ -1665,6 +1665,36 @@
font-size: 0.82rem;
}
.rellis-review__decision {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
border-radius: 0.9rem;
background: rgb(var(--nodedc-danger-rgb) / 0.08);
padding: 0.78rem 0.9rem;
}
.rellis-review__decision strong {
color: rgb(var(--nodedc-danger-rgb));
font-size: 0.68rem;
}
.rellis-review__decision span {
color: var(--nodedc-text-muted);
font-size: 0.58rem;
line-height: 1.45;
text-align: right;
}
.rellis-review__decision[data-passed="true"] {
background: rgb(255 255 255 / 0.045);
}
.rellis-review__decision[data-passed="true"] strong {
color: var(--nodedc-text-primary);
}
.polygon-review-summary,
.polygon-review-unavailable,
.polygon-review-analysis,
@@ -10,8 +10,10 @@ import {
type LidarGroundViewMode,
} from "./LidarGroundPointCloud";
import {
fetchGroundQualification,
fetchGroundReview,
fetchGroundReviewFrame,
type GroundQualification,
type GroundReview,
type GroundReviewFrame,
type GroundReviewFrameSummary,
@@ -324,6 +326,7 @@ function qualifiedModeExplanation(mode: LidarGroundViewMode) {
}
function RellisQualifiedReview({ runId }: { runId: string }) {
const [qualification, setQualification] = useState<GroundQualification | null>(null);
const [review, setReview] = useState<GroundReview | null>(null);
const [frame, setFrame] = useState<GroundReviewFrame | null>(null);
const [selectedSequence, setSelectedSequence] = useState<string | null>(null);
@@ -336,15 +339,20 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
useEffect(() => {
const controller = new AbortController();
setError(null);
setQualification(null);
setReview(null);
setFrame(null);
cache.current.clear();
void fetchGroundReview(runId, { signal: controller.signal })
.then((value) => {
if (controller.signal.aborted || !value) return;
setReview(value);
setSelectedSequence(value.frames[0]?.datasetSequenceId ?? null);
setSelectedFrame(value.frames[0]?.frameId ?? null);
void Promise.all([
fetchGroundQualification(runId, { signal: controller.signal }),
fetchGroundReview(runId, { signal: controller.signal }),
])
.then(([qualificationValue, reviewValue]) => {
if (controller.signal.aborted || !qualificationValue || !reviewValue) return;
setQualification(qualificationValue);
setReview(reviewValue);
setSelectedSequence(reviewValue.frames[0]?.datasetSequenceId ?? null);
setSelectedFrame(reviewValue.frames[0]?.frameId ?? null);
})
.catch((loadError: unknown) => {
if (!controller.signal.aborted) setError(errorMessage(loadError));
@@ -440,7 +448,7 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
<header className="dataset-sequence-review__truth">
<div>
<span className="section-eyebrow">RELLIS · FULL VALIDATION</span>
<h2>Пять последовательностей Ouster OS1 с покадровым сравнением</h2>
<h2>Две validation-последовательности Ouster OS1 с покадровым сравнением</h2>
<p>
Все {review.frameCount.toLocaleString("ru-RU")} validation-сканов
выровнены с labels и pose index. Высота Patchwork++ определена только
@@ -577,6 +585,26 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
</article>
</div>
{qualification ? (
<div
className="rellis-review__decision"
data-passed={qualification.decision.passed ? "true" : "false"}
>
<strong>
{qualification.decision.passed
? "Кандидат прошёл независимую проверку"
: "Patchwork++ не прошёл независимую проверку"}
</strong>
<span>
Полный validation: obstacle recall{" "}
{formatPercent(qualification.current.micro.obstacleNonGroundRecall)}
{" → "}
{formatPercent(qualification.patchwork.micro.obstacleNonGroundRecall)}.
Алгоритм не принят для navigation/safety.
</span>
</div>
) : null}
<p className="dataset-sequence-review__raw-note">
Это независимая исследовательская проверка переносимости. Она не
включает управление машиной и не принимает алгоритм для navigation/safety.