Pular para o conteúdo

Como funciona

Cada quadro da câmera passa pela mesma cadeia. Nenhuma peça sabe das outras mais do que precisa, por isso cada uma pode ser testada e substituída separadamente.

PoseProvidercâmera · gravaçãoPoseMotionSessionVisibilidade+ SetupCheckRepEngineMeasure + FormRuleMotionSnapshotestado → a telaMotionEventmomentos → voz, háptica

Um PoseProvider entrega um AsyncStream<Pose>. Pode ser a câmera (VisionPoseProvider), uma gravação (RecordedPoseProvider) ou o que você implementar. Cada Pose são os pontos do corpo de um quadro, em pixels e com os lados já corrigidos.

MotionSession é a porta de entrada. Para cada pose:

  1. Visibilidade. Todas as articulações que o exercício mede estão visíveis? A mudança é confirmada após alguns quadros seguidos (~0,25 s) para não piscar.
  2. Posicionamento. SetupCheck verifica se o paciente está de frente ou de lado, longe demais ou na borda da imagem.
  3. Motor. RepEngine calcula a medição principal, suaviza, verifica as regras de forma e decide se uma repetição terminou.
  4. Medição inicial. Se houver uma em andamento, atualiza o progresso.

Depois publica o resultado de duas formas.

MotionSnapshot MotionEvent
O que é O estado completo, em um valor Algo que aconteceu neste quadro
Como ler session.snapshot (observável) for await event in session.events()
Para quê Desenhar: ângulo, contador, anel de progresso Reagir uma vez: dizer «muito bem!», vibrar, salvar

Mais detalhes em Eventos e snapshot.

O motor não tem nenhum exercício programado. Um ExerciseDefinition descreve:

  • o que medir (primary, uma Measure),
  • como contar (kind: repetições ou sustentação),
  • que técnica exigir (rules, uma lista de FormRule),
  • de onde olhar (view: de lado ou de frente).

Como tudo é Codable, um exercício novo pode chegar em JSON do seu servidor. Veja Exercícios personalizados.