feat(social): Bridge orchestrator pipeline state to face display WebSocket API #394

Closed
opened 2026-03-04 12:38:26 -05:00 by seb · 0 comments
Owner

Context

The face display runs as a standalone Node.js server on port 3000 with WebSocket expression control:

  • curl http://localhost:3000/face/0-5 changes expression
  • 0=Tracking, 1=Alert, 2=Standby, 3=Searching, 4=Social, 5=Salty
  • systemd: salty-face-server.service

The orchestrator publishes pipeline state on /social/orchestrator/state (JSON string):

  • States: IDLE, LISTENING, THINKING, SPEAKING, THROTTLED

There is no node bridging these two systems. When a wake word is detected the face should visually change so the user knows the robot is listening.

Required

Create face_display_bridge_node.py that:

  1. Subscribes to /social/orchestrator/state
  2. Subscribes to /saltybot/wake_word_detected (Bool)
  3. Maps state transitions to face expressions via HTTP/WebSocket:
    • IDLE → 0 (Tracking)
    • LISTENING → 1 (Alert)
    • THINKING → 3 (Searching)
    • SPEAKING → 4 (Social)
  4. On wake word detection → immediate switch to Alert (1)
  5. Configurable face server URL parameter

Face Display Server

  • Node.js + WebSocket, serves /face/:id REST endpoint
  • Source: deployed on Orin at /home/seb/salty-face-server/

Reported by: Salty (integration testing on Orin)

## Context The face display runs as a standalone Node.js server on port 3000 with WebSocket expression control: - `curl http://localhost:3000/face/0-5` changes expression - 0=Tracking, 1=Alert, 2=Standby, 3=Searching, 4=Social, 5=Salty - systemd: `salty-face-server.service` The orchestrator publishes pipeline state on `/social/orchestrator/state` (JSON string): - States: IDLE, LISTENING, THINKING, SPEAKING, THROTTLED **There is no node bridging these two systems.** When a wake word is detected the face should visually change so the user knows the robot is listening. ## Required Create `face_display_bridge_node.py` that: 1. Subscribes to `/social/orchestrator/state` 2. Subscribes to `/saltybot/wake_word_detected` (Bool) 3. Maps state transitions to face expressions via HTTP/WebSocket: - IDLE → 0 (Tracking) - LISTENING → 1 (Alert) - THINKING → 3 (Searching) - SPEAKING → 4 (Social) 4. On wake word detection → immediate switch to Alert (1) 5. Configurable face server URL parameter ## Face Display Server - Node.js + WebSocket, serves `/face/:id` REST endpoint - Source: deployed on Orin at `/home/seb/salty-face-server/` Reported by: Salty (integration testing on Orin)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#394
No description provided.