Phone side — phone/video_bridge.py: - MJPEG streaming server for Android/Termux phone camera - Dual camera backends: OpenCV VideoCapture (V4L2) with automatic fallback to termux-camera-photo for unmodified Android - WebSocket server (ws://0.0.0.0:8765) — binary JPEG frames + JSON info/error control messages; supports multiple concurrent clients - HTTP server (http://0.0.0.0:8766): /stream — multipart/x-mixed-replace MJPEG /snapshot — single JPEG /health — JSON stats (frame count, dropped, resolution, fps) - Thread-safe single-slot FrameBuffer; CaptureThread rate-limited with wall-clock accounting for capture latency - Flags: --ws-port, --http-port, --width, --height, --fps, --quality, --device, --camera-id, --no-http, --debug Jetson side — saltybot_phone/phone_camera_node.py: - ROS2 node: receives JPEG frames, publishes: /saltybot/phone/camera sensor_msgs/Image (bgr8) /saltybot/phone/camera/compressed sensor_msgs/CompressedImage /saltybot/phone/camera/info std_msgs/String (stream metadata) - WebSocket client (primary); HTTP MJPEG polling fallback on WS failure - Auto-reconnect loop (default 3 s) for both transports - Latency warning when frame age > latency_warn_ms (default 200 ms) - 10 s diagnostics log: received/published counts + last frame age - Registered as phone_camera_node console script in setup.py - Added to phone_bringup.py launch with phone_host / phone_cam_enabled args Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Description
SaltyLab self-balancing bot firmware (STM32F722)
Languages
Python
67.1%
C
11.4%
JavaScript
9.2%
OpenSCAD
7.8%
HTML
1.5%
Other
2.9%