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>
SaltyBot Android/Termux Phone Node (Issue #420)
Android phone node for SaltyBot via Termux. Provides camera, GPS, IMU sensors and local OpenClaw LLM inference.
Setup
On phone (Termux):
bash termux-bootstrap.sh
mkdir -p ~/saltybot_workspace/src
cd ~/saltybot_workspace && colcon build
Running
cd ~/saltybot_workspace && source install/setup.bash
ros2 launch saltybot_phone phone_bringup.py
Topics
| Topic | Type | Description |
|---|---|---|
/phone/camera/image_raw |
Image | Camera frames 320x240@15Hz |
/phone/gps |
NavSatFix | GPS location |
/phone/imu |
Imu | Accelerometer data |
/saltybot/speech_text |
String | Input from Jetson |
/saltybot/chat_response |
String | LLM output to Jetson |
Power Management
nohup bash ~/power-management.sh > ~/power-mgmt.log 2>&1 &
Reduces CPU activity on low battery (<25%) or critical battery (<15%).
Configuration
Edit config/phone.yaml to adjust frame rates and LLM parameters.
Issue #420 Completion
✅ Termux bootstrap ✅ Camera / GPS / IMU nodes ✅ OpenClaw chat (local LLM) ✅ WebSocket bridge to Orin ✅ Termux:Boot auto-start ✅ Power management