Read-only (GET only). For each frameset: /api/raw/latest and /api/capture
of the same frameset_seq (retried until they match), the raw depth aligned
on the host with pyrealsense2 (software_device built from /api/intrinsics:
both streams' intrinsics, distortion model and coefficients, extrinsics
depth->color; then syncer + rs.align), and a pixel-by-pixel comparison of
the two aligned depths: pixels valid in both, only in one, exact-equal
fraction, |diff| mean/median/p99/max in mm. One JSON line per frameset.
The syncer may emit the first pair split, so a pair is pushed again (up
to 5 times) until a complete frameset of that frame number comes out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.