fix(pybot): 录制时改用同步 capture() 按需抓帧,避免帧重复
_grab_frame 从 camera.latest()(读后台队列)改为 camera.capture() (直接调 grabber 同步抓帧),确保每个微动作拿到独立帧而非队列中 可能重复的旧帧。Camera 新增 capture() 方法。
This commit is contained in:
1 parent
3fc213e7b9
commit
bfa6d8deb6
3 files changed
+25
-5
No files matched your search
@@ -69,6 +69,12 @@ class Camera:
|
||||
with self._lock:
|
||||
return self._queue[-1] if self._queue else None
|
||||
|
||||
def capture(self):
|
||||
"""同步抓一帧(按需,不从队列读);dry_run 或无 grabber 返回 None"""
|
||||
if self._grabber is None:
|
||||
return None
|
||||
return self._grabber()
|
||||
|
||||
def snapshot(self):
|
||||
"""队列快照 list(旧→新),供消费方批量取帧"""
|
||||
with self._lock:
|
||||
|
||||
@@ -254,13 +254,13 @@ class RobotStruct:
|
||||
return vec
|
||||
|
||||
def _grab_frame(self, camera_var):
|
||||
"""从摄像头取最新帧;dry_run 或无帧时返回随机噪声帧"""
|
||||
"""从摄像头同步抓一帧;dry_run 或无帧时返回随机噪声帧"""
|
||||
import numpy as np
|
||||
if camera_var is not None:
|
||||
result = camera_var.play({})
|
||||
if result is not None:
|
||||
return result[1] # (timestamp, frame)
|
||||
# dry_run 或队列空:随机噪声帧(用 camera 配置尺寸)
|
||||
frame = camera_var.camera.capture()
|
||||
if frame is not None:
|
||||
return frame
|
||||
# dry_run 或无 grabber:随机噪声帧(用 camera 配置尺寸)
|
||||
h, w = 480, 640
|
||||
if camera_var is not None:
|
||||
cam = camera_var.camera
|
||||
|
||||
@@ -82,6 +82,20 @@ def test_dry_run_no_hardware():
|
||||
assert cam.latest() is None
|
||||
|
||||
|
||||
def test_capture_on_demand():
|
||||
"""capture() 同步按需抓帧,每个微步一帧"""
|
||||
cam = Camera(grabber=FakeGrabber())
|
||||
assert cam.capture() == 1
|
||||
assert cam.capture() == 2 # 每次调用递增,不复用队列
|
||||
assert cam.capture() == 3
|
||||
|
||||
|
||||
def test_capture_no_grabber():
|
||||
"""dry_run 或未 setup 时 capture() 返回 None"""
|
||||
cam = Camera(dry_run=True)
|
||||
assert cam.capture() is None
|
||||
|
||||
|
||||
def test_camera_var_from_matrix():
|
||||
robot = RobotStruct(CAMERA_MT, dry_run=True)
|
||||
cam = robot.M["cam0"].camera
|
||||
|
||||
Reference in new issue
Block a user