Mar 16, 2021
18 mins read
D’une manière simple, on peut comparer le coureur à une voiture. La voiture,
par la pompe à injection, fournit le carburant et l’effet est le couple qui
nous permet d’avancer à une certaine vitesse.
Le corps humain possède aussi sa pompe, le coeur, et son carburant est présent
dans son sang. Si on appuie sur l’accélérateur, le rythme cardiaque augmente,
pour apporter plus d’énergie aux muscles. Le coeur est notre pompe à injection
et nos muscles le moteur.
Pour une automobile, nous avons l’habitude de prendre en compte l’énergie
consommée et l’énergie cinétique produite, par exemple, pour estimer la consommation
instantanée, pour calculer l’autonomie, pour déterminer le profil de puissance
en fonction des tours minutes…
Si l’on délaisse l’analogie avec la voiture, on peut se poser la question de la
pertinence de l’information que procure la fréquence cardiaque.
Il y a deux façons de répondre à cette question:
Nous allons ici nous intéresser à l’analyse quantitative du point de vue de la théorie de l’information. La théorie de l’information est une théorie mathématique utilisée souvent en informatique pour mesurer la quantité d’information. Elle considère l’information d’un évènement d’une mesure de manière très abstraite en considérant simplement que l’information est tout ce qui est imprédictible. Cela peut paraître surprenant apriori car la nature de l’information n’est pas prise en compte. Mais, cette considération reste pourtant pertinente.
Prenons, un petit exemple: un coureur affiche sur sa montre la distance
parcourue. Cette information est totalement pertinente car, s’il peut la déduire de son
feeling, cela ne permet pas de la déterminer de manière suffisamment précise.
Mais, quelle est l’information additionnelle s’il affiche en plus la distance
restant à courir?
Elle est nulle d’après la théorie de l’information car c’est
un simple calcul à partir de la distance totale et la distance parcourue.
Par contre, s’il ajoute le temps de course, cette valeur n’étant pas liée à
100% à la distance, il ajoute une information à son écran.
Comme on le voit bien avec ce simple exemple, on ne s’intéresse pas à la pertinence mais au fait que l’information soit ou non déductible d’autres connaissances.
Revenons à la fréquence cardiaque. Pourquoi la prédire en utilisant la puissance de course?
Simplement, parce qu’une fois prédite, on peut comparer la prédiction avec sa mesure et en déduire la partie imprédictible, c’est à dire l’information, que l’on pourra alors interpréter.
Pour prédire, il faut disposer d’un modèle dont on va devoir estimer les paramètres en analysant les courses passées. Pour qu’il doit efficace, il faut que le nombre d’inconnus à déterminer ne soit ni trop grand (car cela augmenterait le temps d’apprentissage) et ni trop petit pour laisser un degré de liberté suffisant. C’est pourquoi, j’essaye de généraliser les modèles qui ont déjà fait leur preuve dans la course à pied.
Si l’on réalise un test d’effort par pallier, on constate souvent une augmentation linéaire de la fréquence cardiaque en fonction de la puissance fournie. C’est du moins vrai jusqu’à un certain point, appelé le point de déflexion, où la pente change.
Ce comportement n’est pas certes constaté chez tous les athlètes1. Mais, il est judicieux d’en tenir compte dans une modélisation.
En effet, une modélisation affine risque d’être biaisée comme le montre la simulation suivante:
Si le coureur fait toutes ses courses sous le point de déflexion, on aura un modèle assez proche de la réalité. Mais, dès qu’il le dépasse, il perturbe le modèle et celui-ci ne sera plus assez fidèle ni en dessous du seuil d’aérobie, ni au dessus.
La solution, est l’intégrer une fonction qui ajoute une courbure. Voici, un exemple simple qui donne de bons résultats:
$$ HR = a + b \times Puissance + c \times \log( Puissance + 1 ) $$
a, b et c sont les paramètres à déterminer par l’analyse des données.
Voici, sur le même exemple ce que donnerait la modélisation:
On voit que le modèle épouse beaucoup mieux la courbe de référence. C’est la fonction de base que nous allons utiliser.
Utiliser la puissance sur un intervalle n’est pas assez général. Cela suppose que l’intervalle est suffisamment long pour que la fréquence cardiaque soit stabilisée. C’est une hypothèse qui peut être valide pour un protocole comme celui du test de Conconi ou de Cooper. Mais, pour un course quelconque, il faut un modèle plus général.
L’idée consiste alors d’utiliser le même modèle et de l’appliquer aux mesures moyennes de la puissance sur des durées différentes: la puissance des 15 dernières secondes, des 30 dernières secondes et ainsi de suite.
La formule est alors:
$$ HR = a_0 + \sum_{i=1}^{5}{ a_{3i-1} \times P[-15i\ldots 0] + a_{3i-2} \times \log( P[-15i\ldots 0] + 1 ) } + a_{3i} \times D[-15i\ldots 0] $$
P[a…b] est la puissance moyenne de l’instant relatif a jusqu’à l’instant
b. P[-7…0], P[-14…0] et P[-28…0], sont la puissance moyenne des
15, 39 et 60 dernières secondes. D[a…b] est l’écart type de la puissance sur l’intervalle [a…b].
Nous prenons en donc en compte, la puissance moyenne sur 15, 30s, 60s, 1 minute,
2 minutes et 4 minutes et ses variations moyennes. Les paramètres a0 à a16 sont déterminés de telle
sorte à minimiser l’erreur entre la fréquence cardiaque mesurée et celle
qui est produite par la formule.
Cette formule a l’avantage de ne faire aucune hypothèse sur la forme du sportif. Pour un coureur occasionnel, la récupération est souvent plus longue et donc l’effort des minutes précédentes a plus d’effet que pour un sportif de haut niveau.
Néanmoins, cela suppose que la fréquence cardiaque puisse être déterminée sur des instants assez bref. Il n’est donc pas conseillé d’utiliser un capteur cardio-optique. Outre le fait qu’ils produisent souvent des valeurs complètement fausses lorsqu’ils sont mal positionnés, ils ont tendance à moyenner sur plusieurs dizaines de secondes la fréquence cardiaque. La ceinture pectorale est à privilégier et il ne faut pas oublier de bien humidifier les contacts avant.2
Ensuite, il faut pas perdre de vue qu’un algorithme d’apprentissage n’est
capable que d’apprendre ce qu’il a déjà analysé. Il est alors théoriquement
nécessaire de courir toute la gamme des puissances, aussi bien sur les
intervalles longs que courts. C’est évidemment pas possible de le faire pendant
une séance. C’est pourquoi, il faut courir quelques heures pour avoir un résultat probant.
D’une manière pragmatique, après avoir fait uniquement des séries de courses
lentes, l’algorithme est incapable d’en déduire la fréquence lors d’une course
soutenue. Il va produire des valeurs faussées et s’ajuster progressivement en
apprenant ce nouveau cas de figure.
Pour tester l’algorithme il faut tout d’abord réaliser un certain nombre de
courses d’étalonnage où il apprendra à déterminer la correspondance
entre la fréquence cardiaque et la puissance.
Il est illusoire de penser obtenir un résultat significatif après une ou deux sorties.
Dans les courses, je mesure la différence entre la fréquence cardiaque estimée
et la fréquence cardiaque mesurée. Une valeur nulle, signifie que l’estimation
est parfaite. Une valeur positive signifie que la fréquence cardiaque mesurée
est inférieure à celle estimée (+3 signifie que j’ai économisé 3 pulsations par
rapport à ce qui était prévu).
Pour faciliter la comparaison, toutes les courbes affichent les mêmes données:
:w
Il faut se méfier des premiers résultats car la correspondance est apprise par coeur. Un des signes est que la première estimation avait une erreur nulle:
L’algorithme a ensuite tendance à osciller car toutes les erreurs de mesures du capteur Stryd et de la ceinture cardio-fréquencemètre ont tendance à influencer le résultat. Mais, on reste avec une erreur moyenne bonne de lors de 2 pulsations.
Il faut néanmoins, temporiser l’optimisme car cette session était une course lente avec certes quelques variations de vitesse mais pas d’intervalles, de côtes…
Pour une deuxième course, je décide de courir plus lentement mais en bifurquant le parcours par un chemin de cross très irrégulier entre la 16e et 25e minute:
J’avais choisi cette portion car elle est particulièrement difficile pour estimer la puissance.
En effet, ce chemin est composé de monticules escarpés d’une hauteur de 10m
maximum avec une pente impossible à grimper sans avoir pris son élan avant. On
y trouve aussi un chemin avec des virages tous les 5 mètres, des obstacles
divers comme des troncs d’arbres à enjamber, des branches d’arbustes à hauteur
des yeux… Bref, tout pour casser son rythme et une nécessité permanente de
faire attention.
Le capteur Stryd lui ne livre rien de probant dans cette situation. Il lui faut
3-4 secondes pour estimer une puissance et, si l’effort n’est pas stable, la
puissance est mal estimée. En plus, la nature du terrain génère ici un effort
additionnel qui n’est pas seulement mesurable dans les jambes mais qui se
reflète sur la fréquence cardiaque.
Le résultat est que la puissance reste assez stable (à part quelques
pics) mais que la fréquence cardiaque se décorrèle et grimpe de manière
indépendante de la puissance.
Pour l’algorithme d’apprentissage, une seule heure de course était apprise, c’est encore insuffisant pour ne pas être influencé par cette portion. On voit que l’estimation décroche jusqu’à -20 pulsations (la fréquence cardiaque est 20 pulsations plus importante que prévue). Ensuite, une fois sortie de ce chemin, l’algorithme sous estime de 10 pulsations la fréquence cardiaque et, progressivement réapprend des mesures d’une course plus normale. Vers 30 minutes de course, l’algorithme donne à nouveau une bonne estimation de la fréquence cardiaque. Ce test montre bien la stabilité de l’algorithme: après 1h de course apprise, une portion atypique de 10 minutes peut certes influencer l’apprentissage mais ça se corrige très rapidement avec quelques minutes de course supplémentaires. Il est clair qu’avec plusieurs heures de course en mémoire l’influence d’une telle portion sera négligeable.
Pour finir, j’ai fait quelques accélérations. Là aussi, même problème, l’algorithme n’a jamais traité de puissance aussi importantes et aussi courtes. L’estimation de la fréquence cardiaque n’est pas encore fiable sur ce point.
Après 3 sessions d’apprentissages avec des courses plus ou moins régulières, je décide de faire des intervalles de 30s avec 30 secondes de récupération. Les variations brusques d’intensité ne sont pas encore apprises et donc, il faut s’attendre à des erreurs d’estimation importantes:
D’une manière générale, dans la première phase de la couse, la prédiction reste bonne. Il est d’ailleurs intéressante de constater que la puissance semble être plus ou moins constante mais que la fréquence cardiaque drift doucement. L’algorithme le détecte bien car la différence entre la fréquence cardiaque mesurée et estimée passe progressivement de +5 pulsations à -5 pulsations. Peut-être une baisse de forme? Je ne peux plus l’affirmer.
Les premiers intervalles sont très mal pris en compte car il ne prédit
quasiment aucune augmentation de la fréquence cardiaque (différence de -10
pulsations). Mais, c’est vite corrigé aux intervalles suivants et la fréquence
prédite est alors plus proche de la réalité. (avec une différence entre 0 et +5
pulsations)
La phase de récupération, est aussi nouvelle et pas vraiment prise en compte.
Ca nécessitera d’autres courses pour corriger ce point.
En tout cas, on voit bien qu’il faut faire apprendre des situations de course à l’algorithme. Il n’y a aucune prédiction fiable d’un contexte inconnu.
Les premiers résultats vraiment significatifs sont obtenus à partir de 5 à 6 heures de course. En dessous, l’algorithme n’est pas fiable car dans les premières minutes, il apprend les configurations par coeur et ensuite, n’a pas encore attend une robustesse statistique.
Voici quelques courses typiques et les enregistrements obtenus.
Il y a des jours où la météo vous sourit et où vous êtes vraiment en pleine forme. On démarre tranquillement la course et, quand on regarde sur la montre, on est étonné de courir aussi vite. Pourtant, on n’a pas l’impression de fournir un effort conséquent. C’est le genre de situation que reflète l’enregistrement suivant:
J’étais déjà un peu étonné en jetant un oeil sur ma montre, la fréquence cardiaque semblait plus faible que d’habitude mais je prenais ça pour un artéfact. Il faut dire qu’en regardant de temps en temps sa montre, cet instant ne reflète pas forcément une réalité sur toute une course. Et puis, n’étais-je pas victime d’une analyse faussée par mon optimisme du jour?
Ceci dit, l’analyse hors ligne a montré que ma fréquence cardiaque était systématiquement plus faible avec une moyenne de 4 à 5 pulsations. Ce qui est remarquable, c’est que l’algorithme de Garmin qui détermine la condition physique donne le même résultat3:
Néanmoins, la corrélation entre la fréquence cardiaque et la forme du moment n’est peut-être qu’une coïncidence. Il faudrait confirmer ce point par des articles scientifiques à ce sujet et par un test plus approfondi à long terme.
Après une dizaine d’heures de course en plaine, j’ai décidé de le tester en trail. Il s’agissait d’un parcours avec des dénivelés pas trop prononcés et, donc, il n’y avait pas besoin de recourir à la marche. Étant donné que j’ai couru 5 jours de suite, je ne m’attendais pas à une plus faible fréquence cardiaque pour une puissance donnée. La fatigue à court terme à tendance à provoquer une petite baisse de forme. Et, de toute manière, l’effort en trail est plus important qu’en course à pied sur route: il faut faire beaucoup plus attention aux aspérités des chemins, éviter les nids de poules, enjamber les obstacles… Il faut faire preuve de plus d’attention et la course est moins régulière. Ca a un prix en terme de dépense énergétique et donc, sur la fréquence cardiaque.
Pour cette séance, la fréquence cardiaque était environ de 5 pulsations plus haute que d’habitude, c’est cohérent avec la différence mesurée (constamment négative et tournant autour de -5). Néanmoins, pour cette course, une configuration nouvelle est apparue: au croisements, nous faisions une pause pour attendre tous les membres du groupe. C’est une situation encore non prise en compte par l’algorithme: la puissance se retrouvait nulle pendant plusieurs minutes.
Comme on peut le constater pendant le premier arrêt, la fréquence cardiaque estimée est complètement décorrélée de la réalité. Elle est même jusqu’à 50 pulsations plus basses que la mesure! Par contre, cette mauvaise estimation est corrigée dès la deuxième pause avec une différence plus modeste qui ne dépasse plus les 15 pulsations.
Il faut reconnaitre que c’est une situation extrêmement difficile à prédire. Cela revient à estimer le temps de récupération. Mais, tout le monde sait que celui-ci peut varier énormément d’une course à une autre. Ici, c’est d’autant plus compliqué qu’une puissance nulle peut certes correspondre à une récupération mais ce n’est pas parce qu’on ne marche pas qu’on est en train de récupérer… Bref, nous sommes ici dans un cas limite où l’algorithme ne s’applique pas. Il est par contre remarquable qu’il y ait tout de même un apprentissage qui corrige l’erreur lors de la pause suivante.
Pour finir, j’ai décidé de faire un test avec des intervalles en côtes. Les intervalles 30/30 étaient déjà appris lors d’une séance précédente mais là, j’ai décidé d’y ajouter une pente de 10%.
Il faut tout d’abord dire que la puissance est ici réellement un atout: la vitesse en côte lors de ces intervalles est comparable à celle d’une course lente sur le plat. Il serait dont impossible pour un algorithme de prédire la fréquence cardiaque en connaissant uniquement les allures. Ici, la puissance permet de traiter cette situation.
Néanmoins, les intervalles fait ici sont à la limite de ce que peuvent analyser les capteurs car ils sont que de 25s:
L’algorithme avait déjà appris à plusieurs reprises le comportement lors d’intervalles de 15s, de 30s et en côte. Il n’y a donc aucune raison qu’il livre des résultats délirants.
Voilà la variation de la différence entre l’estimation et la fréquence cardiaque mesurée:
On peut y voir 4 étapes:
On peut dire qu’après deux bonnes semaines de courses, on obtient des résultats assez intéressants. Au fur et à mesure que l’algorithme s’affine on arrive à comparer la l’évolution de la fréquence cardiaque de session en sessions ou au cour d’une course longue. Cela ouvre des possibilités en terme de suivi à moyen terme de la forme physique, mais je dois avouer qu’il me manque l’expérience et les connaissances en médecine du sport pour me lancer dans une telle expertise.
Ensuite, résultat produit reste aisément interprétable: on estime la différence entre la fréquence cardiaque estimée à partir des dernières de courses avec la course actuelle. Un coach qui a l’habitude de travailler avec la fréquence cardiaque ne devrait pas être déboussolé, comme c’est le cas pour la puissance qui est difficile à comparer entre athlètes.
Mais, la conclusion n’en est en fait pas une. Cette petite étude est l’occasion de développer de nouvelles fonctionnalités pour les montres Garmin:
Hnízdil, Jan & Skopek, Martin & Balkó, Štefan & Nosek, Martin & Louka, Oto & Musalek, Martin & Heller, Jan. (2019). The Conconi Test-Searching for the Deflection Point. Physical Activity Review. 7. 10.16926/par.2019.07.19. PDF ↩︎
Dans mon cas, la ceinture HRM-Dual donnait des fréquences cardiaques proches de la fréquence maximale pendant l’échauffement alors que je ne transpirais pas. La H10 de Polar semble être plus fiable en ce qui concerne ce point. En tout cas, bien mouiller la ceinture permet d’éviter cet artéfact. ↩︎
Cela ne serait pas étonnant que Garmin fasse le même type de calcul pour déterminer la condition physique. Mais, comme ils refusent de donner tout détail technique sur leur algorithmes, on ne peut que supposer et les prendre avec des pincettes. On ne peut en effet pas savoir dans quelles conditions ils ne s’appliquent pas! ↩︎
Partagez pour mieux faire connaître!