vkgs-sim / tests /test_segments.py
kimjunhan's picture
Add files using upload-large-folder tool
4c75661 verified
Raw History Blame Contribute Delete
2.59 kB
"""κΈ΄ μ”¬μ˜ ꡬ간 λΆ„ν•  (nusim.recon.batch.plan_segments) κ³Ό μ¦κ°•μ˜ ν”„λ ˆμž„ λ°°μ • (nusim.aug.map_aug.assign_front_frames)."""
from types import SimpleNamespace
import numpy as np
import pytest
from nusim.aug.map_aug import assign_front_frames
from nusim.recon.batch import plan_segments
T0 = 1_533_000_000_000_000
def _scene(speeds, hz=12.0):
"""CAM_FRONT 만 μžˆλŠ” κ°€μ§œ 씬: ν”„λ ˆμž„ 사이 속도 speeds[i] (m/s) 둜 x 좕을 따라 달린닀."""
x, frames = 0.0, []
for i, v in enumerate(speeds):
frames.append(SimpleNamespace(timestamp=T0 + round(i / hz * 1e6), ego_translation=(x, 0.0, 0.0)))
x += v / hz
return SimpleNamespace(frames={"CAM_FRONT": frames})
def test_short_scene_single_segment():
segs = plan_segments(_scene([1.5] * 240), 60, 10) # 30 m
assert len(segs) == 1 and segs[0]["t0"] is None
@pytest.mark.parametrize("speed", [6.0, 12.0])
def test_segments_cover_with_overlap(speed):
sc = _scene([speed] * 240) # 20 초
segs = plan_segments(sc, 60, 10)
n = len(segs)
total = speed * 239 / 12
assert n == int(np.ceil((total - 10) / 50))
for a, b in zip(segs, segs[1:]):
assert b["t0"] < a["t1"] # ν•™μŠ΅ ꡬ간은 κ²ΉμΉœλ‹€
assert a["own1"] == b["own0"] # λ§‘λŠ” ꡬ간은 λ§žλ‹ΏλŠ”λ‹€
assert a["t0"] <= a["own0"] < a["own1"] <= a["t1"]
for s in segs: # ꡬ간 길이 ≀ 60 m (ν”„λ ˆμž„ μ–‘μžν™” μ—¬μœ )
assert (s["t1"] - s["t0"]) * speed <= 60 + speed / 12 + 1e-6
assert segs[0]["t0"] == 0.0 and segs[-1]["t1"] == pytest.approx(239 / 12, abs=1e-3)
def test_stop_stays_inside_segment():
# 30 m 달리고 5 초 μ„œ μžˆλ‹€κ°€ λ‹€μ‹œ 60 m β€” μ„œ 있던 ν”„λ ˆμž„μ΄ μ–΄λŠ κ΅¬κ°„μ—μ„œλ„ λΉ μ§€μ§€ μ•ŠλŠ”λ‹€
sc = _scene([10.0] * 36 + [0.0] * 60 + [10.0] * 72)
segs = plan_segments(sc, 60, 10)
owned = assign_front_frames(sc, segs)
got = [f.timestamp for fr in owned for f in fr]
assert sorted(got) == [f.timestamp for f in sc.frames["CAM_FRONT"]] # ν”„λ ˆμž„λ§ˆλ‹€ μ •ν™•νžˆ ν•œ ꡬ간
def test_assign_each_frame_once():
sc = _scene([11.9] * 240)
segs = plan_segments(sc, 60, 10)
owned = assign_front_frames(sc, segs)
got = [f.timestamp for fr in owned for f in fr]
assert len(got) == len(set(got)) == len(sc.frames["CAM_FRONT"])
start = sc.frames["CAM_FRONT"][0].timestamp
for s, fr in zip(segs, owned): # 맑은 ν”„λ ˆμž„μ€ κ·Έ κ΅¬κ°„μ˜ ν•™μŠ΅ ꡬ간 μ•ˆ
ts = [(f.timestamp - start) / 1e6 for f in fr]
assert s["t0"] - 1e-3 <= min(ts) and max(ts) <= s["t1"] + 1e-3