Source code for go2.modules.video.sources.native_source

import time
import cv2
import threading
import numpy as np
from typing import Optional
from typing_extensions import override

from unitree_sdk2py.go2.video.video_client import VideoClient

from ..frame_result import FrameResult
from .camera_source import CameraSource


[docs] class NativeCameraSource(CameraSource): def __init__(self) -> None: self._video_client = VideoClient() self._video_client.SetTimeout(3.0) self._video_client.Init() self._thread = None self._stop_event = threading.Event() self._latest_rgb: Optional[np.ndarray] = None @override def _start(self) -> None: self._thread = threading.Thread(target=self._capture_thread, daemon=True) self._thread.start() def _capture_thread(self): while not self._stop_event.is_set(): code, data = self._video_client.GetImageSample() if code != 0 or data is None: continue image_data = np.frombuffer(bytes(data), dtype=np.uint8) image = cv2.imdecode(image_data, cv2.IMREAD_COLOR) self._latest_rgb = image @override def _get_frames(self) -> FrameResult: ret, self._latest_rgb = self._latest_rgb, None if ret is None: return FrameResult.pending() return FrameResult.color_only(ret) @override def _shutdown(self) -> None: self._stop_event.set() if self._thread: self._thread.join() self._thread = None self._latest_rgb = None