Alina Lozovskaya
commited on
Commit
·
1899742
1
Parent(s):
b1ab0ab
Remove --sim argument
Browse files
README.md
CHANGED
|
@@ -58,7 +58,6 @@ reachy-mini-conversation-demo
|
|
| 58 |
|
| 59 |
| Option | Values | Default | Description |
|
| 60 |
|--------|--------|---------|-------------|
|
| 61 |
-
| `--sim` | *(flag)* | off | Run in **simulation mode** (no physical robot required). |
|
| 62 |
| `--head-tracker` | `yolo`, `mediapipe` | `None` | Enable **head tracking** using the specified tracker:<br>• **yolo** → YOLO-based head tracker.<br>• **mediapipe** → MediaPipe-based head tracker.<br>*(Automatically disabled when `--sim` is active)* |
|
| 63 |
| `--no-camera` | *(flag)* | off | Disable **camera usage** entirely. |
|
| 64 |
| `--gradio` | *(flag)* | off | **⚠️ Under construction** - Open Gradio interface (currently not implemented). |
|
|
|
|
| 58 |
|
| 59 |
| Option | Values | Default | Description |
|
| 60 |
|--------|--------|---------|-------------|
|
|
|
|
| 61 |
| `--head-tracker` | `yolo`, `mediapipe` | `None` | Enable **head tracking** using the specified tracker:<br>• **yolo** → YOLO-based head tracker.<br>• **mediapipe** → MediaPipe-based head tracker.<br>*(Automatically disabled when `--sim` is active)* |
|
| 62 |
| `--no-camera` | *(flag)* | off | Disable **camera usage** entirely. |
|
| 63 |
| `--gradio` | *(flag)* | off | **⚠️ Under construction** - Open Gradio interface (currently not implemented). |
|
src/reachy_mini_conversation_demo/camera_worker.py
CHANGED
|
@@ -25,11 +25,10 @@ logger = logging.getLogger(__name__)
|
|
| 25 |
class CameraWorker:
|
| 26 |
"""Thread-safe camera worker with frame buffering and face tracking."""
|
| 27 |
|
| 28 |
-
def __init__(self, reachy_mini: ReachyMini, head_tracker=None
|
| 29 |
"""Initialize."""
|
| 30 |
self.reachy_mini = reachy_mini
|
| 31 |
self.head_tracker = head_tracker
|
| 32 |
-
self.use_sim = use_sim
|
| 33 |
|
| 34 |
# Thread-safe frame storage
|
| 35 |
self.latest_frame: Optional[np.ndarray] = None
|
|
@@ -37,16 +36,6 @@ class CameraWorker:
|
|
| 37 |
self._stop_event = threading.Event()
|
| 38 |
self._thread: Optional[threading.Thread] = None
|
| 39 |
|
| 40 |
-
# Local camera for simulation mode
|
| 41 |
-
self.local_camera: Optional[cv2.VideoCapture] = None
|
| 42 |
-
if self.use_sim:
|
| 43 |
-
self.local_camera = cv2.VideoCapture(0)
|
| 44 |
-
if not self.local_camera.isOpened():
|
| 45 |
-
logger.error("Failed to open local camera in simulation mode")
|
| 46 |
-
self.local_camera = None
|
| 47 |
-
else:
|
| 48 |
-
logger.info("Local camera opened for simulation mode")
|
| 49 |
-
|
| 50 |
# Face tracking state
|
| 51 |
self.is_head_tracking_enabled = True
|
| 52 |
self.face_tracking_offsets = [
|
|
@@ -104,11 +93,6 @@ class CameraWorker:
|
|
| 104 |
if self._thread is not None:
|
| 105 |
self._thread.join()
|
| 106 |
|
| 107 |
-
# Release local camera if it was opened
|
| 108 |
-
if self.local_camera is not None:
|
| 109 |
-
self.local_camera.release()
|
| 110 |
-
logger.debug("Local camera released")
|
| 111 |
-
|
| 112 |
logger.debug("Camera worker stopped")
|
| 113 |
|
| 114 |
def working_loop(self) -> None:
|
|
@@ -126,14 +110,8 @@ class CameraWorker:
|
|
| 126 |
try:
|
| 127 |
current_time = time.time()
|
| 128 |
|
| 129 |
-
# Get frame from
|
| 130 |
-
|
| 131 |
-
ret, frame = self.local_camera.read()
|
| 132 |
-
if not ret:
|
| 133 |
-
frame = None
|
| 134 |
-
logger.warning("Failed to read frame from local camera")
|
| 135 |
-
else:
|
| 136 |
-
frame = self.reachy_mini.media.get_frame()
|
| 137 |
|
| 138 |
if frame is not None:
|
| 139 |
# Thread-safe frame storage
|
|
|
|
| 25 |
class CameraWorker:
|
| 26 |
"""Thread-safe camera worker with frame buffering and face tracking."""
|
| 27 |
|
| 28 |
+
def __init__(self, reachy_mini: ReachyMini, head_tracker=None):
|
| 29 |
"""Initialize."""
|
| 30 |
self.reachy_mini = reachy_mini
|
| 31 |
self.head_tracker = head_tracker
|
|
|
|
| 32 |
|
| 33 |
# Thread-safe frame storage
|
| 34 |
self.latest_frame: Optional[np.ndarray] = None
|
|
|
|
| 36 |
self._stop_event = threading.Event()
|
| 37 |
self._thread: Optional[threading.Thread] = None
|
| 38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
# Face tracking state
|
| 40 |
self.is_head_tracking_enabled = True
|
| 41 |
self.face_tracking_offsets = [
|
|
|
|
| 93 |
if self._thread is not None:
|
| 94 |
self._thread.join()
|
| 95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
logger.debug("Camera worker stopped")
|
| 97 |
|
| 98 |
def working_loop(self) -> None:
|
|
|
|
| 110 |
try:
|
| 111 |
current_time = time.time()
|
| 112 |
|
| 113 |
+
# Get frame from robot
|
| 114 |
+
frame = self.reachy_mini.media.get_frame()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
|
| 116 |
if frame is not None:
|
| 117 |
# Thread-safe frame storage
|
src/reachy_mini_conversation_demo/main.py
CHANGED
|
@@ -32,11 +32,7 @@ def main():
|
|
| 32 |
logger = setup_logger(args.debug)
|
| 33 |
logger.info("Starting Reachy Mini Conversation Demo")
|
| 34 |
|
| 35 |
-
|
| 36 |
-
if args.sim:
|
| 37 |
-
robot = ReachyMini(use_sim=True, media_backend="no_media")
|
| 38 |
-
else:
|
| 39 |
-
robot = ReachyMini(use_sim=False)
|
| 40 |
|
| 41 |
camera_worker, _, vision_manager = handle_vision_stuff(args, robot)
|
| 42 |
|
|
|
|
| 32 |
logger = setup_logger(args.debug)
|
| 33 |
logger.info("Starting Reachy Mini Conversation Demo")
|
| 34 |
|
| 35 |
+
robot = ReachyMini()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
camera_worker, _, vision_manager = handle_vision_stuff(args, robot)
|
| 38 |
|
src/reachy_mini_conversation_demo/utils.py
CHANGED
|
@@ -8,7 +8,6 @@ from reachy_mini_conversation_demo.camera_worker import CameraWorker
|
|
| 8 |
def parse_args():
|
| 9 |
"""Parse command line arguments."""
|
| 10 |
parser = argparse.ArgumentParser("Reachy Mini Conversation Demo")
|
| 11 |
-
parser.add_argument("--sim", action="store_true", help="Run in simulation mode")
|
| 12 |
parser.add_argument(
|
| 13 |
"--head-tracker",
|
| 14 |
choices=["yolo", "mediapipe", None],
|
|
@@ -28,8 +27,7 @@ def handle_vision_stuff(args, current_robot):
|
|
| 28 |
head_tracker = None
|
| 29 |
vision_manager = None
|
| 30 |
if not args.no_camera:
|
| 31 |
-
|
| 32 |
-
if args.head_tracker is not None and not args.sim:
|
| 33 |
if args.head_tracker == "yolo":
|
| 34 |
from reachy_mini_conversation_demo.vision.yolo_head_tracker import (
|
| 35 |
HeadTracker,
|
|
@@ -41,12 +39,8 @@ def handle_vision_stuff(args, current_robot):
|
|
| 41 |
from reachy_mini_toolbox.vision import HeadTracker
|
| 42 |
|
| 43 |
head_tracker = HeadTracker()
|
| 44 |
-
elif args.head_tracker is not None and args.sim:
|
| 45 |
-
logger.warning(
|
| 46 |
-
f"Head tracking (--head-tracker {args.head_tracker}) is disabled in simulation mode (--sim)"
|
| 47 |
-
)
|
| 48 |
|
| 49 |
-
camera_worker = CameraWorker(current_robot, head_tracker
|
| 50 |
|
| 51 |
return camera_worker, head_tracker, vision_manager
|
| 52 |
|
|
|
|
| 8 |
def parse_args():
|
| 9 |
"""Parse command line arguments."""
|
| 10 |
parser = argparse.ArgumentParser("Reachy Mini Conversation Demo")
|
|
|
|
| 11 |
parser.add_argument(
|
| 12 |
"--head-tracker",
|
| 13 |
choices=["yolo", "mediapipe", None],
|
|
|
|
| 27 |
head_tracker = None
|
| 28 |
vision_manager = None
|
| 29 |
if not args.no_camera:
|
| 30 |
+
if args.head_tracker is not None:
|
|
|
|
| 31 |
if args.head_tracker == "yolo":
|
| 32 |
from reachy_mini_conversation_demo.vision.yolo_head_tracker import (
|
| 33 |
HeadTracker,
|
|
|
|
| 39 |
from reachy_mini_toolbox.vision import HeadTracker
|
| 40 |
|
| 41 |
head_tracker = HeadTracker()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
+
camera_worker = CameraWorker(current_robot, head_tracker)
|
| 44 |
|
| 45 |
return camera_worker, head_tracker, vision_manager
|
| 46 |
|