sl-webui
e2587b60fb
feat: SaltyFace web app UI for Chromium kiosk (Issue #370)
Animated robot expression interface as lightweight web application:
**Architecture:**
- HTML5 Canvas rendering engine
- Node.js HTTP server (localhost:3000)
- ROSLIB WebSocket bridge for ROS2 topics
- Fullscreen responsive design (1024×600)
**Features:**
- 8 emotional states (happy, alert, confused, sleeping, excited, emergency, listening, talking)
- Real-time ROS2 subscriptions:
- /saltybot/state (emotion triggers)
- /saltybot/battery (status display)
- /saltybot/target_track (EXCITED emotion)
- /saltybot/obstacles (ALERT emotion)
- /social/speech/is_speaking (TALKING emotion)
- /social/speech/is_listening (LISTENING emotion)
- Tap-to-toggle status overlay
- 60fps Canvas animation on Wayland
- ~80MB total memory (Node.js + browser)
**Files:**
- public/index.html — Main page (1024×600 fullscreen)
- public/salty-face.js — Canvas rendering + ROS2 integration
- server.js — Node.js HTTP server with CORS support
- systemd/salty-face-server.service — Auto-start systemd service
- docs/SALTY_FACE_WEB_APP.md — Complete setup & API documentation
**Integration:**
- Runs in Chromium kiosk (Issue #374)
- Depends on rosbridge_server for WebSocket bridge
- Serves on localhost:3000 (configurable)
**Next:** Issue #371 (Accessibility enhancements)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-03 16:42:41 -05:00
..
2026-03-02 12:22:58 -05:00
2026-03-02 09:38:46 -05:00
2026-03-02 11:07:35 -05:00
2026-03-02 11:07:35 -05:00
2026-03-03 00:46:12 -05:00
2026-03-02 12:48:16 -05:00
2026-03-02 09:27:06 -05:00
2026-03-03 00:41:39 -05:00
2026-03-03 16:42:41 -05:00
2026-03-02 08:38:24 -05:00
2026-02-28 22:59:13 -05:00
2026-03-01 00:42:18 -05:00
2026-03-02 20:45:21 -05:00
2026-03-02 12:01:00 -05:00
2026-03-02 12:11:37 -05:00
2026-02-28 22:57:58 -05:00
2026-03-02 10:19:22 -05:00
2026-03-02 10:19:22 -05:00
2026-03-02 10:44:32 -05:00
2026-03-02 10:44:32 -05:00
2026-03-02 10:39:37 -05:00
2026-03-02 10:39:37 -05:00
2026-03-02 09:36:17 -05:00
2026-03-02 09:36:17 -05:00
2026-03-01 00:48:03 -05:00
2026-03-02 21:06:58 -05:00
2026-03-03 12:47:22 -05:00
2026-03-03 12:47:22 -05:00
2026-03-02 17:35:30 -05:00
2026-03-02 09:17:54 -05:00
2026-03-02 08:38:49 -05:00
2026-03-02 11:57:17 -05:00
2026-03-02 10:36:21 -05:00
2026-03-02 11:17:19 -05:00
2026-03-02 11:50:13 -05:00
2026-03-01 00:52:54 -05:00
2026-03-02 08:41:40 -05:00
2026-03-02 12:12:57 -05:00
2026-03-02 11:39:21 -05:00
2026-03-02 11:39:21 -05:00
2026-03-02 11:47:05 -05:00
2026-03-02 21:37:08 -05:00
2026-03-03 06:47:45 -05:00
2026-03-01 01:07:06 -05:00
2026-03-02 09:03:28 -05:00
2026-03-02 09:59:53 -05:00
2026-03-03 15:25:23 -05:00
2026-03-01 01:15:13 -05:00
2026-03-01 01:15:13 -05:00
2026-03-03 13:54:31 -05:00
2026-03-01 23:32:26 -05:00
2026-03-02 12:05:24 -05:00
2026-03-02 12:05:24 -05:00
2026-03-01 23:15:00 -05:00
2026-03-01 23:56:05 -05:00
2026-03-02 08:50:22 -05:00
2026-03-01 23:59:10 -05:00
2026-03-01 01:06:50 -05:00
2026-03-02 11:14:10 -05:00
2026-02-28 23:19:23 -05:00
2026-03-02 09:14:37 -05:00
2026-03-02 10:04:36 -05:00
2026-03-02 10:04:36 -05:00
2026-03-02 11:21:18 -05:00
2026-03-01 23:25:08 -05:00
2026-03-01 23:25:08 -05:00
2026-03-03 00:23:53 -05:00
2026-03-02 10:15:32 -05:00
2026-03-02 17:29:03 -05:00