feat: 添加ACT双相机实时预览

This commit is contained in:
2026-08-13 22:18:32 +08:00
parent 676b33bfe4
commit 235ba61454
2 changed files with 245 additions and 2 deletions
+60 -2
View File
@@ -326,6 +326,22 @@ def test_sample_frame_metrics_separate_repeats_skips_and_regressions():
assert regression == 0
def test_camera_buffer_reports_two_second_rolling_fps():
buffer = CameraBuffer(maxlen=4)
start_ns = 10_000_000_000
for index in range(61):
buffer.push(
CameraFrame(
_image(index),
index,
float(index),
start_ns + index * 33_333_333,
)
)
assert buffer.stats().rolling_fps == pytest.approx(30.0, rel=0.02)
requires_h5py = pytest.mark.skipif(
h5py is None,
reason="h5py is not installed",
@@ -763,6 +779,48 @@ def _recorder_for_test(tmp_path):
return recorder
def test_preview_failure_does_not_change_recording_state():
recorder = object.__new__(ActEpisodeRecorder)
recorder._session = _recording_session()
recorder._preview_stop = threading.Event()
recorder._preview_thread = None
recorder._logger = _Logger()
recorder.get_logger = lambda: recorder._logger
class FailingCv2:
WINDOW_NORMAL = 0
@staticmethod
def namedWindow(*_args):
raise RuntimeError("no display")
recorder._preview_loop(FailingCv2())
assert recorder.state is RecordingState.RECORDING
assert recorder._logger.warnings == [
"ACT双相机预览已停用:no display"
]
def test_close_stops_preview_before_cameras_and_releases_lock():
events = []
recorder = object.__new__(ActEpisodeRecorder)
recorder._stop_preview = lambda: events.append("preview")
recorder._high_camera = SimpleNamespace(
stop=lambda: events.append("high")
)
recorder._wrist_camera = SimpleNamespace(
stop=lambda: events.append("wrist")
)
recorder._directory_lock = SimpleNamespace(
release=lambda: events.append("lock")
)
recorder.close()
assert events == ["preview", "high", "wrist", "lock"]
@requires_h5py
def test_preflight_requires_open_gripper_fresh_inputs_and_disk_space(tmp_path):
recorder = _recorder_for_test(tmp_path)
@@ -791,8 +849,8 @@ def _push_recording_frames(recorder, control_ns, frame_number):
recorder._wrist_camera.buffer.push(
CameraFrame(
_image(3),
frame_number,
float(frame_number),
frame_number + 1000,
float(frame_number + 1000),
control_ns - 3_000_000,
)
)