"""지역 맵 센서 복셀 월드 선택 (nusim.render.regionmap.sensor_world) — 데이터셋 없이.""" import json import numpy as np from nusim.io.ply import _ORIGIN_TAG from nusim.render.regionmap import sensor_world from nusim.render.segmap import SEGMAP_VERSION from nusim.sim.voxels import VOXELS_VERSION def _seg(d, name, origin): m = d / name m.mkdir(parents=True) (m / "point_cloud.ply").write_text(f"ply\ncomment {_ORIGIN_TAG} {origin[0]} {origin[1]} {origin[2]}\nend_header\n") return m def test_stale_world_still_used_with_its_own_origin(tmp_path): d = tmp_path / "scene-x" s1 = _seg(d, "seg1", (10, 20, 1)) (d / "world.vox").write_bytes(b"VOX2") # seg1 만 학습됐을 때 만든 월드 (origin 기록 전 형식) (d / "export.json").write_text(json.dumps({"version": SEGMAP_VERSION, "voxels": VOXELS_VERSION, "models": ["seg1:1"]})) s0 = _seg(d, "seg0", (0, 0, 0)) # 그 뒤 seg0 이 학습됨 → 첫 구간과 원점이 바뀌었다 segs = [({"k": 0}, s0), ({"k": 1}, s1)] assert sensor_world(tmp_path, "scene-x", segs) is None # 엄격: 낡음 p, o = sensor_world(tmp_path, "scene-x", segs, strict=False) assert p == d / "world.vox" and np.allclose(o, [10, 20, 1]) # 월드를 만든 seg1 원점 j = json.loads((d / "export.json").read_text()) (d / "export.json").write_text(json.dumps({**j, "origin": [5, 6, 7]})) assert np.allclose(sensor_world(tmp_path, "scene-x", segs, strict=False)[1], [5, 6, 7]) (d / "export.json").write_text(json.dumps({**j, "voxels": VOXELS_VERSION - 1})) assert sensor_world(tmp_path, "scene-x", segs, strict=False) is None # 복셀 알고리즘이 바뀌면 안 쓴다 def test_unsplit_scene_model_is_scene_dir(tmp_path): d = tmp_path / "scene-y" d.mkdir() (d / "point_cloud.ply").write_text(f"ply\ncomment {_ORIGIN_TAG} 1 2 3\nend_header\n") (d / "world.vox").write_bytes(b"VOX2") (d / "export.json").write_text(json.dumps({"version": SEGMAP_VERSION, "voxels": VOXELS_VERSION, "models": ["scene-y:1"]})) p, o = sensor_world(tmp_path, "scene-y", [({"k": 0}, d)], strict=False) assert np.allclose(o, [1, 2, 3])