feat(perception): add ground-aware cuboid refusion

This commit is contained in:
DCCONSTRUCTIONS
2026-07-23 08:24:37 +03:00
parent b53d6d5a45
commit a0706fd5d8
8 changed files with 1116 additions and 114 deletions
+45 -29
View File
@@ -237,7 +237,15 @@ def test_recorded_blueprint_accumulates_point_frames_on_session_timeline() -> No
visible_ranges = spatial_view.properties["VisibleTimeRanges"]
line_grid = spatial_view.properties["LineGrid3D"]
assert visible_ranges.ranges.as_arrow_array().to_pylist() == [
assert visible_ranges.ranges.as_arrow_array().to_pylist() == []
assert line_grid.visible.as_arrow_array().to_pylist() == [False]
point_behavior, point_visualizer, point_time_ranges = spatial_view.visualizer_overrides[
"/world/points"
]
trajectory_behavior, trajectory_time_ranges = spatial_view.visualizer_overrides[
"/world/trajectory"
]
expected_accumulation = [
{
"timeline": SESSION_TIMELINE,
"range": {
@@ -246,9 +254,8 @@ def test_recorded_blueprint_accumulates_point_frames_on_session_timeline() -> No
},
}
]
assert line_grid.visible.as_arrow_array().to_pylist() == [False]
point_behavior, point_visualizer = spatial_view.visualizer_overrides["/world/points"]
trajectory_behavior = spatial_view.visualizer_overrides["/world/trajectory"]
assert point_time_ranges.ranges.as_arrow_array().to_pylist() == expected_accumulation
assert trajectory_time_ranges.ranges.as_arrow_array().to_pylist() == expected_accumulation
perception_behavior = spatial_view.visualizer_overrides["/world/perception"]
assert point_behavior.visible.as_arrow_array().to_pylist() == [False]
assert trajectory_behavior.visible.as_arrow_array().to_pylist() == [True]
@@ -277,9 +284,9 @@ def test_zero_accumulation_uses_latest_frame_instead_of_empty_time_range() -> No
blueprint = _recorded_blueprint(RerunSceneSettings(accumulation_seconds=0.0, show_grid=True))
spatial_view = blueprint.root_container.contents[0]
assert "VisibleTimeRanges" not in spatial_view.properties
assert spatial_view.properties["VisibleTimeRanges"].ranges.as_arrow_array().to_pylist() == []
point_behavior, point_visualizer = spatial_view.visualizer_overrides["/world/points"]
trajectory_behavior = spatial_view.visualizer_overrides["/world/trajectory"]
(trajectory_behavior,) = spatial_view.visualizer_overrides["/world/trajectory"]
assert point_behavior.visible.as_arrow_array().to_pylist() == [True]
assert trajectory_behavior.visible.as_arrow_array().to_pylist() == [True]
point_components = {str(batch.component_descriptor()) for batch in point_visualizer.overrides}
@@ -309,18 +316,32 @@ def test_dynamic_blueprint_reuses_scene_ids_without_playback_mutation() -> None:
assert first.root_container.contents[3].id == RECORDED_METRICS_VIEW_ID
assert second.root_container.contents[3].id == RECORDED_METRICS_VIEW_ID
first_point_behavior, first_point_visualizer = first_view.visualizer_overrides["/world/points"]
second_point_behavior, second_point_visualizer = second_view.visualizer_overrides[
"/world/points"
first_point_behavior, first_point_visualizer, first_point_time_ranges = (
first_view.visualizer_overrides["/world/points"]
)
second_point_behavior, second_point_visualizer, second_point_time_ranges = (
second_view.visualizer_overrides["/world/points"]
)
first_trajectory, first_trajectory_time_ranges = first_view.visualizer_overrides[
"/world/trajectory"
]
second_trajectory, second_trajectory_time_ranges = second_view.visualizer_overrides[
"/world/trajectory"
]
first_trajectory = first_view.visualizer_overrides["/world/trajectory"]
second_trajectory = second_view.visualizer_overrides["/world/trajectory"]
assert first_point_visualizer.id == RECORDED_POINTS_VISUALIZER_ID
assert second_point_visualizer.id == RECORDED_POINTS_VISUALIZER_ID
assert first_point_behavior.visible.as_arrow_array().to_pylist() == [False]
assert second_point_behavior.visible.as_arrow_array().to_pylist() == [True]
assert first_trajectory.visible.as_arrow_array().to_pylist() == [True]
assert second_trajectory.visible.as_arrow_array().to_pylist() == [False]
assert (
first_point_time_ranges.ranges.as_arrow_array().to_pylist()
== first_trajectory_time_ranges.ranges.as_arrow_array().to_pylist()
)
assert (
second_point_time_ranges.ranges.as_arrow_array().to_pylist()
== second_trajectory_time_ranges.ranges.as_arrow_array().to_pylist()
)
payload = recorded_blueprint_rrd(
RerunSceneSettings(show_points=False, show_trajectory=False),
@@ -373,17 +394,14 @@ def test_viewer_blueprint_reset_is_bounded_and_recreates_render_views() -> None:
cuboid_view = cuboids.root_container.contents[2]
assert cuboid_view.origin == "/world"
assert "VisibleTimeRanges" not in cuboid_view.properties
cuboid_points, cuboid_point_visualizer = cuboid_view.visualizer_overrides[
"/world/points"
]
cuboid_points, cuboid_point_visualizer = cuboid_view.visualizer_overrides["/world/points"]
cuboid_perception = cuboid_view.visualizer_overrides["/world/perception"]
cuboid_diagnostic_lidar = cuboid_view.visualizer_overrides[
"/world/perception/lidar"
]
cuboid_diagnostic_lidar = cuboid_view.visualizer_overrides["/world/perception/lidar"]
assert cuboid_points.visible.as_arrow_array().to_pylist() == [True]
assert cuboid_point_visualizer.id != initial.root_container.contents[0].visualizer_overrides[
"/world/points"
][1].id
assert (
cuboid_point_visualizer.id
!= initial.root_container.contents[0].visualizer_overrides["/world/points"][1].id
)
assert cuboid_perception.visible.as_arrow_array().to_pylist() == [True]
assert cuboid_diagnostic_lidar.visible.as_arrow_array().to_pylist() == [False]
perception_behavior = initial.root_container.contents[0].visualizer_overrides[
@@ -415,18 +433,16 @@ def test_viewer_blueprint_unifies_original_video_and_independent_ai_layers() ->
assert camera_view.visualizer_overrides[
"/perception/camera/segmentation"
].visible.as_arrow_array().to_pylist() == [True]
semantic_behavior, semantic_time_ranges = spatial_view.visualizer_overrides[
"/world/perception/semantic_points"
]
cuboid_behavior, cuboid_time_ranges = spatial_view.visualizer_overrides[
"/world/perception/boxes3d"
]
(semantic_behavior,) = spatial_view.visualizer_overrides["/world/perception/semantic_points"]
(cuboid_behavior,) = spatial_view.visualizer_overrides["/world/perception/boxes3d"]
assert semantic_behavior.visible.as_arrow_array().to_pylist() == [True]
assert cuboid_behavior.visible.as_arrow_array().to_pylist() == [False]
assert semantic_time_ranges.ranges.as_arrow_array().to_pylist() == []
assert cuboid_time_ranges.ranges.as_arrow_array().to_pylist() == []
visible_ranges = spatial_view.properties["VisibleTimeRanges"]
assert visible_ranges.ranges.as_arrow_array().to_pylist() == [
assert visible_ranges.ranges.as_arrow_array().to_pylist() == []
_point_behavior, _point_visualizer, point_time_ranges = spatial_view.visualizer_overrides[
"/world/points"
]
assert point_time_ranges.ranges.as_arrow_array().to_pylist() == [
{
"timeline": SESSION_TIMELINE,
"range": {"start": -12_000_000_000, "end": 0},