{"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>To improve Spleeft\u2019s bar velocity measurements, I collected recordings alongside a linear encoder during training with the Spanish BMX team in Paris. I rebuilt the iOS algorithm in Python and focused on detecting real rest periods and complete repetitions, where sensor noise could otherwise distort the result.<\/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\/\" target=\"_blank\">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>Therefore, the real challenge was not simply to find \u201cmore 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>What the encoder could\u2014and could not\u2014tell me<\/h2>\n<p>Utilizei o codificador como refer\u00eancia externa, mas n\u00e3o como uma verdade absoluta.<\/p>\n<p>For every repetition, I processed the encoder data using a comparable methodology rather than simply copying the metrics exported by its proprietary algorithm. This reduced the influence of differences between the encoder\u2019s internal processing and Spleeft\u2019s processing.<\/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>\u201cThe Spleeft value is close to the encoder value.\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\/\" target=\"_blank\">a \u00faltima atualiza\u00e7\u00e3o do Spleeft<\/a>. <a href=\"https:\/\/spleeft.app\/accurate-velocity-with-spleeft\/\" target=\"_blank\">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>Testing on a \u20ac40 Apple Watch SE<\/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>To keep the project aligned with Spleeft\u2019s original philosophy, I bought a second-hand Apple Watch SE for approximately \u20ac40. It was one of the least expensive models capable of running the application and processing the signal in real time.<\/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>the watch on the athlete\u2019s wrist;<\/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>In deadlifts and bench press, the movement of the athlete\u2019s wrist can introduce additional noise. The athlete is holding and stabilising the bar, so the sensor is not only measuring the bar\u2019s vertical movement. It is also measuring small movements from the hand, wrist and body.<\/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>What changed in Spleeft\u2019s algorithm<\/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}]}}