Drop-in replacement for the Nuwa-HP60C camera container, exposing RGB +
aligned depth + intrinsics via REST/WebSocket so the existing
pestello-pose-detector pipeline can consume frames without changes.
Key adaptations for D4xx on USB 2.0 (this robot has no USB 3 port exposed
externally — see STATUS.md):
- pyrealsense2 built from source; the librealsense v2.55.1 install rule
doesn't ship the main .so, so we copy it from the build dir and add an
__init__.py that re-exports the submodule.
- Color stream uses YUYV format on USB 2.x (BGR8/RGB8 time out on this
bus); converted to BGR via cv2.cvtColor in capture().
- rs.align is skipped on USB 2 (incompatible with YUYV); color is
cv2-resized to depth shape for approximate per-pixel alignment.
- Driver auto-detects usb_type_descriptor and falls back to the
full-resolution BGR8 + rs.align pipeline when on USB 3.
Tested: /api/{health,status,discover,rgb,depth,depth/color,capture,
intrinsics} all return 200 with valid payloads at 640x480.
55 lines
1009 B
Python
55 lines
1009 B
Python
from pydantic import BaseModel
|
|
from typing import Any
|
|
|
|
|
|
class ApiError(BaseModel):
|
|
code: str
|
|
message: str
|
|
|
|
|
|
class ApiResponse(BaseModel):
|
|
success: bool
|
|
data: Any | None = None
|
|
error: ApiError | None = None
|
|
|
|
|
|
def ok(data: Any) -> dict:
|
|
return {"success": True, "data": data, "error": None}
|
|
|
|
|
|
def fail(code: str, message: str) -> dict:
|
|
return {"success": False, "data": None, "error": {"code": code, "message": message}}
|
|
|
|
|
|
class DeviceInfo(BaseModel):
|
|
index: int
|
|
vid: str
|
|
pid: str
|
|
serial: str
|
|
bus: int
|
|
device: int
|
|
|
|
|
|
class IntrinsicsInfo(BaseModel):
|
|
fx: float
|
|
fy: float
|
|
cx: float
|
|
cy: float
|
|
|
|
|
|
class CameraIntrinsicsInfo(BaseModel):
|
|
ir: IntrinsicsInfo
|
|
rgb: IntrinsicsInfo
|
|
|
|
|
|
class FrameInfo(BaseModel):
|
|
frame_id: int
|
|
timestamp: float
|
|
rgb_shape: list[int]
|
|
depth_shape: list[int]
|
|
depth_min_mm: int
|
|
depth_max_mm: int
|
|
depth_valid_pixels: int
|
|
rgb_jpeg_b64: str | None = None
|
|
depth_png_b64: str | None = None
|