diff --git a/config/perception/m48r3-additive-low-step-occupancy-v1.json b/config/perception/m48r3-additive-low-step-occupancy-v1.json index f7c4677..7a5f550 100644 --- a/config/perception/m48r3-additive-low-step-occupancy-v1.json +++ b/config/perception/m48r3-additive-low-step-occupancy-v1.json @@ -19,7 +19,7 @@ "componentization": { "voxel_size_m": 0.45, "neighbor_radius_cells": 1, - "minimum_points": 2, + "minimum_points": 5, "minimum_voxels": 1, "local_radius_m": 10.0, "maximum_candidate_points_per_frame": 768, diff --git a/config/perception/m48r3-native-low-step-reference-graph-shadow-v1.json b/config/perception/m48r3-native-low-step-reference-graph-shadow-v1.json index c94c9d9..5104b2f 100644 --- a/config/perception/m48r3-native-low-step-reference-graph-shadow-v1.json +++ b/config/perception/m48r3-native-low-step-reference-graph-shadow-v1.json @@ -22,7 +22,7 @@ "provider_id": "ravnoves00-additive-low-step-geometry/v1", "version": "0.1.0", "revision": "m48r3-ravnoves00-additive-low-step/v1", - "sha256": "62dd41400169080e1a38f713b283b67cdf201078c4c7fd807783fe6c1838082c" + "sha256": "0d46dcb28542902849ee31de4c4594ef90407834d9e5551474fc4191cadbf1a9" }, { "role": "temporal", diff --git a/experiments/perception/worker/Invoke-M48NNativeReferenceGraph.ps1 b/experiments/perception/worker/Invoke-M48NNativeReferenceGraph.ps1 index 03a82f5..ca96dc6 100644 --- a/experiments/perception/worker/Invoke-M48NNativeReferenceGraph.ps1 +++ b/experiments/perception/worker/Invoke-M48NNativeReferenceGraph.ps1 @@ -113,10 +113,10 @@ $expectedConfigs = [ordered]@{ if ($AdditiveLowStep) { $expectedConfigs.Remove("m48n-rf-detr-native-reference-graph-shadow-v0.json") $expectedConfigs["m48r3-native-low-step-reference-graph-shadow-v1.json"] = ( - "d5434825c3a73a9a070aea37927755771e07d38a017111d2014a8e8c88969227" + "5f5832a0a0c1879374b166071efed02de14aeda815046da5711d6f4053eb9af4" ) $expectedConfigs["m48r3-additive-low-step-occupancy-v1.json"] = ( - "62dd41400169080e1a38f713b283b67cdf201078c4c7fd807783fe6c1838082c" + "0d46dcb28542902849ee31de4c4594ef90407834d9e5551474fc4191cadbf1a9" ) } foreach ($entry in $expectedConfigs.GetEnumerator()) { diff --git a/tests/test_m48_low_step_occupancy.py b/tests/test_m48_low_step_occupancy.py index 7ef7ea1..0fde2f4 100644 --- a/tests/test_m48_low_step_occupancy.py +++ b/tests/test_m48_low_step_occupancy.py @@ -106,13 +106,19 @@ def test_wide_operator_region_cannot_bridge_two_spatial_components() -> None: points = np.asarray( ( (0.00, 0.0, 5.00), - (0.10, 0.0, 5.05), + (0.02, 0.0, 5.00), + (0.04, 0.0, 5.00), + (0.06, 0.0, 5.00), + (0.08, 0.0, 5.00), (1.70, 0.0, 5.00), - (1.80, 0.0, 5.05), + (1.72, 0.0, 5.00), + (1.74, 0.0, 5.00), + (1.76, 0.0, 5.00), + (1.78, 0.0, 5.00), ), dtype=np.float64, ) - store = _Store(_frame(points), np.ones(4, dtype=np.uint8)) + store = _Store(_frame(points), np.ones(10, dtype=np.uint8)) provider = M48AdditiveLowStepGeometryProvider( # type: ignore[arg-type] store=store, profile=load_m48_low_step_occupancy_profile(PROFILE_PATH), @@ -126,12 +132,15 @@ def test_wide_operator_region_cannot_bridge_two_spatial_components() -> None: ) assert len(additive) == 2 - assert {item.source_point_ids for item in additive} == {(0, 1), (2, 3)} + assert {item.source_point_ids for item in additive} == { + (0, 1, 2, 3, 4), + (5, 6, 7, 8, 9), + } assert all(item.semantic_hint is None for item in additive) assert all("occupied-only-never-free" in item.reason_codes for item in additive) snapshot = provider.snapshot() assert snapshot.additive_observation_count == 2 - assert snapshot.additive_voxel_count == 3 + assert snapshot.additive_voxel_count == 2 assert snapshot.failed_frames == 0 @@ -141,9 +150,12 @@ def test_frame_1856_preserves_baseline_posts_and_splits_low_hemisphere_support() store=store, profile=load_m48_low_step_occupancy_profile(PROFILE_PATH), ) - frame = store.frame_for_index(1856) + # Operator-anchor sequences are one-based display frame numbers, while the + # recorded-source packet and timeline use zero-based source sequences. + source_sequence = 1856 - 1 + frame = store.frame_for_index(source_sequence) assert frame is not None - observations = provider.associate(_packet(1856), ()) + observations = provider.associate(_packet(source_sequence), ()) projected = project_map_points_kb4( frame.points_map, position_map_xyz=frame.sensor_position_map,