Fitcompare: l’outil de nakan.ch pour comparer les fichiers .fit
Comme vous l’avez peut-être déjà vu dans les tests de fond en comble sur le site, les comparatifs de données ont un peu changé depuis la sortie de la fenix 8. Si les données comparées sont toujours les mêmes, le loog des graphiques mais surtout les données de comparaison sont devenues plus précises (notamment sur les comparatifs de dénivelé et de fréquence cardiaque). Au tout début du site, j’utilisais MyGPSFiles: pratique mais très vite limité pour des comparatifs précis ou avancés, surtout qu’il ne prend pas en charge le format fit (uniquement tcx ou gpx). J’ai ensuite créé l’outil « tool.nakan.ch » qui est un outil en ligne pour comparer les fichiers TCX ou FIT, qui a été utilisé sur le site de très nombreuses années, et ouvert au public. Mais la librairie FIT qu’il utilisait est arrivé à ses limites. Son développement aussi. Et puis beaucoup de monde a testé et envoyé des comparatifs. Cela coûte en hébergement et en API de Mapbox… J’ai donc décidé de le fermer à la fin de l’année 2024. Et puis j’ai mis en ligne une version presque complète de Fitcompare pour le public sur GitHub…
Contenu de l’article
Soutenir le site
Vous appréciez les contenus de nakan.ch? Vous souhaitez soutenir le site, tout en vous équipant avec les dernières nouveautés en matière de technologie sportive? En utilisant le lien sur l'un des logos ci-dessous, vous soutenez la réalisation de futurs tests de matériel sur le site! Et cela ne vous coûte rien de plus!
Qu’est-ce Fitcompare?
Fitcompare est un projet personnel, écrit en Python, qui se base sur la librairie Python Fitparse pour comparer les données de fichiers fit. Il ne gère QUE les fichiers fit. Et il répond à un cahier des charges que j’ai écrit durant des mois en continuant à utiliser mon ancien outil.
Je ne suis clairement pas un développeur au quotidien, et si vous regardez le code vous trouverez sûrement des milliers de choses à redire. Mais pour moi, l’essentiel est que le script fasse le boulot à la fin. C’est donc un outil extrêmement polyvalent qui permet:
- De comparer les données parfaitement alignées de plusieurs fichiers fit, en spécifiant si nécessaire un fichier dit de référence auquel les autres sont comparés (en particulier pour les données de fréquence cardiaque)
- De créer des graphiques avec les données de tous les champs de données enregistrés dans le fichier fit.
- De créer une carte GPS avec les traces des différents appareils
- De créer des graphiques personnalisés intégrant n’importe quel champ de données de n’importe quel fichier pour des graphiques complexes
- De désactiver l’alignement si nécessaire des données pour comparer des fichiers générés à des périodes différentes
- Des fonctions avancées de normalisation de l’altitude pour comparer les données entre plusieurs marques de manière objective
- Des options de configuration avancées pour chaque projet
- Un outil décentralisé que tout le monde peut utiliser en illimité, avec des outils entièrement gratuits: Fitcompare est gratuit, Mapbox pour un usage personnel est gratuit, Docker est gratuit, Python est gratuit…
Une version publique sous GPL quasi complète
La version publique, publiée en GPL sur GitHub, est quasiment complète. La seule différence avec la version que j’utilise sur le site est l’absence dans la version publique de l’algorithme de scoring de la fréquence cardiaque.
Vous pouvez utiliser, distribuer et modifier cet outil sous la seule condition de rendre vos modifications au code disponible à tous. Et si vous l’utilisez, pensez à mettre un commentaire à cet article, afin de me faire savoir que de le rendre public n’a pas été inutile!
Comment l’utiliser?
La première chose à faire pour utiliser Fitcompare est d’installer Docker, qui permet l’utilisation de conteneurs logiciels. Docker est disponible pour Windows, Mac ou Linux. Le plan gratuit est largement suffisant pour exécuter Fitcompare (et même bien plus de conteneurs).
Créer une clé API de Mabbox
Pour la génération des cartes GPS interactives, créez une clé API. Pour cela, suivez les étapes suivantes:
- Créer un compte sur le site de Mapbox, qui est utilisé par Fitcompare pour la génération de cartes
- Dans le compte utilisateur de Mapbox, choisissez « Tokens »
- Créez un nouveau Token avec le lien « + Create Token »
- Dans le champ « Name », entrez quelque chose comme « Fitcompare NOM PRENOM »
- Laissez toutes les autres options par défaut, et surtout n’entrez rien dans le champ URL
- Cliquez sur « Create token »
Votre token est généré et vous pouvez le copier. Il s’agit d’une chaine de caractères qui ressemble à:
pk.quelquechoseiciavecdeslettresetdeschiffres
Copiez cette clé d’API et ne la partagez pas!
Télécharger et configurer Fitcompare
Ensuite, il faut télécharger Fitcompare dans sa version actuelle. Vous pouvez vous rendre sur le site du projet, et cloner le repository, ou plus simplement cliquer sur le bouton vert et choisir le téléchargement du fichier .zip.
Après avoir téléchargé les fichiers, décompressez-les si nécessaire. Editez le fichier « config.ini » et remplacez « YOUR_KEY_HERE » par votre clé d’API générée ci-dessus. Vous obtenez quelque chose comme:
[map]
mapbox_api_key=pk.quelquechoseiciavecdeslettresetdeschiffres
Créer le conteneur Docker Fitcompare
Docker est installé, Fitcompare est téléchargé et configuré, il ne reste plus qu’à créer le conteneur pour que tout soit prêt. Pour ceci, ouvrez une ligne de commande ou un terminal, et rendez-vous dans le dossier contenant les fichiers de Fitcompare. Assurez-vous que les trois fichiers suivants sont présents:
- fitcompare.py
- Dockerfile
- config.ini (avec la clé API de Mapbox configurée)
Ensuite, tapez la commande suivante pour créer le conteneur:
docker build . -t fitcompare
Après environ une minute, votre conteneur est prêt à être utilisé.
Utiliser Fitcompare pour comparer deux fichiers
Ensuite, placez deux fichiers fit dans le même dossier. Assurez-vous qu’ils sont nommés de manière correcte pour Fitcompare, à savoir que le nom doit obligatoirement être constitué comme suit:
APPAREIL_MESURECARDIO_MODEGNSS_DISTANCE.fit
Où les éléments sont les suivants:
- APPAREIL: Le nom de la montre ou du compteur qui a généré le fichier, sans espace. Par exemple: « GarminFenix8 »
- MESURECARDIO: L’appareil pour mesurer le cardio, par exemple « PolarH10 ». Si la mesure est au poignet, mettre « OHR », si aucune mesure, mettre « NONE ».
- MODEGNSS: Le mode GNSS/GPS, qui peut être:
- « NONE » si pas de trace GPS
- « GPS » pour le GPS seul
- « SatIQ » pour le mode automatique de Garmin
- « GNSS » pour le mode multi-GNSS sans double fréquence
- « GNSSDual » pour le mode multi-GNSS avec GPS double fréquence
- « Ultra » pour les modes économiques UltraTrac, UltraMax ou autre
- DISTANCE est facultatif: il contient le nom du capteur de distance si ce n’est pas le GPS, comme « Stryd » ou « COROSPod2 » par exemple
Voici un exemple de nom valide sans mesure de distance:
GarminFenix8_OHR_GNSSDual.fit
Voici un nom valide avec mesure de distance:
CorosVertix2S_WahooTRACKR_GNSSDual_COROSPod2.fit
Lancer un comparatif simple avec Fitcompare
Toujours dans le terminal ou la ligne de commande, on se rend dans le dossier contenant les fichiers fit à comparer. Admettons que l’on veuille comparer les deux fichiers FIT en exemple ci-dessus, la Garmin Fenix 8 et la Vertix 2S de COROS.
Dans la plupart des cas, Fitcompare n’est utilisé QUE pour comparer des données enregistrées en même temps.
On lance la commande suivante pour un comparatif basique:
docker run fitcompare -v .:/project GarminFenix8_OHR_GNSSDual.fit CorosVertix2S_WahooTRACKR_GNSSDual_COROSPod2.fit
La commande va lancer fitcompare, et le script va analyser les deux fichiers tout en affichant les données intéressantes dans la console (ces données sont également enregistrées dans un fichier).
Vous obtiendrez par défaut le contenu suivant après le comparatif:
- Un fichier texte avec le résumé des données des fichiers FIT
- Un dossier « map » avec un fichier map.html pour afficher la carte en interactif et en 3D des traces GPS
- Un dossier « pnggraphs » avec les graphiques d’altitude, de distance et de fréquence cardiaque
- Un fichier d’exemple de configuration avancée « project.yaml.example »
Pour nommer les différents fichiers de manière plus précise, il est possible d’ajouter un préfixe avec l’option « -p »:
docker run fitcompare -v .:/project GarminFenix8_OHR_GNSSDual.fit CorosVertix2S_WahooTRACKR_GNSSDual_COROSPod2.fit -p premier_comparatif
En plus des graphiques, il est possible de créer des fichiers CSV en ajoutant « -e » à la commande.
docker run fitcompare -v .:/project GarminFenix8_OHR_GNSSDual.fit CorosVertix2S_WahooTRACKR_GNSSDual_COROSPod2.fit -p premier_comparatif -e
Enfin, pour rendre la ligne de commande plus simple, j’ai créé dans mon .zshrc (ou dans le .bashrc) un alias:
alias fitcompare="docker run -v .:/project fitcompare"
Cela me permet de lancer par exemple la commande suivante plus courte:
fitcompare GarminFenix8_OHR_GNSSDual.fit CorosVertix2S_WahooTRACKR_GNSSDual_COROSPod2.fit -p premier_comparatif
Aller plus loin dans les comparatifs
Pour aller plus loin dans le comparatif, vous pouvez renommer le fichier project.yaml.example en project.yaml, ou tout simplement le créer, et le modifier. Voici la structure du fichier YAML:
project:
align: True
zoom: [90, 120]
altitudeGap: 8
map: True
graphs: ['heart_rate', 'altitude', 'distance']
includeSmoothedAlt: False
customGraphs:
- name: Altitude baro vs GPS
values:
- file: GarminFenix8_WahooTRACKR_GNSSDual.fit
field: enhanced_altitude
label: Altitude baro
- file: GarminFenix8_WahooTRACKR_GNSSDual.fit
field: GPS altitude
label: Altitude GPS
GarminFenix8_WahooTRACKR_GNSSDual.fit:
delta: 0
On trouve plusieurs sections:
- Project: pour les options générales du projet
- customGraphs: pour les graphiques avec des données personnalisées
- Une section par fichier fit pour gérer le delta
La section project
Dans la section project, on peut gérer les options globales du comparatif:
- align: True ou False – True pour des comparatifs réalisés au même moment. False pour comparer des fichiers générés à des périodes différentes, par exemple pour comparer mon marathon de Berlin 2024 avec celui de 2015.
- Zoom: [DE, A] – Permet de ne se concentrer que sur les données des secondes DE à A, pour afficher le détail d’une section de l’activité. Pour les activités multisport, permet d’isoler les différentes disciplines (les bonnes valeurs figureront dans le project.yaml.example)
- altitudeGap: SECONDES – Permet d’attendre quelques secondes avant d’analyser l’altitude si l’enregistrement commence avec des valeurs nulles ou de 0 mètres.
- map: True ou False – Demande ou non à générer une carte. Mettre impérativement False pour les activités sans trace GPS.
- mapStyle: MAPBOX_STYLE – Prend en paramètre le nom d’un style MapBox listés ici
- graphs: liste des graphiques à générer de base, avec le nom des champs de données (voir ci-dessous)
- includeSmoothedAlt: True ou False – Ajoute les données d’altitude lissées au graph d’altitude
La section customGraphs
Ici, on peut créer des graphiques qui mélangent les champs et les fichiers. Par exemple, pour la même montre, créer un graphique avec l’altitude baro et GPS (c’est possible sur les nouvelles Garmin par exemple):
customGraphs:
- name: Altitude baro vs GPS
values:
- file: GarminFenix8_WahooTRACKR_GNSSDual.fit
field: enhanced_altitude
label: Altitude baro
- file: GarminFenix8_WahooTRACKR_GNSSDual.fit
field: GPS altitude
label: Altitude GPS
Avec le champ name, on configure le nom global du graphique
Ensuite, pour chaque courbe à ajouter sur le graphique, on entre:
- File: le nom du fichier fit qui contient la donnée
- Field: le champ du fichier qui contient la donnée
- Label: la légende de la courbe sur le graphique
Il est possible d’ajouter virtuellement autant de courbes que souhaité en mélangeant tout type de données issus d’un ou plusieurs champs. On peut aussi créer plusieurs graphiques personnalisés à la suite.
La section pour chaque fichier FIT
Ici, on peut simplement créer une section par fichier fit et changer le delta, si on veut ajuster finement l’alignement de temps entre deux fichiers. il peut arriver que des erreurs de timezone, ou des enregistrement sans GPS créent des écarts de plusieurs heures ou de quelques secondes. Dans ce cas, on peut l’ajuster pour chaque fichier FIT, avec un delta en secondes, positif ou négatif!
Liste des champs de données (quelques exemples)
Voici un exemple de champs disponibles pour une activité de course à pied avec un capteur Stryd sur une montre Garmin. Je prévois d’intégrer à l’avenir une option à Fitcompare pour lister les champs d’un fichier FIT, mais pour l’instant ce n’est pas disponible…
position_lat
position_long
distance
accumulated_power
enhanced_speed
enhanced_altitude
power
vertical_oscillation
stance_time_percent
stance_time
vertical_ratio
stance_time_balance
step_length
heart_rate
cadence
activity_type
fractional_cadence
# Ci-dessous, les champs Connect IQ de Stryd
Power
Form Power
Leg Spring Stiffness
Cadence
Ground Time
Vertical Oscillation
Air Power
Stryd Humidity
Stryd Temperature
Impact Loading Rate
Note: Fitcompare peut gérer les champs altitude et enhanced_altitude ainsi que les champs speed et enhanced_speed en utilisant simplement les champs altitude et speed dans la configuration graphs du yaml. Par contre, le champ exact doit être spécifié dans les customGraphs.
Conclusion sur l’outil Fitcompare
Voici en l’état la première version publique de cet outil qui n’est de loin pas terminé ou complet, mais qui est désormais suffisant et assez robuste pour être utilisé sur le site. Je n’ai pas de plan de route précis, mais je mettrai à jour la version publique de temps à autre si j’apporte des améliorations à ma propre version au fil du temps.
J’espère que le fait de mettre en ligne vous sera utile, et que l’outil permettra aussi de rendre plus simple et surtout plus pertinent vos analyses de fichiers. Si vous souhaitez comparer des fichiers autres que fit, je vous recommande un outil pour les transformer: Gotoes (la version incluant le fichier .fit est payante, mais cela ne coute presque rien). N’hésitez pas non plus à me payer un café avec les liens ci-dessous si Fitcompare vous est utile!
Evidemment, les commentaires vous sont ouverts si vous avez des remarques, des questions ou que vous voulez simplement me dire que vous avez utilisé l’outil. Cette page évoluera aussi probablement à l’avenir!
Supporter ce site pour de futurs articles
Rédiger des tests et des articles sur la technologie dans le sport est une passion dévorante! Cela fait plus de 12 ans que je le fais en marge de mon activité professionnelle et sportive.Je ne compte pas mon temps, et je ne suis absolument pas rémunéré par les marques pour le faire.
En passant par l'un des liens ci-dessous pour réaliser votre prochaine commande en ligne, je touche une petite commission sur la transaction, vous soutiendrez le site, et cela ne vous côutera pas plus cher!
Vous pouvez également soutenir le site au travers de la plateforme "Buy Me a Coffee" ou d'autres moyens de soutenir le site sur cette page. Je vous en remercie beaucoup!
Pour tout savoir sur ma politique de publication et de publicité sur le site, rendez-vous ici!