{"id":11367,"date":"2026-09-23T09:22:17","date_gmt":"2026-09-23T07:22:17","guid":{"rendered":"https:\/\/spleeft.app\/?p=11367"},"modified":"2026-09-23T09:22:22","modified_gmt":"2026-09-23T07:22:22","slug":"algoritmo-de-velocidade-da-barra-spleeft","status":"publish","type":"post","link":"https:\/\/spleeft.app\/pt\/algoritmo-de-velocidade-da-barra-spleeft\/","title":{"rendered":"Melhorar o algoritmo de velocidade da barra do Spleeft com dados reais"},"content":{"rendered":"<p>Para melhorar as medi\u00e7\u00f5es de velocidade do guiador do Spleeft, recolhi registos em paralelo com um codificador linear durante um treino com a equipa espanhola de BMX em Paris. Recriei o algoritmo para iOS em Python e concentrei-me na dete\u00e7\u00e3o de per\u00edodos de descanso reais e de repeti\u00e7\u00f5es completas, em que o ru\u00eddo do sensor poderia, de outra forma, distorcer o resultado.<\/p>\n<p>Comecei a desenvolver o Spleeft como um projeto pessoal enquanto trabalhava na prepara\u00e7\u00e3o f\u00edsica. A programa\u00e7\u00e3o ajudou-me a transformar ideias do treino numa ferramenta para medir a velocidade da barra e deu-me uma forma de mostrar o que era capaz de fazer para al\u00e9m do gin\u00e1sio.<\/p>\n<p>\u00c0 medida que a IA tornou a programa\u00e7\u00e3o mais acess\u00edvel, comecei a questionar-me sobre onde poderia dar o meu maior contributo. A resposta estava naquilo que o c\u00f3digo, por si s\u00f3, n\u00e3o conseguia resolver: compreender os dados dos sensores e tornar as medi\u00e7\u00f5es mais fi\u00e1veis no treino real. Essa quest\u00e3o levou ao projeto de algoritmos que pretendo partilhar aqui.<\/p>\n<p><strong>Experimenta o Spleeft:<\/strong> <a href=\"https:\/\/apps.apple.com\/us\/app\/spleeft\/id1606893985\" target=\"_blank\" rel=\"noopener\">Descarrega o Spleeft na App Store<\/a> para monitorizar a velocidade da barra com o teu iPhone ou Apple Watch.<\/p>\n<h2>O problema da velocidade da barra: desvio e falsas pausas<\/h2>\n<p>A otimiza\u00e7\u00e3o anterior do Spleeft, que descrevi em <a href=\"https:\/\/spleeft.app\/data-science-project-behind-spleeft-vbt-ios\/\">o artigo original sobre ci\u00eancia de dados<\/a>, teve um \u00e2mbito mais restrito. Concentrei-me principalmente em ajustar os par\u00e2metros de um algoritmo j\u00e1 existente e em encontrar combina\u00e7\u00f5es que melhorassem o seu desempenho.<\/p>\n<p>Esse trabalho foi valioso, mas depois de passar mais tempo a testar o Spleeft em ambientes de forma\u00e7\u00e3o reais, comecei a perceber que havia um problema mais profundo.<\/p>\n<p>A principal dificuldade n\u00e3o residia simplesmente no c\u00e1lculo da velocidade.<\/p>\n<p>Era saber quando um movimento come\u00e7ava, quando terminava e quando o aparelho estava realmente im\u00f3vel.<\/p>\n<p>O Spleeft utiliza dados do aceler\u00f3metro. Para calcular a velocidade, \u00e9 necess\u00e1rio integrar a acelera\u00e7\u00e3o ao longo do tempo. Esta abordagem \u00e9 matematicamente elegante, mas tamb\u00e9m cria um problema inevit\u00e1vel: mesmo um pequeno desvio ou erro no sinal de acelera\u00e7\u00e3o acumula-se durante a integra\u00e7\u00e3o e transforma-se num desvio de velocidade.<\/p>\n<p>Essa varia\u00e7\u00e3o pode ter v\u00e1rias origens:<\/p>\n<ul>\n<li>ru\u00eddo do sensor;<\/li>\n<li>pequenas altera\u00e7\u00f5es na orienta\u00e7\u00e3o do dispositivo;<\/li>\n<li>altera\u00e7\u00f5es no plano de movimento;<\/li>\n<li>erro de integra\u00e7\u00e3o;<\/li>\n<li>filtragem imperfeita;<\/li>\n<li>vibra\u00e7\u00f5es provenientes do atleta ou da barra;<\/li>\n<li>per\u00edodos de baixa acelera\u00e7\u00e3o enquanto a barra ainda se encontra em movimento.<\/li>\n<\/ul>\n<p>Este \u00faltimo ponto \u00e9 particularmente importante. Uma acelera\u00e7\u00e3o pr\u00f3xima de zero nem sempre significa que a velocidade seja zero. Pode tamb\u00e9m significar que a barra se est\u00e1 a mover a uma velocidade relativamente constante.<\/p>\n<p>Por isso, o verdadeiro desafio n\u00e3o consistia simplesmente em encontrar \u201cmais zeros\u201d.<\/p>\n<p>O objetivo era encontrar melhores zeros.<\/p>\n<p>Um zero \u00e9 um momento que pode ser utilizado para recalibrar o sinal de velocidade integrado. Se o zero antes de uma repeti\u00e7\u00e3o estiver errado, a integra\u00e7\u00e3o come\u00e7a a partir do ponto errado. Se surgir um falso zero no meio de uma repeti\u00e7\u00e3o, o movimento pode ser interrompido ou recalibrado demasiado cedo.<\/p>\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"487\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/deadlift-velocity-fixed-4-reps-1024x487.png\" alt=\"Velocidade vertical ao longo de quatro repeti\u00e7\u00f5es de levantamento terra, mostrando o registo original a cinzento e o sinal corrigido em rela\u00e7\u00e3o ao desvio a azul-petr\u00f3leo\" class=\"wp-image-11364\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/deadlift-velocity-fixed-4-reps-1024x487.png 1024w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/deadlift-velocity-fixed-4-reps-300x143.png 300w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/deadlift-velocity-fixed-4-reps-2000x951.png 2000w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Quatro repeti\u00e7\u00f5es de levantamento terra: a curva cinzenta afasta-se do zero entre os movimentos, enquanto a curva corrigida regressa para mais perto do zero durante as pausas.<\/figcaption><\/figure>\n\n\n<p>Isto levou \u00e0 defini\u00e7\u00e3o de um novo princ\u00edpio para o projeto:<\/p>\n<blockquote>\n<p>Primeiro, melhore a qualidade da dete\u00e7\u00e3o do estado de repouso e da segmenta\u00e7\u00e3o das repeti\u00e7\u00f5es. Em seguida, avalie a velocidade.<\/p>\n<\/blockquote>\n<h2>Recolha de dados sobre a velocidade nas barras em Paris<\/h2>\n<p>O primeiro passo consistiu em obter um dispositivo de refer\u00eancia que pudesse ser utilizado em conjunto com o Spleeft.<\/p>\n<p>Uma empresa reconhecida no setor dos codificadores lineares tinha lan\u00e7ado um dispositivo capaz de fornecer n\u00e3o s\u00f3 a velocidade, mas tamb\u00e9m dados brutos que podiam ser recolhidos num contexto real de treino. Era exatamente isso de que eu precisava.<\/p>\n<p>Durante um est\u00e1gio com a sele\u00e7\u00e3o espanhola de BMX em Paris, recolhi um vasto conjunto de dados enquanto realizava diferentes exerc\u00edcios:<\/p>\n<ul>\n<li>agachamentos;<\/li>\n<li>levantamentos terra;<\/li>\n<li>power cleans;<\/li>\n<li>saltos em agachamento;<\/li>\n<li>outros exerc\u00edcios de for\u00e7a mista.<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"576\" height=\"1024\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/paris-data-collection-576x1024.jpg\" alt=\"Recolha de dados sobre o treino de for\u00e7a durante a concentra\u00e7\u00e3o da sele\u00e7\u00e3o espanhola de BMX em Paris\" class=\"wp-image-11365\" style=\"width:320px;height:auto\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/paris-data-collection-576x1024.jpg 576w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/paris-data-collection-169x300.jpg 169w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/paris-data-collection.jpg 900w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><figcaption class=\"wp-element-caption\">Recolha de dados relativos ao treino de for\u00e7a durante a concentra\u00e7\u00e3o da sele\u00e7\u00e3o espanhola de BMX em Paris.<\/figcaption><\/figure>\n\n\n<p>As medi\u00e7\u00f5es foram recolhidas simultaneamente:<\/p>\n<ul>\n<li>O Spleeft registou dados de aceler\u00f3metros de alta frequ\u00eancia, incluindo sess\u00f5es a at\u00e9 800 Hz;<\/li>\n<li>o codificador linear registava dados a uma frequ\u00eancia de aproximadamente 100 Hz.<\/li>\n<\/ul>\n<p>Este n\u00e3o era um conjunto de dados de laborat\u00f3rio recolhido em condi\u00e7\u00f5es perfeitamente controladas. Isso foi intencional.<\/p>\n<p>Queria compreender o que acontecia quando o sistema era utilizado nos ambientes em que os treinadores o utilizariam na pr\u00e1tica: com diferentes exerc\u00edcios, diferentes cargas, diferentes pausas, diferentes estrat\u00e9gias de movimento e diferentes fontes de ru\u00eddo.<\/p>\n<p>O conjunto de dados tamb\u00e9m me permitiu comparar dois tipos de medi\u00e7\u00e3o muito diferentes.<\/p>\n<p>O codificador mede o movimento ao longo de um percurso mec\u00e2nico mais definido. O Apple Watch ou o iPhone medem as for\u00e7as que atuam sobre o dispositivo, a barra e, indiretamente, o atleta. N\u00e3o captam exatamente o mesmo sinal.<\/p>\n<p>Essa diferen\u00e7a tornou-se uma das li\u00e7\u00f5es mais importantes do projeto.<\/p>\n<h2>Recriar o Spleeft em Python<\/h2>\n<p>Antes de otimizar qualquer coisa, tive de reproduzir o algoritmo existente do iOS fora da aplica\u00e7\u00e3o.<\/p>\n<p>Isto parece simples, mas foi uma das partes mais importantes de todo o processo.<\/p>\n<p>O algoritmo de produ\u00e7\u00e3o \u00e9 executado em Swift no iPhone e no Apple Watch. O trabalho de otimiza\u00e7\u00e3o, no entanto, foi muito mais f\u00e1cil de realizar em Python, onde pude processar grandes conjuntos de dados, gerar gr\u00e1ficos e testar milhares ou milh\u00f5es de combina\u00e7\u00f5es de par\u00e2metros.<\/p>\n<p>O problema era que uma aproxima\u00e7\u00e3o em Python n\u00e3o seria suficiente.<\/p>\n<p>Se a vers\u00e3o em Python se comportasse de forma diferente da vers\u00e3o em Swift, eu n\u00e3o estaria a otimizar o Spleeft. Estaria a otimizar um algoritmo diferente.<\/p>\n<p>Por isso, desenvolvi um simulador em Python que reproduzia as principais etapas de processamento da implementa\u00e7\u00e3o no iOS:<\/p>\n<ol>\n<li>ler os dados do aceler\u00f3metro e de movimento;<\/li>\n<li>velocidade de reconstru\u00e7\u00e3o;<\/li>\n<li>detetar atualiza\u00e7\u00f5es de velocidade nula;<\/li>\n<li>compensa\u00e7\u00e3o da deriva do sinal;<\/li>\n<li>segmenta\u00e7\u00e3o de repeti\u00e7\u00f5es;<\/li>\n<li>c\u00e1lculo da velocidade m\u00e9dia e de outros indicadores.<\/li>\n<\/ol>\n<p>Em seguida, comparei o simulador com os resultados do Swift. O objetivo n\u00e3o era obter um resultado semelhante, mas sim certificar-me de que o mesmo sinal bruto produzia as mesmas repeti\u00e7\u00f5es e m\u00e9tricas praticamente id\u00eanticas.<\/p>\n<p>S\u00f3 ap\u00f3s esta etapa \u00e9 que a otimiza\u00e7\u00e3o poderia passar a ter sentido.<\/p>\n<h2>Olhar para al\u00e9m do detetor de zero original<\/h2>\n<p>A primeira vers\u00e3o do algoritmo j\u00e1 inclu\u00eda a recalibra\u00e7\u00e3o \u00e0 velocidade zero, mas a sua l\u00f3gica era relativamente simples.<\/p>\n<p>Funcionou bem em situa\u00e7\u00f5es controladas. No entanto, alguns exerc\u00edcios revelaram as suas fraquezas. O supino e o levantamento terra revelaram-se particularmente desafiantes, uma vez que o aparelho pode sofrer movimentos adicionais enquanto o atleta estabiliza a barra.<\/p>\n<p>Comecei a investigar abordagens alternativas para a dete\u00e7\u00e3o de velocidade nula, com base na literatura cient\u00edfica e em aplica\u00e7\u00f5es relacionadas com a navega\u00e7\u00e3o inercial.<\/p>\n<p>Algumas das ideias inclu\u00edam:<\/p>\n<ul>\n<li>acelera\u00e7\u00e3o filtrada em v\u00e1rios eixos;<\/li>\n<li>informa\u00e7\u00f5es do girosc\u00f3pio;<\/li>\n<li>requisitos de persist\u00eancia ao longo de amostras consecutivas;<\/li>\n<li>energia cin\u00e9tica;<\/li>\n<li>verifica\u00e7\u00f5es baseadas no desvio;<\/li>\n<li>detetores estat\u00edsticos conservadores;<\/li>\n<li>limiares diferentes para os diferentes estados do movimento.<\/li>\n<\/ul>\n<p>Nem todas as ideias resultaram.<\/p>\n<p>Por exemplo, explorei um classificador de estado inercial baseado em \u00e1rvores de decis\u00e3o. Foi uma experi\u00eancia \u00fatil no \u00e2mbito da ci\u00eancia de dados, mas o seu desempenho n\u00e3o foi suficientemente fi\u00e1vel para se tornar um crit\u00e9rio de exclus\u00e3o definitivo no algoritmo de produ\u00e7\u00e3o.<\/p>\n<p>Esta foi uma distin\u00e7\u00e3o importante.<\/p>\n<p>O projeto envolveu experi\u00eancias de aprendizagem autom\u00e1tica e m\u00e9todos de ci\u00eancia de dados, mas a solu\u00e7\u00e3o final de produ\u00e7\u00e3o n\u00e3o foi um modelo de \u00abcaixa preta\u00bb que se limitasse a classificar todas as amostras. O processo de ci\u00eancia de dados ajudou-me a compreender o sinal, a identificar modos de falha e a conceber uma m\u00e1quina de estados causal mais robusta.<\/p>\n<p>O sistema final manteve-se interpret\u00e1vel.<\/p>\n<h2>Pesquisar entre milh\u00f5es de possibilidades<\/h2>\n<p>Assim que o simulador e os detetores candidatos ficaram dispon\u00edveis, comecei a realizar pesquisas sistem\u00e1ticas de par\u00e2metros.<\/p>\n<p>Para cada configura\u00e7\u00e3o candidata, os mesmos sinais brutos foram processados novamente. Os par\u00e2metros controlavam aspetos como:<\/p>\n<ul>\n<li>limiares de acelera\u00e7\u00e3o;<\/li>\n<li>o n\u00famero m\u00ednimo de amostras consecutivas;<\/li>\n<li>comportamento de filtragem;<\/li>\n<li>regras de introdu\u00e7\u00e3o de movimentos;<\/li>\n<li>regras de sa\u00edda de movimento;<\/li>\n<li>a quantidade de provas necess\u00e1rias antes da recalibra\u00e7\u00e3o;<\/li>\n<li>como o sistema geria as transi\u00e7\u00f5es entre o movimento e o repouso.<\/li>\n<\/ul>\n<p>A pesquisa n\u00e3o foi concebida para encontrar a configura\u00e7\u00e3o com o menor erro de velocidade em rela\u00e7\u00e3o ao codificador.<\/p>\n<p>Isso teria sido demasiado restrito.<\/p>\n<p>O primeiro objetivo consistiu em identificar a combina\u00e7\u00e3o que melhor detetasse per\u00edodos genu\u00ednos de velocidade nula, evitando simultaneamente falsos zeros durante o movimento ativo.<\/p>\n<p>A avalia\u00e7\u00e3o seguiu um processo em cascata:<\/p>\n<ol>\n<li>Os zeros efetivos foram detetados corretamente?<\/li>\n<li>As repeti\u00e7\u00f5es foram segmentadas e contadas corretamente?<\/li>\n<li>Uma vez que as duas primeiras condi\u00e7\u00f5es foram consideradas aceit\u00e1veis, qual era o grau de proximidade das m\u00e9tricas de velocidade em rela\u00e7\u00e3o \u00e0 refer\u00eancia externa?<\/li>\n<\/ol>\n<p>Esta ordem \u00e9 importante.<\/p>\n<p>Uma repeti\u00e7\u00e3o com uma velocidade pr\u00f3xima da do codificador n\u00e3o \u00e9 necessariamente uma repeti\u00e7\u00e3o medida corretamente se o seu in\u00edcio ou fim tiver sido definido por um falso zero.<\/p>\n<p>Os n\u00fameros eram apenas uma parte da forma como avaliei cada experi\u00eancia. Mantive os registos brutos e os tra\u00e7os de velocidade resultantes vis\u00edveis e, em seguida, comparei-os com os movimentos que tinha observado no meu pr\u00f3prio treino e nos testes com os meus atletas. Quando havia uma pausa \u00f3bvia, conseguia ver se o algoritmo repunha a velocidade a zero. Quando uma repeti\u00e7\u00e3o ainda estava em movimento, conseguia identificar uma corre\u00e7\u00e3o errada. Essas verifica\u00e7\u00f5es visuais simples muitas vezes diziam-me mais sobre a pr\u00f3xima altera\u00e7\u00e3o a fazer do que mais uma pontua\u00e7\u00e3o de erro.<\/p>\n<h2>Uma m\u00e1quina de estados para o movimento<\/h2>\n<p>Uma das principais melhorias arquitet\u00f3nicas consistiu na adi\u00e7\u00e3o de uma m\u00e1quina de estados para complementar a dete\u00e7\u00e3o de zeros.<\/p>\n<p>O algoritmo passa agora a analisar o movimento como uma sequ\u00eancia de estados, em vez de tratar cada amostra de forma independente.<\/p>\n<p>Em termos simplificados, passa por fases como:<\/p>\n<ul>\n<li>\u00e0 procura do in\u00edcio do movimento;<\/li>\n<li>detetou-se movimento;<\/li>\n<li>\u00e0 procura do fim do movimento;<\/li>\n<li>confirmando um verdadeiro repouso ap\u00f3s o movimento;<\/li>\n<li>recalibrar o sinal.<\/li>\n<\/ul>\n<p>Esta estrutura ajuda a evitar que eventos isolados dos sensores alterem imediatamente a interpreta\u00e7\u00e3o da repeti\u00e7\u00e3o.<\/p>\n<p>Por exemplo, um curto per\u00edodo de baixa acelera\u00e7\u00e3o durante o movimento de uma barra n\u00e3o deve ser automaticamente interpretado como repouso. O sistema necessita de ind\u00edcios adicionais: a dire\u00e7\u00e3o do sinal, a persist\u00eancia do evento e o contexto mais amplo do movimento.<\/p>\n<p>A m\u00e1quina de estados tamb\u00e9m me permitiu separar duas ideias que, anteriormente, estavam demasiado interligadas:<\/p>\n<ul>\n<li>detetar se a barra est\u00e1 a mover-se;<\/li>\n<li>decidir se a velocidade integrada pode ser recalibrada.<\/li>\n<\/ul>\n<p>Isto revelou-se especialmente \u00fatil porque um estado de movimento pode permanecer ativo mesmo quando a acelera\u00e7\u00e3o est\u00e1 temporariamente pr\u00f3xima de zero.<\/p>\n<h2>O que o codificador me podia \u2014 e n\u00e3o me podia \u2014 dizer<\/h2>\n<p>Utilizei o codificador como refer\u00eancia externa, mas n\u00e3o como uma verdade absoluta.<\/p>\n<p>Em cada repeti\u00e7\u00e3o, processei os dados do codificador utilizando uma metodologia compar\u00e1vel, em vez de me limitar a copiar as m\u00e9tricas exportadas pelo seu algoritmo propriet\u00e1rio. Isto reduziu a influ\u00eancia das diferen\u00e7as entre o processamento interno do codificador e o processamento do Spleeft.<\/p>\n<p>Mesmo assim, o codificador era considerado uma refer\u00eancia, e n\u00e3o um padr\u00e3o absoluto.<\/p>\n<p>Os diferentes dispositivos t\u00eam filtros, atrasos, regras de dete\u00e7\u00e3o e restri\u00e7\u00f5es mec\u00e2nicas diferentes. Al\u00e9m disso, o sinal exportado pode n\u00e3o ser exatamente o mesmo que \u00e9 utilizado internamente para calcular todas as m\u00e9tricas.<\/p>\n<p>\u00c9 por isso que decidi n\u00e3o definir o sucesso simplesmente como:<\/p>\n<blockquote>\n<p>\u201cO valor do Spleeft est\u00e1 pr\u00f3ximo do valor do codificador.\u201d<\/p>\n<\/blockquote>\n<p>Em vez disso, procurei um algoritmo que fosse internamente consistente, detetasse as repeti\u00e7\u00f5es corretamente e se comportasse de forma robusta em diferentes exerc\u00edcios e condi\u00e7\u00f5es de grava\u00e7\u00e3o.<\/p>\n<p>O codificador ajudou-me a identificar erros e a investigar casos complexos. N\u00e3o substituiu o pensamento cr\u00edtico.<\/p>\n<h2>Testar o algoritmo com dados reais de utilizadores<\/h2>\n<p>Ap\u00f3s as experi\u00eancias laboratoriais, voltei a analisar os dados recolhidos fora das sess\u00f5es controladas.<\/p>\n<p>Alguns dos ficheiros mais \u00fateis vieram de utilizadores do Spleeft que partilharam exemplos de casos em que a aplica\u00e7\u00e3o produziu um resultado inesperado.<\/p>\n<p>Estes ficheiros eram valiosos porque continham os problemas que surgem na vida real:<\/p>\n<ul>\n<li>pausas imperfeitas;<\/li>\n<li>vibra\u00e7\u00f5es inesperadas na barra;<\/li>\n<li>repeti\u00e7\u00f5es lentas;<\/li>\n<li>diferentes posi\u00e7\u00f5es de fixa\u00e7\u00e3o;<\/li>\n<li>mudan\u00e7as na t\u00e9cnica;<\/li>\n<li>ru\u00eddo antes ou depois da repeti\u00e7\u00e3o;<\/li>\n<li>exerc\u00edcios que n\u00e3o se assemelham a um agachamento.<\/li>\n<\/ul>\n<p>Apliquei o novo algoritmo a estes conjuntos de dados hist\u00f3ricos e comparei o seu comportamento com o da implementa\u00e7\u00e3o anterior.<\/p>\n<p>Esta fase ajudou a revelar um princ\u00edpio importante: melhorar o algoritmo n\u00e3o significa torn\u00e1-lo mais complicado a qualquer custo. Significa tornar a l\u00f3gica mais bem adaptada \u00e0 realidade f\u00edsica do sensor e do exerc\u00edcio.<\/p>\n<p>Essa experi\u00eancia tamb\u00e9m marcou <a href=\"https:\/\/spleeft.app\/smart-zero-apple-watch-control-vbt-update\/\">a \u00faltima atualiza\u00e7\u00e3o do Spleeft<\/a>. <a href=\"https:\/\/spleeft.app\/accurate-velocity-with-spleeft\/\">As medi\u00e7\u00f5es do aceler\u00f3metro t\u00eam limita\u00e7\u00f5es<\/a>, mesmo ap\u00f3s uma otimiza\u00e7\u00e3o cuidadosa, por isso queria que os treinadores pudessem analisar as grava\u00e7\u00f5es subjacentes e avaliar se um resultado \u00e9 fi\u00e1vel no seu pr\u00f3prio contexto.<\/p>\n<h2>Testes num Apple Watch SE de 40 \u20ac<\/h2>\n<p>Tamb\u00e9m queria testar o novo algoritmo num Apple Watch real, em vez de me basear apenas em simula\u00e7\u00f5es em Python.<\/p>\n<p>Para manter o projeto em conson\u00e2ncia com a filosofia original do Spleeft, comprei um Apple Watch SE em segunda m\u00e3o por cerca de 40 \u20ac. Era um dos modelos mais baratos capazes de executar a aplica\u00e7\u00e3o e processar o sinal em tempo real.<\/p>\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/apple-watch-encoder-on-bar-768x1024.jpg\" alt=\"Apple Watch fixado a uma barra durante um teste de campo com um codificador linear\" class=\"wp-image-11366\" style=\"width:360px;height:auto\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/apple-watch-encoder-on-bar-768x1024.jpg 768w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/apple-watch-encoder-on-bar-225x300.jpg 225w, https:\/\/spleeft.app\/wp-content\/uploads\/2026\/09\/apple-watch-encoder-on-bar.jpg 1200w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><figcaption class=\"wp-element-caption\">Apple Watch fixado na barra ao lado do codificador durante um teste de campo.<\/figcaption><\/figure>\n\n\n<p>Isto foi mais do que um teste pr\u00e1tico.<\/p>\n<p>O Spleeft sempre se baseou na ideia de que o treino baseado na velocidade deve ser acess\u00edvel. Se um novo algoritmo s\u00f3 funcionasse no dispositivo mais caro ou num ambiente laboratorial perfeito, n\u00e3o se enquadraria no objetivo do projeto.<\/p>\n<p>Durante os testes no terreno, comparei duas disposi\u00e7\u00f5es:<\/p>\n<ul>\n<li>o rel\u00f3gio no pulso do atleta;<\/li>\n<li>o rel\u00f3gio fixado diretamente \u00e0 barra.<\/li>\n<\/ul>\n<p>Isto demonstrou o qu\u00e3o importante pode ser a coloca\u00e7\u00e3o dos sensores.<\/p>\n<p>Nos levantamentos terra e no supino, o movimento do pulso do atleta pode introduzir ru\u00eddo adicional. O atleta est\u00e1 a segurar e a estabilizar a barra, pelo que o sensor n\u00e3o mede apenas o movimento vertical da barra. Mede tamb\u00e9m pequenos movimentos da m\u00e3o, do pulso e do corpo.<\/p>\n<p>Colocar o rel\u00f3gio diretamente sobre a barra reduziu um pouco desse ru\u00eddo.<\/p>\n<p>Isto n\u00e3o significa que a posi\u00e7\u00e3o da barra seja sempre a melhor op\u00e7\u00e3o, nem que a posi\u00e7\u00e3o do pulso esteja errada. Significa que o melhor algoritmo tamb\u00e9m tem de respeitar as limita\u00e7\u00f5es do hardware e a forma como o dispositivo est\u00e1 a ser utilizado.<\/p>\n<p>Por mais avan\u00e7ada que seja a ci\u00eancia de dados, nunca poder\u00e1 compensar totalmente uma configura\u00e7\u00e3o de medi\u00e7\u00e3o deficiente.<\/p>\n<h2>O que mudou no algoritmo do Spleeft<\/h2>\n<p>O novo algoritmo j\u00e1 saiu da fase beta. O verdadeiro teste consiste em verificar a consist\u00eancia do seu funcionamento em diferentes exerc\u00edcios, dispositivos e ambientes de treino. Quero que os treinadores possam avaliar isso por si pr\u00f3prios.<\/p>\n<p>Tamb\u00e9m quero deixar claro o que se passa por tr\u00e1s desse n\u00famero: o Spleeft utiliza os per\u00edodos de descanso detetados para limitar o desvio de velocidade e uma m\u00e1quina de estados para identificar repeti\u00e7\u00f5es. Test\u00e1mos essas decis\u00f5es com base em sess\u00f5es gravadas e em dispositivos externos. Estou a partilhar a abordagem, mantendo, no entanto, os par\u00e2metros exatos confidenciais.<\/p>\n<h2>O que aprendi<\/h2>\n<p>Este projeto ensinou-me que uma m\u00e9trica de velocidade \u00fatil depende de mais do que um algoritmo engenhoso. Depende do sensor, do exerc\u00edcio, da qualidade dos dados e das decis\u00f5es tomadas em cada etapa. A IA ajudou-me a explorar e a desenvolver mais rapidamente, mas a experi\u00eancia de orienta\u00e7\u00e3o foi essencial para decidir quais os problemas que realmente importavam.<\/p>\n<p>O Spleeft continua a ser um projeto pessoal moldado por essa curiosidade. Vou continuar a test\u00e1-lo em treinos reais e a partilhar o que for aprendendo.<\/p>\n<p>\u00a0<\/p>","protected":false},"excerpt":{"rendered":"<p>Como utilizei os dados do Apple Watch, um codificador linear e grava\u00e7\u00f5es feitas em Paris para melhorar a dete\u00e7\u00e3o de pausas, a segmenta\u00e7\u00e3o de repeti\u00e7\u00f5es e o acompanhamento da velocidade das barras no Spleeft.<\/p>","protected":false},"author":1,"featured_media":11366,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[142],"tags":[67,21],"class_list":["post-11367","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-case-studies","tag-apple-watch","tag-vbt"],"_links":{"self":[{"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/posts\/11367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/comments?post=11367"}],"version-history":[{"count":4,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/posts\/11367\/revisions"}],"predecessor-version":[{"id":11372,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/posts\/11367\/revisions\/11372"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/media\/11366"}],"wp:attachment":[{"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/media?parent=11367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/categories?post=11367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spleeft.app\/pt\/wp-json\/wp\/v2\/tags?post=11367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}