sl-perception
672120bb50
feat(perception): geometric face emotion classifier (Issue #359)
Classifies facial expressions into neutral/happy/surprised/angry/sad
using geometric rules over MediaPipe Face Mesh landmarks — no ML model
required at runtime.
Rules
-----
surprised: brow_raise > 0.12 AND eye_open > 0.07 AND mouth_open > 0.07
happy: smile > 0.025 (lip corners above lip midpoint)
angry: brow_furl > 0.02 AND smile < 0.01
sad: smile < -0.025 AND brow_furl < 0.015
neutral: default
Changes
-------
- saltybot_scene_msgs/msg/FaceEmotion.msg — per-face emotion + features
- saltybot_scene_msgs/msg/FaceEmotionArray.msg
- saltybot_scene_msgs/CMakeLists.txt — register new msgs
- _face_emotion.py — pure-Python: FaceLandmarks, compute_features,
classify_emotion, detect_emotion, from_mediapipe
- face_emotion_node.py — subscribes /camera/color/image_raw,
publishes /saltybot/face_emotions (≤15 fps)
- test/test_face_emotion.py — 48 tests, all passing
- setup.py — add face_emotion entry point
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 14:39:49 -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 14:39:49 -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 14:39:49 -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