3.5 KiB
Sanad Package 2 — Premium Communication
Superset of P1. Dashboard on :8012. Self-contained — vendors the SanadV3
engine + the BLE Mask lib under vendor/, builds FROM python:3.10-slim with no
sanad-base/Sanad_Core/sibling checkout. Full design: PLAN.md.
P2 = everything P1 does + multilingual auto-detect, voice-command arm gestures, gestures while speaking, wake-phrases, skills, and a lip-syncing LED "Shining Mask". (Voice-command locomotion is deferred to a later pass.)
Quick start (how to start)
On the robot, from this folder (Sanad_Package_2/):
cp .env.example .env # optional: license / audio / mask MAC
docker compose up -d --build # build (vendored engine + mask + chest-audio SDK) + run
# Jetson Docker without buildx: DOCKER_BUILDKIT=0 docker compose up -d --build
Open http://<robot-ip>:8012 (ships keyless):
- Gemini API key card → paste your key.
- Persona card → who the robot is (the bilingual prompt drives multilingual auto-detect).
- Audio card → chest vs USB/Anker; Mask tab → connect the LED face, lip-sync test.
- Live-voice tab → enable voice-command arm gestures (default OFF). Press Start and talk.
P2 needs a license that entitles P2 — the bundled
license/sanad.lic.exampleentitles P1+P2+P3 for demo. The LED mask must be paired/in range and freed from the phone app.bleakis pinned to 0.22.3 (BlueZ 5.53 compat).
Manage it: docker compose logs -f · docker compose down · ./test_p2.sh <robot-ip>:8012.
Auto-start on boot: sudo systemctl enable docker (compose runs restart: unless-stopped).
Brand-new robot (build + sign a P2 license) → NEW_ROBOT_SETUP.md.
What it ships
app_p2.py— launcher: bootstrapsProject.Sanad+ the flat Mask path, constructs the P2 superset (comms + arm +FaceControllermask), wires lip-sync (Gemini[[MOUTH:n]]markers →mask_face.set_mouth), gestures-while-speaking, lifelike face state, and the arm motion-block interlock seam (no-op while loco deferred); mounts the P1 + premium routers; serves the SanadV3 SPA (non-P2 tabs hidden) on :8012.routes_p2.py—/api/p2/*convenience routes (api-key, persona, say, logs, settings) with live-session restart.vendor/Sanad(SanadV3 engine) ·vendor/sanad_pkg(license+bus) ·vendor/mask(flat BLE Shining-Mask lib, own path viaSANAD_MASK_DIR=/app/mask).Dockerfile(+ BlueZ/D-Bus,bleak==0.22.3, Pillow) ·docker-compose.yml(BLE mounts:/var/run/dbus,NET_ADMIN,/dev/bus/usb) ·entrypoint.sh(license gateP2→ resolve env → preflight → launch) ·sync_vendor.sh.
Dashboard (:8012) — all P1 tabs +
Live-voice (commands) · Wake-phrases · Motion/Gestural (arm only) · Skills ·
Mask/Lip-sync (/api/mask/*: connect, brightness, face start/stop, speaking,
mouth, expressions, status) · Logs · Voice (multilingual).
License features
multilingual, voice_command_motion (arm gestures), lipsync, mask
(entrypoint checks entitlement P2). A future voice_command_locomotion feature
gates the deferred walking.
Status
Built + structurally validated on the workstation (compile, import resolution,
shim-symbol coverage, namespace bootstrap, license_check P2 entitled, YAML).
Pending: Docker build + on-robot test (chest audio + arm work; mask lip-sync
needs the physical BLE mask paired and freed from the phone app). See PLAN.md
"Open decisions" for the in-container-BLE confirmation.