Compare commits

..

No commits in common. "9257f4c7de1f1881cc3edb46315b0ec2762e32fb" and "12225329713f4cd73df0e9ec1c53c0649b238a50" have entirely different histories.

View File

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