Estimated object speed for zones (#16452)

* utility functions

* backend config

* backend object speed tracking

* draw speed on debug view

* basic frontend zone editor

* remove line sorting

* fix types

* highlight line on canvas when entering value in zone edit pane

* rename vars and add validation

* ensure speed estimation is disabled when user adds more than 4 points

* pixel velocity in debug

* unit_system in config

* ability to define unit system in config

* save max speed to db

* frontend

* docs

* clarify docs

* utility functions

* backend config

* backend object speed tracking

* draw speed on debug view

* basic frontend zone editor

* remove line sorting

* fix types

* highlight line on canvas when entering value in zone edit pane

* rename vars and add validation

* ensure speed estimation is disabled when user adds more than 4 points

* pixel velocity in debug

* unit_system in config

* ability to define unit system in config

* save max speed to db

* frontend

* docs

* clarify docs

* fix duplicates from merge

* include max_estimated_speed in api responses

* add units to zone edit pane

* catch undefined

* add average speed

* clarify docs

* only track average speed when object is active

* rename vars

* ensure points and distances are ordered clockwise

* only store the last 10 speeds like score history

* remove max estimated speed

* update docs

* update docs

* fix point ordering

* improve readability

* docs inertia recommendation

* fix point ordering

* check object frame time

* add velocity angle to frontend

* docs clarity

* add frontend speed filter

* fix mqtt docs

* fix mqtt docs

* don't try to remove distances if they weren't already defined

* don't display estimates on debug view/snapshots if object is not in a speed tracking zone

* docs

* implement speed_threshold for zone presence

* docs for threshold

* better ground plane image

* improve image zone size

* add inertia to speed threshold example
This commit is contained in:
Josh Hawkins
2025-02-10 13:23:42 -07:00
committed by GitHub
parent dd7820e4ee
commit 72209986b6
25 changed files with 1030 additions and 79 deletions
+47 -2
View File
@@ -216,11 +216,14 @@ export default function InputWithTags({
type == "after" ||
type == "time_range" ||
type == "min_score" ||
type == "max_score"
type == "max_score" ||
type == "min_speed" ||
type == "max_speed"
) {
const newFilters = { ...filters };
let timestamp = 0;
let score = 0;
let speed = 0;
switch (type) {
case "before":
@@ -294,6 +297,40 @@ export default function InputWithTags({
newFilters[type] = score / 100;
}
break;
case "min_speed":
case "max_speed":
speed = parseFloat(value);
if (score >= 0) {
// Check for conflicts between min_speed and max_speed
if (
type === "min_speed" &&
filters.max_speed !== undefined &&
speed > filters.max_speed
) {
toast.error(
"The 'min_speed' must be less than or equal to the 'max_speed'.",
{
position: "top-center",
},
);
return;
}
if (
type === "max_speed" &&
filters.min_speed !== undefined &&
speed < filters.min_speed
) {
toast.error(
"The 'max_speed' must be greater than or equal to the 'min_speed'.",
{
position: "top-center",
},
);
return;
}
newFilters[type] = speed;
}
break;
case "time_range":
newFilters[type] = value;
break;
@@ -369,6 +406,10 @@ export default function InputWithTags({
}`;
} else if (filterType === "min_score" || filterType === "max_score") {
return Math.round(Number(filterValues) * 100).toString() + "%";
} else if (filterType === "min_speed" || filterType === "max_speed") {
return (
filterValues + (config?.ui.unit_system == "metric" ? " kph" : " mph")
);
} else if (
filterType === "has_clip" ||
filterType === "has_snapshot" ||
@@ -397,7 +438,11 @@ export default function InputWithTags({
((filterType === "min_score" || filterType === "max_score") &&
!isNaN(Number(trimmedValue)) &&
Number(trimmedValue) >= 50 &&
Number(trimmedValue) <= 100)
Number(trimmedValue) <= 100) ||
((filterType === "min_speed" || filterType === "max_speed") &&
!isNaN(Number(trimmedValue)) &&
Number(trimmedValue) >= 1 &&
Number(trimmedValue) <= 150)
) {
createFilter(
filterType,