diff --git a/src/lerobot/cameras/opencv/camera_opencv.py b/src/lerobot/cameras/opencv/camera_opencv.py index b3c20e8dd..e50d24c01 100644 --- a/src/lerobot/cameras/opencv/camera_opencv.py +++ b/src/lerobot/cameras/opencv/camera_opencv.py @@ -436,7 +436,7 @@ class OpenCVCamera(Camera): Internal loop run by the background thread for asynchronous reading. On each iteration: - 1. Reads a color frame + 1. Reads a color frame (blocking call) 2. Stores result in latest_frame and updates timestamp (thread-safe) 3. Sets new_frame_event to notify listeners @@ -485,6 +485,8 @@ class OpenCVCamera(Camera): if self.thread is not None and self.thread.is_alive(): self.thread.join(timeout=2.0) + if self.thread.is_alive(): + logger.warning(f"{self} read thread did not terminate within timeout.") self.thread = None self.stop_event = None diff --git a/src/lerobot/cameras/realsense/camera_realsense.py b/src/lerobot/cameras/realsense/camera_realsense.py index 41c2fe882..c0971a48f 100644 --- a/src/lerobot/cameras/realsense/camera_realsense.py +++ b/src/lerobot/cameras/realsense/camera_realsense.py @@ -465,8 +465,8 @@ class RealSenseCamera(Camera): Internal loop run by the background thread for asynchronous reading. On each iteration: - 1. Reads a color frame with 500ms timeout - 2. Stores result in latest_frame and updates timestamp (thread-safe) + 1. Reads a color/depth frame (blocking call with 10s timeout) + 2. Stores result in latest_color_frame/latest_depth_frame and updates timestamp (thread-safe) 3. Sets new_frame_event to notify listeners Stops on DeviceNotConnectedError, logs other errors and continues. @@ -487,7 +487,7 @@ class RealSenseCamera(Camera): depth_frame_raw = frame.get_depth_frame() depth_frame = np.asanyarray(depth_frame_raw.get_data()) processed_depth_frame = self._postprocess_image(depth_frame, depth_frame=True) - if processed_depth_frame.ndim == 2: # (H, W) -> (H, W, 1) + if processed_depth_frame.ndim == 2: # (H, W) -> (H, W, 1) processed_depth_frame = processed_depth_frame[..., np.newaxis] capture_time = time.perf_counter() @@ -525,6 +525,8 @@ class RealSenseCamera(Camera): if self.thread is not None and self.thread.is_alive(): self.thread.join(timeout=2.0) + if self.thread.is_alive(): # pragma: no cover + logger.warning(f"{self} read thread did not terminate within timeout.") self.thread = None self.stop_event = None diff --git a/src/lerobot/cameras/zmq/camera_zmq.py b/src/lerobot/cameras/zmq/camera_zmq.py index f3df17814..cd32a117b 100644 --- a/src/lerobot/cameras/zmq/camera_zmq.py +++ b/src/lerobot/cameras/zmq/camera_zmq.py @@ -293,6 +293,8 @@ class ZMQCamera(Camera): if self.thread is not None and self.thread.is_alive(): self.thread.join(timeout=2.0) + if self.thread.is_alive(): + logger.warning(f"{self} read thread did not terminate within timeout.") self.thread = None self.stop_event = None