From ca6f99a85d245d766a48e5aa1e83c8403cd2ccbf Mon Sep 17 00:00:00 2001 From: masaru87 <55574641+masaru87@users.noreply.github.com> Date: Fri, 14 Aug 2026 10:05:28 +0900 Subject: [PATCH] [fix] Convert PandarXT32 block timestamp offsets to seconds --- src/hydra4/decoders/pandar_xt32.py | 4 +++- tests/integration/test_xt32_decoder.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/hydra4/decoders/pandar_xt32.py b/src/hydra4/decoders/pandar_xt32.py index 8b99b83..474320d 100644 --- a/src/hydra4/decoders/pandar_xt32.py +++ b/src/hydra4/decoders/pandar_xt32.py @@ -128,7 +128,9 @@ def __call__(self, packet: pandar_msgs__msg__PandarPacket) -> Generator[Block, N intensity, ring, azimuth, - timestamp.timestamp() + block_offset[block_id] + self.firing_offset[ring], + timestamp.timestamp() + + block_offset[block_id] * 1e-6 + + self.firing_offset[ring], ) ) diff --git a/tests/integration/test_xt32_decoder.py b/tests/integration/test_xt32_decoder.py index 4f3f6a7..b514d01 100644 --- a/tests/integration/test_xt32_decoder.py +++ b/tests/integration/test_xt32_decoder.py @@ -106,6 +106,15 @@ def test_point_azimuth_matches_block_azimuth( for _, _, _, _, _, pt_az, _ in block.points: assert pt_az == block.azimuth + def test_point_timestamps_within_packet_are_microseconds_apart( + self, decoder: PandarXT32, sample_packets: list + ) -> None: + """Block and channel firing offsets are measured in microseconds.""" + points = [point for block in decoder(sample_packets[0]) for point in block.points] + stamps = [point[-1] for point in points] + + assert max(stamps) - min(stamps) < 0.001 + class TestXT32DistanceFilter: def test_tighter_min_distance_filters_more(self, pandar_packets_xt32: list) -> None: