{"id":10339,"date":"2025-07-09T14:29:14","date_gmt":"2025-07-09T12:29:14","guid":{"rendered":"https:\/\/spleeft.app\/?p=10339"},"modified":"2025-07-09T14:30:32","modified_gmt":"2025-07-09T12:30:32","slug":"progetto-di-data-science-dietro-spleeft-vbt-ios","status":"publish","type":"post","link":"https:\/\/spleeft.app\/it\/progetto-di-data-science-dietro-spleeft-vbt-ios\/","title":{"rendered":"Il progetto di Data Science dietro Spleeft"},"content":{"rendered":"<p>In questo articolo, condivido \u2013 da una prospettiva tecnica e riflessiva \u2013 il processo di apprendimento e sviluppo alla base dell&#039;ultima ottimizzazione dell&#039;algoritmo Spleeft. Spiegher\u00f2 come funziona il sistema originale, sviluppato quattro anni fa, e come, nell&#039;ultimo mese, ne ho perfezionato i parametri per migliorarne sia l&#039;accuratezza che la velocit\u00e0 di elaborazione.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\"><a href=\"https:\/\/linktr.ee\/spleeftapp\" target=\"_blank\" rel=\"noreferrer noopener\">SCARICA ORA L&#039;APP SPLEEFT PER iOS, ANDROID E APPLE WATCH!<\/a><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Come funziona l&#039;algoritmo?<\/h2>\n\n\n\n<p>L&#039;algoritmo Spleeft misura la velocit\u00e0 verticale integrando i dati di accelerazione. La fase concentrica viene rilevata utilizzando soglie di velocit\u00e0 minima per segnare l&#039;inizio e la fine di una ripetizione, ed \u00e8 richiesta una velocit\u00e0 di picco minima di 0,3 m\/s per convalidare il movimento. Questa fase \u00e8 la pi\u00f9 chiaramente definita e prevedibile, il che consente regole di rilevamento pi\u00f9 precise.<\/p>\n\n\n\n<p>Per rilevare le fasi stazionarie, essenziali per correggere la deriva accumulata dall&#039;integrazione, utilizzo i dati provenienti da sensori inerziali: accelerometro, giroscopio e sensore gravitazionale. Una fase \u00e8 considerata stazionaria quando i valori di questi sensori rimangono al di sotto di determinate soglie per un intervallo di tempo specifico.<\/p>\n\n\n\n<p>Questo approccio metodologico coincide con quello utilizzato successivamente da <a href=\"https:\/\/pmc.ncbi.nlm.nih.gov\/articles\/PMC10383699\/\" target=\"_blank\" rel=\"noopener\">Achermann e altri<\/a>. nel loro <a title=\"studio di validazione dell&#039;Apple Watch per VBT\" href=\"https:\/\/spleeft.app\/validity-reliability-spleeft-apple-watch-iphone\/\" target=\"_blank\" rel=\"noopener\">studio di validazione dell&#039;Apple Watch per la misurazione della velocit\u00e0 del bilanciere<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Contesto e contesto tecnologico<\/h2>\n\n\n\n<p>In <a href=\"https:\/\/link.springer.com\/article\/10.1007\/s40279-020-01382-w\" target=\"_blank\" rel=\"noopener\">letteratura scientifica<\/a>, gli accelerometri sono stati tradizionalmente considerati meno accurati nella misurazione della velocit\u00e0 rispetto ad altre tecnologie. Studi comparativi hanno dimostrato che dispositivi come Beast Sensor o Push Band offrono prestazioni inferiori rispetto ad altre soluzioni.<\/p>\n\n\n\n<p>Tuttavia, gli accelerometri sono di gran lunga i sensori pi\u00f9 accessibili, poich\u00e9 sono integrati in dispositivi di consumo ampiamente utilizzati come smartwatch e dispositivi indossabili. Sebbene la loro affidabilit\u00e0 per parametri come la frequenza cardiaca sia stata messa in discussione, il loro potenziale per democratizzare l&#039;allenamento basato sulla velocit\u00e0 (VBT) \u00e8 innegabile.<\/p>\n\n\n\n<p>Vale la pena notare che la maggior parte degli studi comparativi valuta sistemi completi (hardware + software), senza distinguere tra questi due componenti. A mio avviso, non \u00e8 corretto attribuire la scarsa accuratezza esclusivamente all&#039;hardware. Un accelerometro pu\u00f2 fornire risultati precisi se abbinato a un software ben ottimizzato e progettato specificamente per il tipo di movimento analizzato. Pertanto, prima di escludere una tecnologia, dobbiamo esplorarne a fondo le possibilit\u00e0 algoritmiche.<\/p>\n\n\n\n<p>Esistono gi\u00e0 prove sufficienti a supporto dell&#039;utilizzo delle IMU (unit\u00e0 di misura inerziale) per stimare la velocit\u00e0 di sollevamento. Aziende come Enode o Output hanno sviluppato algoritmi proprietari che raggiungono un&#039;elevata precisione. Nel caso dell&#039;Apple Watch, diversi studi ne hanno convalidato l&#039;hardware per questa applicazione, sebbene utilizzassero algoritmi diversi dai miei. Ci\u00f2 rafforza l&#039;idea che un algoritmo appropriato possa superare i limiti spesso attribuiti al solo hardware.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Limitazioni delle IMU per la misurazione della velocit\u00e0<\/h2>\n\n\n\n<p>Queste limitazioni si presentano in una catena. La prima sfida \u00e8 identificare il modo migliore per elaborare i dati dei sensori inerziali \u2013 accelerometro, giroscopio e magnetometro \u2013 per stimare con precisione la velocit\u00e0 verticale di una barra.<\/p>\n\n\n\n<p>Uno dei problemi principali \u00e8 l&#039;integrazione dell&#039;accelerazione. Quando si integra con il metodo trapezoidale (ampiamente utilizzato per la sua semplicit\u00e0), si verificano errori sistematici noti come <strong>deriva<\/strong> si accumulano nel tempo. Per compensare questo, \u00e8 necessario identificare momenti noti a velocit\u00e0 nulla \u2013 noti come fasi stazionarie \u2013 che consentono la correzione della deriva.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Elaborazione del segnale per la stima della velocit\u00e0 verticale<\/h2>\n\n\n\n<p>I sensori inerziali forniscono dati su tre assi spaziali. Tuttavia, non \u00e8 sufficiente utilizzare direttamente la componente verticale dell&#039;accelerometro, poich\u00e9 questo sensore da solo non pu\u00f2 determinare con precisione la direzione della forza misurata. Per risolvere questo problema, utilizzo algoritmi di fusione di sensori come Kalman, Mahony e Madgwick, che forniscono quaternioni di orientamento per correggere il sistema di riferimento del dispositivo.<\/p>\n\n\n\n<p>Ho elaborato i dati provenienti da Apple Watch e iPhone utilizzando diversi algoritmi di orientamento e li ho confrontati con un sistema di motion capture (STT Systems). Ho selezionato la combinazione che offriva il miglior equilibrio tra accuratezza ed efficienza computazionale sui dispositivi mobili.<\/p>\n\n\n\n<p>Una volta corretto l&#039;orientamento, l&#039;accelerazione viene integrata per ottenere la velocit\u00e0. Per minimizzare ulteriormente la deriva, ho testato l&#039;uso di un filtro passa-basso, come il <strong>Filtro Butterworth<\/strong>, ampiamente utilizzato in biomeccanica.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Aggiornamento velocit\u00e0 zero (ZUPT)<\/h2>\n\n\n\n<p>Durante i test, ho scoperto che il problema principale non era la correzione dell&#039;orientamento o l&#039;integrazione in s\u00e9, ma piuttosto il rilevamento delle fasi stazionarie necessarie per applicare la ZUPT. Queste fasi devono essere rilevate in modo rapido e affidabile, poich\u00e9 la loro accuratezza influisce direttamente sulla precisione del sistema.<\/p>\n\n\n\n<p>Non esiste un metodo univoco per raggiungere questo obiettivo. Pertanto, ho sviluppato un approccio empirico basato sull&#039;analisi sistematica di molteplici combinazioni di parametri: quali sensori utilizzare, quali valori di soglia applicare e quali finestre temporali considerare.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"586\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-13.13.19-1024x586.png\" alt=\"\" class=\"wp-image-10337\" style=\"width:657px;height:auto\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-13.13.19-1024x586.png 1024w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-13.13.19-300x172.png 300w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-13.13.19-18x10.png 18w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-13.13.19.png 1178w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Velocit\u00e0 vs tempo Dati grezzi di Spleeft con deriva e anche con l&#039;aggiornamento della velocit\u00e0 zero funzionante.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ottimizzazione degli algoritmi utilizzando la scienza dei dati<\/h2>\n\n\n\n<p>Una volta definite tutte le variabili, ho raccolto in laboratorio un ampio set di dati di ripetizioni in palestra, memorizzando i dati grezzi dei sensori. Contemporaneamente, ho utilizzato un sistema di riferimento per il confronto. Gli esercizi selezionati erano: squat con rimbalzo, stacco da terra con pausa (sia concentrico che eccentrico) e lat machine. Tutte le serie sono state eseguite con un impegno elevato per includere diversi livelli di affaticamento e un riposo minimo tra le ripetizioni.<\/p>\n\n\n\n<p>Questa configurazione mi ha consentito di ottimizzare l&#039;algoritmo sia in termini di accuratezza che di velocit\u00e0, anche in condizioni con poca o nessuna fase stazionaria tra le ripetizioni, lo scenario pi\u00f9 impegnativo per i metodi basati sull&#039;integrazione.<\/p>\n\n\n\n<p>Ho creato uno script Python per esplorare sistematicamente 13.486 combinazioni di parametri:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se applicare o meno un filtro passa-basso e a quale taglio.<\/li>\n\n\n\n<li>Parametri ZUPT: soglie, finestre temporali e combinazioni di sensori.<\/li>\n\n\n\n<li>Soglie di velocit\u00e0 minima per il rilevamento concentrico.<\/li>\n<\/ul>\n\n\n\n<p>Dopo aver eseguito l&#039;intero set di dati (un&#039;operazione che ha richiesto diverse ore), ho analizzato separatamente le combinazioni pi\u00f9 performanti, in base al tipo di esercizio, all&#039;intervallo di velocit\u00e0 e al tipo di stop. Il mio obiettivo non era solo trovare la configurazione pi\u00f9 performante, ma anche comprendere meglio il comportamento del sistema per futuri miglioramenti.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"581\" height=\"436\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/output2-edited.png\" alt=\"\" class=\"wp-image-10352\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/output2-edited.png 581w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/output2-edited-300x225.png 300w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/output2-edited-16x12.png 16w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><figcaption class=\"wp-element-caption\">Output dello script Python che mi ha aiutato a identificare i parametri migliori per l&#039;algoritmo.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Test sul campo<\/h2>\n\n\n\n<p>Durante la validazione pratica, ho scoperto che il principale collo di bottiglia era il ritardo dell&#039;algoritmo nel rilevare la fase stazionaria. Il feedback degli utenti era chiaro: il sistema impiegava troppo tempo per fornire il feedback.<\/p>\n\n\n\n<p>Dopo aver esaminato molti grafici velocit\u00e0-tempo, ho notato che nel <strong>prima ripetizione<\/strong>, non c&#039;era quasi nessuna deriva, anche senza applicare ZUPT. Questo perch\u00e9 la deriva aumenta nel tempo. Mi sono chiesto: la deriva accumulata \u00e8 abbastanza grande da influenzare significativamente la stima della velocit\u00e0 media?<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"633\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-21.07.57-1024x633.png\" alt=\"\" class=\"wp-image-10353\" style=\"width:641px;height:auto\" title=\"\" srcset=\"https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-21.07.57-1024x633.png 1024w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-21.07.57-300x186.png 300w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-21.07.57-18x12.png 18w, https:\/\/spleeft.app\/wp-content\/uploads\/2025\/06\/Screenshot-2025-06-16-at-21.07.57.png 1284w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Dati velocit\u00e0 vs tempo senza una deriva significativa tra le ripetizioni<\/figcaption><\/figure>\n\n\n\n<p>Per rispondere a questa domanda, ho testato gli squat con una fase eccentrica sostanziale prima di quella concentrica. Ho atteso una prima fase stazionaria per calibrare il sistema, quindi ho eseguito ripetizioni consecutive senza pause. Il risultato \u00e8 stato sorprendente: l&#039;errore medio \u00e8 stato di appena <strong>0,018 m\/s<\/strong>, e anche pi\u00f9 in basso (<strong>0,016 m\/s<\/strong>) nell&#039;ultima validazione. La differenza rispetto al valore corretto \u00e8 stata minima, ma il tempo di risposta \u00e8 migliorato notevolmente, da 800 ms a 200 ms. Ci\u00f2 ha permesso di fornire feedback. <strong>subito dopo<\/strong> la fase concentrica, anzich\u00e9 secondi dopo.<\/p>\n\n\n\n<p>Tuttavia, l&#039;algoritmo ZUPT rimane attivo. Quando viene rilevata una nuova fase stazionaria, il segnale viene ricalibrato e qualsiasi errore accumulato viene corretto. Se si verifica pi\u00f9 di una ripetizione tra le fasi stazionarie, i valori corretti sovrascrivono il feedback iniziale per garantire che l&#039;utente riceva sempre il risultato pi\u00f9 accurato.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusione<\/h3>\n\n\n\n<p>Questo progetto basato sui dati mi ha permesso di ottimizzare significativamente l&#039;algoritmo Spleeft. Ho ridotto con successo il tempo di risposta per la stima della velocit\u00e0 media senza compromettere l&#039;affidabilit\u00e0 confermata nelle precedenti validazioni. La chiave \u00e8 stata combinare la raccolta sistematica dei dati con un&#039;analisi approfondita dei parametri, comprendendo che la qualit\u00e0 del risultato finale dipende non solo dall&#039;hardware, ma forse ancora di pi\u00f9 dal software che lo supporta.<\/p>\n\n\n\n<\/div>\n<div style=\"display: flex; flex-wrap: wrap; align-items: center; justify-content: center; padding: 20px; margin: 20px 0; border: 1px solid #ddd; border-radius: 10px; background-color: #f9f9f9;\">\n\n<!-- Foto del Autor -->\n<div style=\"flex: 0 0 100px; height: 100px; border-radius: 50%; overflow: hidden; margin-right: 20px;\"><img decoding=\"async\" style=\"width: 100%; height: 100%; object-fit: cover;\" src=\"https:\/\/spleeft.app\/wp-content\/uploads\/2022\/05\/d19fb150-ce63-4121-9e2e-c0f192ce37f6_.jpg\" alt=\"Ivan de Lucas Rogero\" title=\"\"><\/div>\n<!-- Informaci\u00f3n del Autor -->\n<div style=\"flex: 1; text-align: left;\">\n<h3 style=\"margin: 0; font-size: 20px; font-weight: bold; color: #333;\"><a style=\"text-decoration: none; color: inherit;\" href=\"https:\/\/spleeft.app\/about\/\" target=\"_blank\">Ivan de Lucas Rogero<\/a><\/h3>\n<p style=\"margin: 5px 0; font-size: 14px; color: #666;\">Prestazioni fisiche MSC e CEO SpleeftApp<\/p>\n<p style=\"margin: 5px 0; font-size: 14px; color: #333;\">Dedicato al miglioramento delle prestazioni atletiche e dell&#039;allenamento ciclistico, unendo scienza e tecnologia per ottenere risultati.<\/p>\n<!-- Enlaces Importantes -->\n<div><a style=\"text-decoration: none; color: #007bff; margin-right: 10px;\" href=\"https:\/\/www.entrenamientociclismo.com\/ivan-de-lucas\" rel=\"author noopener\" target=\"_blank\">Allenamento Ciclismo<\/a> <a style=\"text-decoration: none; color: #007bff; margin-right: 10px;\" href=\"https:\/\/www.linkedin.com\/in\/iv%C3%A1n-de-lucas-rogero-b34680178\/\" rel=\"nofollow noopener\" target=\"_blank\">LinkedIn<\/a> <a style=\"text-decoration: none; color: #007bff; margin-right: 10px;\" href=\"https:\/\/medium.com\/@ivandelucasrogero\" rel=\"nofollow noopener\" target=\"_blank\">Medio<\/a> <a style=\"text-decoration: none; color: #007bff;\" href=\"https:\/\/x.com\/Ivvy_dlr\" rel=\"nofollow\" target=\"_blank\">Cinguettio<\/a><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>In questo articolo condivido, da una prospettiva tecnica e riflessiva, il processo di apprendimento e sviluppo alla base dell&#039;ultima ottimizzazione dell&#039;algoritmo Spleeft. Spiegher\u00f2 come funziona il sistema originale, sviluppato quattro anni fa, e come, nell&#039;ultimo mese, ne ho perfezionato i parametri per migliorarne sia l&#039;accuratezza che la velocit\u00e0 di elaborazione. SCARICA... <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/spleeft.app\/it\/progetto-di-data-science-dietro-spleeft-vbt-ios\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> \u201cIl progetto di Data Science dietro Spleeft\u201d<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":10480,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[142,19],"tags":[],"class_list":["post-10339","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-case-studies","category-validation"],"_links":{"self":[{"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/posts\/10339","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/comments?post=10339"}],"version-history":[{"count":0,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/posts\/10339\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/media\/10480"}],"wp:attachment":[{"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/media?parent=10339"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/categories?post=10339"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spleeft.app\/it\/wp-json\/wp\/v2\/tags?post=10339"}],"curies":[{"name":"parola chiave","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}