feat: add gesture playback and return-to-rest
Browse files- mr_reachy/expressions.py +15 -0
mr_reachy/expressions.py
CHANGED
|
@@ -91,3 +91,18 @@ REST = create_head_pose(mm=True, degrees=True)
|
|
| 91 |
|
| 92 |
def _pose(frame: Frame):
|
| 93 |
return create_head_pose(mm=True, degrees=True, **frame.head)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
def _pose(frame: Frame):
|
| 93 |
return create_head_pose(mm=True, degrees=True, **frame.head)
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
def play(reachy, emotion: str, stop_event: threading.Event | None = None) -> None:
|
| 97 |
+
"""Play a named gesture sequence. Blocks until finished (or stop_event set)."""
|
| 98 |
+
frames = GESTURES.get(emotion, GESTURES["neutral"])
|
| 99 |
+
for frame in frames:
|
| 100 |
+
if stop_event is not None and stop_event.is_set():
|
| 101 |
+
break
|
| 102 |
+
reachy.goto_target(
|
| 103 |
+
head=_pose(frame), antennas=list(frame.antennas), duration=frame.duration
|
| 104 |
+
)
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
def go_rest(reachy, duration: float = 0.4) -> None:
|
| 108 |
+
reachy.goto_target(head=REST, antennas=[0.0, 0.0], duration=duration)
|