feat: 添加多摄像头测试工具,支持实时预览和快照功能
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
@@ -0,0 +1,76 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
MODULE_PATH = (
|
||||
Path(__file__).resolve().parents[1]
|
||||
/ "tools"
|
||||
/ "realsense_multi_camera_test.py"
|
||||
)
|
||||
SPEC = importlib.util.spec_from_file_location("realsense_multi_camera_test", MODULE_PATH)
|
||||
assert SPEC is not None and SPEC.loader is not None
|
||||
camera_test = importlib.util.module_from_spec(SPEC)
|
||||
sys.modules[SPEC.name] = camera_test
|
||||
SPEC.loader.exec_module(camera_test)
|
||||
|
||||
|
||||
def devices() -> list[camera_test.DeviceInfo]:
|
||||
return [
|
||||
camera_test.DeviceInfo("Intel RealSense D405", "D405", "412622272532", "3.2"),
|
||||
camera_test.DeviceInfo("Intel RealSense D455", "D455", "234222303366", "3.2"),
|
||||
camera_test.DeviceInfo("Intel RealSense D405", "D405", "260322272273", "3.2"),
|
||||
]
|
||||
|
||||
|
||||
def test_assigns_camera_roles_with_and_without_left_serial() -> None:
|
||||
unidentified = camera_test.assign_camera_roles(devices(), None)
|
||||
assert [camera.role for camera in unidentified] == ["GLOBAL", "D405-A", "D405-B"]
|
||||
assert [camera.serial for camera in unidentified[1:]] == ["260322272273", "412622272532"]
|
||||
|
||||
identified = camera_test.assign_camera_roles(devices(), "412622272532")
|
||||
assert {camera.role: camera.serial for camera in identified} == {
|
||||
"GLOBAL": "234222303366",
|
||||
"LEFT": "412622272532",
|
||||
"RIGHT": "260322272273",
|
||||
}
|
||||
|
||||
|
||||
def test_rejects_invalid_camera_selection() -> None:
|
||||
with pytest.raises(ValueError, match="左臂序列号"):
|
||||
camera_test.assign_camera_roles(devices(), "missing")
|
||||
|
||||
with pytest.raises(ValueError, match="2 台 D405 和 1 台 D455"):
|
||||
camera_test.assign_camera_roles(devices()[:-1], None)
|
||||
|
||||
|
||||
def test_counts_frame_number_gaps() -> None:
|
||||
stats = camera_test.FrameStats(target_fps=30, start_time=0.0)
|
||||
stats.update(10, 0.0)
|
||||
stats.update(11, 1.0 / 30.0)
|
||||
stats.update(14, 2.0 / 30.0)
|
||||
|
||||
assert stats.received == 3
|
||||
assert stats.dropped == 2
|
||||
assert stats.drop_rate == pytest.approx(0.4)
|
||||
assert stats.average_fps(2.0 / 30.0) == pytest.approx(30.0)
|
||||
|
||||
|
||||
def test_snapshot_names_follow_camera_roles() -> None:
|
||||
identified = camera_test.assign_camera_roles(devices(), "412622272532")
|
||||
assert camera_test.snapshot_filenames(identified) == {
|
||||
"234222303366": "global.png",
|
||||
"412622272532": "left.png",
|
||||
"260322272273": "right.png",
|
||||
}
|
||||
|
||||
unidentified = camera_test.assign_camera_roles(devices(), None)
|
||||
assert camera_test.snapshot_filenames(unidentified) == {
|
||||
"234222303366": "global.png",
|
||||
"260322272273": "d405_260322272273.png",
|
||||
"412622272532": "d405_412622272532.png",
|
||||
}
|
||||
Reference in New Issue
Block a user