diff --git a/jetson/ros2_ws/src/saltybot_social_enrollment/saltybot_social_enrollment/social_enrollment_node.py b/jetson/ros2_ws/src/saltybot_social_enrollment/saltybot_social_enrollment/social_enrollment_node.py index d38fc6d..2b6d923 100644 --- a/jetson/ros2_ws/src/saltybot_social_enrollment/saltybot_social_enrollment/social_enrollment_node.py +++ b/jetson/ros2_ws/src/saltybot_social_enrollment/saltybot_social_enrollment/social_enrollment_node.py @@ -143,9 +143,13 @@ class SocialEnrollmentNode(Node): self.create_timer(0.5, self._enrollment_timeout_check) self.get_logger().info( +<<<<<<< HEAD f'Social enrollment node initialized. ' f'Queue: {self.queue_dir}, ' f'Speakers: {self.speaker_embeddings_path}' +======= + f'Social enrollment node initialized. Queue: {self.queue_dir}' +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment ) def _on_orchestrator_state(self, msg: String) -> None: @@ -166,9 +170,12 @@ class SocialEnrollmentNode(Node): context=context, timestamp=time.time() ) +<<<<<<< HEAD self._face_embedding_timestamp = 0.0 self._voice_embedding_timestamp = 0.0 self._image_timestamp = 0.0 +======= +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment self.get_logger().info( f'Enrollment triggered: {name} (ID: {person_id})' @@ -186,16 +193,23 @@ class SocialEnrollmentNode(Node): if self._enrollment_request is None: return +<<<<<<< HEAD # Take first detected face embedding +======= +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment face_emb = msg.embeddings[0] emb_array = np.frombuffer(face_emb.embedding, dtype=np.float32) if len(emb_array) == self.face_emb_dim: self._latest_face_embedding = emb_array.copy() self._face_embedding_timestamp = time.time() +<<<<<<< HEAD self.get_logger().debug( f'Face embedding captured: {face_emb.track_id}' ) +======= + self.get_logger().debug(f'Face embedding captured') +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment def _on_speaker_embedding(self, msg: String) -> None: """Capture voice speaker embedding from ECAPA-TDNN.""" @@ -212,9 +226,13 @@ class SocialEnrollmentNode(Node): if len(emb_array) == self.voice_emb_dim: self._latest_voice_embedding = emb_array.copy() self._voice_embedding_timestamp = time.time() +<<<<<<< HEAD self.get_logger().debug( f'Voice embedding captured: {len(emb_array)} dims' ) +======= + self.get_logger().debug(f'Voice embedding captured') +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment except json.JSONDecodeError as e: self.get_logger().error(f'Invalid speaker embedding JSON: {e}') @@ -226,7 +244,10 @@ class SocialEnrollmentNode(Node): if self._enrollment_request is None: return +<<<<<<< HEAD # Store latest image +======= +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment self._latest_image = msg self._image_timestamp = time.time() @@ -240,15 +261,22 @@ class SocialEnrollmentNode(Node): return now = time.time() +<<<<<<< HEAD timeout = 10.0 # 10 seconds to collect embeddings +======= + timeout = 10.0 +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment # Check if all data collected has_face = self._latest_face_embedding is not None and \ (now - self._face_embedding_timestamp < 5.0) has_voice = self._latest_voice_embedding is not None and \ (now - self._voice_embedding_timestamp < 5.0) +<<<<<<< HEAD has_image = self._latest_image is not None and \ (now - self._image_timestamp < 5.0) +======= +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment # If we have face + voice, proceed with enrollment if has_face and has_voice: @@ -275,6 +303,7 @@ class SocialEnrollmentNode(Node): 'context': request.context, 'timestamp': request.timestamp, 'datetime': datetime.fromtimestamp(request.timestamp).isoformat(), +<<<<<<< HEAD 'face_embedding_shape': list(self._latest_face_embedding.shape) if self._latest_face_embedding is not None else None, 'voice_embedding_shape': list(self._latest_voice_embedding.shape) @@ -282,6 +311,10 @@ class SocialEnrollmentNode(Node): } # Save queue JSON +======= + } + +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment queue_file = self.queue_dir / f"enrollment_{request.person_id}_{int(request.timestamp)}.json" with open(queue_file, 'w') as f: json.dump(enroll_data, f, indent=2) @@ -385,7 +418,10 @@ class SocialEnrollmentNode(Node): ) return +<<<<<<< HEAD # Call EnrollPerson service +======= +>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment req = EnrollPerson.Request() req.name = request.name req.mode = 'face'