Acties:
  • +4Henk 'm!

  • route99
  • Registratie: Augustus 2017
  • Laatst online: 23:24

route99

just passionately curious...

Topicstarter
Mede-auteur:
  • slow whoop
  • Registratie: April 2007
  • Laatst online: 09-12 11:19

slow whoop

Van een Garmin FIT-bestand met Matlab/Octave naar een grafische weergave in Excel of Calc?

Met veel dank aan @slow whoop voor zijn input, kritische feedback!


Inleiding

De aanleiding om met deze materie te beginnen na de aankoop van mijn nieuwe Garmin FR735XT in februari 2020, was het gebrek aan opties die mij aanspraken om op een PC de Garmin trainingsdata offline te bekijken van dit sporthorloge. De opties van een app op een tablet zijn vaak te beperkt. Vanaf ca 2008 Sportracks V2.0 (referentie 1) gewend, aangevuld met een compacte weeksamenvatting in Excel, een combi van het Word-log van mijn trainster van de wedstrijdgroep en het Haag atletiek logboek in Excel (referentie 2).

Dit offline gebrek aan data analyse is geen onbekend probleem en ook voor de duurzaamheid van veel spullen imho niet goed is omdat de online app zomaar kan verdwijnen of op den duur jouw horloge niet meer ondersteunt. Zoals bekend biedt Garmin Connect online maar een zeer beperkt aantal opties aan om je data eenvoudig, transparant offline nader te bekijken.

Namelijk:
1. De GPX-export met vnl. de route en een paar andere data (deze opsomming is niet compleet)
2. De TCX-export die ook niet alle parameters van de FR735XT bevat
3. De export als csv-bestand met een samenvatting van de geklokte rondjes met de gemiddelden van de meeste parameters zoals hartslag, contacttijd, etc. Een zeer beperkte export.
4. De export van de complete raw data als fit bestand: Dit bestand bevat alle data van het horloge zelf en van de eventuele verbonden HRM en kun je ook gedurende een bepaalde tijd van je sporthorloge downloaden.

Er is dus zonder additionele bewerking van het originele fit -bestand geen andere export die direct in bijvoorbeeld Excel een volwaardig alternatief voor het fit bestand kan zijn waarmee alle online grafieken relatief (!) eenvoudig tot stand komen. Je zou nog van elke online activiteit grafiek een pdf o.i.d. kunnen printen, maar die is niet erg handig om verder in de data te verdiepen en niet eenvoudig in een tool als Excel te verwerken (bijv met een image-to-Excel converter). De online plots hebben verder ook amper of geen ruimte naast de plots om aantekeningen te maken als je dat zou willen.

In dit forum onderdeel zijn al meerdere methodes voorbij gekomen om de ruwe data om te zetten in export data en daarmee zelf je grafieken te maken. Het zijn vooral @ToolkiT en @slow whoop die op verschillende manieren het onder de aandacht brachten, de laatste met een mooie plot om 2 methodes van hartslag metingen te vergelijken.Verder attendeerde @slow whoop in een van zijn laatste berichten mij nog hier op: “Zo heeft DC Rainmaker een DCR Analyzer tool gemaakt om FIT-files te analyseren. Hier moet je wel voor betalen. En dezelfde DC Rainmaker noemt ook nog de FIT File Tools, waarmee je wat bewerkingen kunt doen op FIT-files. Maar exporteren van de data (naar CSV) kan daar volgens mij niet mee.” De DCR Analyzer tool is wel een betaalde tool en worden er op hun site (referentie 3) wel bepaalde downloads opties genoemd als voorbeeld, maar of je het met alle parameters kunt doen? Op de FIT File Toolssite site (referentie 4) is inderdaad geen FIT naar csv optie te vinden tussen de tools.

Bij mijn eigen zoektocht om het fit bestand naar voor bijvoorbeeld Excel leesbaar te maken ging eerst eigenlijk ook via het Python pad (referentie 5) en de andere route was de eerder genoemde Java tool FitCSVTool, waarbij in het begin de Python export route best redelijk was, maar waarbij ook nog redelijk wat handwerk nodig zou zijn geweest. Om dat in Excel te automatiseren … , bij gebrek aan voldoende VBA-programmeer ervaring... En ik heb nog heel kort naar FinalSurge https://finalsurge.com/apps gekeken, waar je als atleet een gratis account kunt krijgen. De plots zijn best goed, maar ook daar zijn er geen opties om een gedecodeerd fit bestand compleet in een voor Excel/Calc leesbaar format te exporteren.

Op een bepaald moment herinnerde me ik in dit forum topic iets over Matlab gelezen te hebben. Ik had zelf maar een klein beetje ervaring met Octave, de Open Source tegenhanger (referentie 6) van het commerciële Matlab, de meeste code daarvan werkt ook bij Octave. Ik werd toen echt nieuwsgierig op welke manier @slow whoop tot zijn resultaat gekomen was.


Het resultaat

In no time had ik een hele leuke reactie van @slow whoop en dat leidde al ras tot het delen van zijn Matlab-code. Het meeste was me wel duidelijk maar niet alles. Hij heeft me de nodige tips gegeven en door de interactie waar ik hem de geüpdate code terugstuurde kwam er ook weer aanvullende code in mijn richting naar mate het meer en meer duidelijk werd waar de kansen maximaal de data uit het fit-bestand te halen en hoe ze ook in Octave te plotten en hoe ook een acceptabele csv output voor een rechtstreeks import in Calc van Libre Office (LO, referentie 7) mogelijk werd en vervolgens voor Excel zonder te rommelen met de regio settings ook correct ingelezen kon worden.

Met de Octave code kunnen nu de volgende parameters direct geplot dan wel in een csv geëxporteerd worden.
  • timestamp
  • distance
  • altitude
  • speed
  • vertical_oscillation
  • stance_time_percent
  • stance_time
  • vertical_ratio
  • stance_time_balance
  • step_length
  • heart_rate
  • cadence
De huidige Octave-code wordt apart gepost, dus eerst ruimte voor een indruk van wat plaatjes die door Octave gegenereerd zijn uit mijn FR735XT fit bestand van een looptraining als f(tijd) in seconden.


Er ontbreken voor de FR735XT alleen nog de enhanced data van bepaalde parameters. Komt nog.

Dit zijn plots van de ruwe data uit de FIT geëxtraheerd in Octave en dus direct in een keer geplot. Er is verder geen enkele additionele filtering toegepast, ook nog geen omrekening naar minuten voor de x-as. Deze plots kun je ook apart weergeven door voor elke grafiek daar een Octave opdracht te geven. De plots verschijnen in een apart venster en zijn zonder nieuwe Octave code input niet te bewerken. Om bijvoorbeeld dus in te zoomen op een deel van de grafiek moet je dus de code aanpassen. Daar ligt mijn sterke kant (nog?) niet op het gebied van programmeren, dus was er toch een sterke wens om tot een bruikbare export te komen voor Calc (LO)/Excel. Deze export code is met behulp van @slow whoop tot stand gekomen, heb het in samenwerking met hem, verder geoptimaliseerd om tot een voor Calc acceptabele csv import te komen, zoals in het volgende plaatje te zien is.



Ook dit zijn nog ruwe data, met een punt als decimaal teken, maar een regio-NL type Excel herkent dat automatisch als een komma.

Met deze data kun je nu in Excel/Calc heel eenvoudig alle plaatjes maken van de parameters uit het fit-bestand. Een indruk van de eerste grove verwerking, zonder een of ander filter, in Excel geplot (nog zonder cadence).




Nabeschouwing

Ok, ik had wat valkuilen/problemen, o.a. zou de volgorde van het extraheren van de parameters het resultaat zou beïnvloedden? Soms leek dat zo, maar dan bleek er toch een mini syntax fout in de code te zitten. Alleen voor de “stance”-type data moet ik nog checken of er een einde tekst teken in de code moet komen, want daar leek de volgorde wel belangrijk te zijn. Kortom er valt nog wel een en ander te valideren, maar grosso modo mag er gesteld worden: Met de gebruikte combi van methodes/tools, Java/FitCSVTool/Octave of Matlab/Calc e/o Excel, blijkt het mogelijk om uit een Garmin-fit-bestand veel parameters tot een prettige data en grafische weergave te komen. We waren uiteindelijk beiden verrast hoe relatief “simpel” en relatief schoon de data eruit kwamen, zelfs zonder op de plots zelf enige additionele data filtering toe te passen.

Alhoewel ik nog bezig ben om in Excel of Calc te kijken wat nu de handige extra tools kunnen zijn om snel naast de grafieken zinvolle samenvattingen van typische onderdelen in de training te geven. Kun je binnen een serie meer zien aan de grond contacttijd dan alleen het gemiddelde, bijvoorbeeld een trend… Data die dan snel bij de grafiek gezet kunnen worden? Ben ook een beetje aan het rondkijken naar zoom tools voor de grafiek, zodat je met schuifjes even snel dat gebied beter kunt bekijken zonder iets met de data zelf te doen? En daar heel kort iets over vastleggen? Dat zoomen kan online ook, helaas niet even een notitie ernaast maken.
En als je dan wat verder gaat? Overlays van grafieken binnen een training… hartslag en contacttijd… zie je wat? Met een 2e Y-as zou je al best veel kunnen combineren.

Ergens daar gaat het voor mij ophouden, ik kan altijd offline bij de data, ze goed bekijken en waar nodig opmerkingen toevoegen en voor de lange termijn (hoop ik..) later heel eenvoudig historische data terughalen…… vergelijken… hmmmm dan ben ik al wellicht geen M60 meer…. Oef…


Oproep:

Leef je uit als je hier behoefte aan hebt. En deel hier vooral jouw ervaringen, additionele code, mooi tools en vul zelf maar verder in wat je graag zou willen delen.

Voor de Garmin Forerunner 645 kon @slow whoop zijn data voor zijn doel extraheren. Hoe breed de huidige code toe te passen is voor andere Garmins sporthorloges? De kans dat je code op onderdelen aan moet passen is realistisch. Probeer het gewoon met alleen tijd (timestamp) en hartslag (heartrate), pas de code aan, ook bij de plot en csv export. Grote kans dat je de systematiek wel door hebt in de code en post je ervaringen/problemen. Mijn ervaring met Octave was niet groot en toch kon ik zelf direct er heel veel aan/mee doen, de tips waren wel handig, vooral hoe je tot de export komt, maar nu die code er eenmaal is, lijkt het vooral een focus te worden om voor jou de juiste parameters uit het fit bestand te halen.

De code is vrij om te gebruiken, ik heb een (groot) deel ervan ook zo van @slow whoop gekregen. Bronvermelding van ons beiden zou netjes staan maar is niet verplicht.

Succes!
Route99 ook namens @slow whoop !

Overige referenties (laatst geraadpleegd 1 en 2 juli 2020):

1. SportTracks V2.0 https://www.dcrainmaker.c...t-tracks-20-released.html
(SportTracks heeft nog V3 gehad, maar is nu ook een online app)
2. Logboek 200x Haag Atletiek door Lodewijk van Dongen, genoemd op pagina 5 in https://www.yumpu.com/nl/...agse-bluf-haag-atletiek/4
3. Java https://www.java.com/nl/download/
4. https://www.dcrainmaker.com/analyzer
5. https://www.fitfiletools.com/#/top
6. Gebruikte Python route: https://github.com/dtcooper/python-fitparse
7. Octave https://www.gnu.org/software/octave/
8. LibreOffice (Calc) https://www.libreoffice.org/


De rest van de referenties is in de lopende tekst geplaatst (laatst geraadpleegd 1 en 2 juli 2020).
De code zie onder.


De code voor Matlab/Octave

Sla de code op in een fitnaam.m script bestand die zowel door Octave als Matlab gerund kan worden.
Pas in de code de fit bestandsnaam en pad naar fit-file en FitCSVTool.jar file aan. Bij mij stonden de systeem settings voor Java en Octave goed, wees alert dat dit een mogelijke extra foutenbron kan zijn.
Door de bestandsnaam van het fit bestand gelijk te houden voorkom je dat je telkens de code aan moet passen. Herbenoem de csv output want die wordt bij het weer runnen van het Octave-script overschreven door een fit bestand van een andere activiteit.

Zijn er Java problemen? Test deze code even apart in een Windows 10/7/? cmd-venster met het Java pad waar het Java-tool script EN de fit-file beiden staan.
code:
1
 java -jar FitCSVTool.jar -b filename.fit filename.csv


Uit de foutmelding blijkt meestal wel wat er nog nodig is om het goed te krijgen.


Aanvullende links over tips voor de code van Matlab/Octave
Een centrale plaats voor weblinks die je bij het begrijpen/aanpassen van de code kunnen ondersteunen .

AlgemeenDe zoekstrategie in het fit-bestand aanpassen (methode= pattern search)
Matlab:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
clear;

% Path to fit-file and FitCSVTool.jar file
fit_file = 'C:\ACTIVITY\FitSDKRelease_21.32.00\FitSDKRelease_21.32.00\java\naam.fit';
fitcsvtool = 'C:\ACTIVITY\FitSDKRelease_21.32.00\FitSDKRelease_21.32.00\java\FitCSVTool.jar';

%% Convert fit-file to csv-file (system command)
[ fit_file_folder, fit_file_name, fit_file_ext ] = fileparts( fit_file );
csv_file = fullfile( fit_file_folder, [ fit_file_name, '.csv' ] );

system_cmd = [ 'java -jar "', fitcsvtool, '" -b "', fit_file, '" "', csv_file, '"' ];
system( system_cmd );

%% Read csv-file line-by-line
fid = fopen( csv_file );
k = 0;
while ~feof(fid)
    k = k + 1;
    tline{k} = fgetl(fid);
end
fclose(fid);

%% Find lines matching the regexp string
m = 0;
for k = 1:length(tline)
    raw{k} = regexp( tline{k}, 'timestamp,"(\d*)",s.*distance,"(\d*.\d*)",m.*altitude,"(\d*.\d*)",m.*speed,"(\d*.\d*)",m/s.*vertical_oscillation,"(\d*.\d*)",mm.*stance_time_percent,"(\d*.\d*)",percent.*stance_time,"(\d*.\d*)",ms.*vertical_ratio,"(\d*.\d*)",percent.*stance_time_balance,"(\d*.\d*)",percent.*step_length,"(\d*.\d*)",mm.*heart_rate,"(\d*)",bpm.*cadence,"(\d*)",rpm.', 'tokens' );
    if ~isempty( raw{k} )
        m = m + 1;
        timestamp(m)            = str2double( raw{k}{1}{1} );
        distance(m)             = str2double( raw{k}{1}{2} );
        altitude(m)             = str2double( raw{k}{1}{3} );
        speed(m)                = str2double( raw{k}{1}{4} );
        vertical_oscillation(m) = str2double( raw{k}{1}{5} );
        stance_time_percent(m)  = str2double( raw{k}{1}{6} );
        stance_time(m)          = str2double( raw{k}{1}{7} );
        vertical_ratio(m)       = str2double( raw{k}{1}{8} );
        stance_time_balance(m)  = str2double( raw{k}{1}{9} );
        step_length(m)          = str2double( raw{k}{1}{10} );
        heart_rate(m)           = str2double( raw{k}{1}{11} );
        cadence(m)              = str2double( raw{k}{1}{12} );
    end
end

%% Write data to "clean" CSV-file
header = { 'timestamp', 'distance', 'altitude', 'speed', 'vertical_oscillation', 'stance_time_percent', ...
           'stance_time', 'vertical_ratio', 'stance_time_balance', 'step_length', 'heart_rate', 'cadence' };
alldata = [ timestamp-timestamp(1); distance; altitude; speed; vertical_oscillation; stance_time_percent; ...
            stance_time; vertical_ratio; stance_time_balance; step_length; heart_rate; cadence ];
csv_file_clean = fullfile( fit_file_folder, [ fit_file_name, '_clean.csv' ] );

fid = fopen( csv_file_clean, 'w' );
  fprintf( fid,'%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s\n', header{1,:} );
  fprintf( fid,'%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %d\n', alldata );
fclose(fid);

%% Plotjes
figure(1);
subplot(6,2,1);
plot( timestamp - timestamp(1), distance );
xlabel('time (s)');
ylabel('distance (m)');

subplot(6,2,2);
plot( timestamp - timestamp(1), altitude );
xlabel('time (s)');
ylabel('altitude (m)');

subplot(6,2,3);
plot( timestamp - timestamp(1), speed );
xlabel('time (s)');
ylabel('speed (m/s)');

subplot(6,2,4);
plot( timestamp - timestamp(1), vertical_oscillation );
xlabel('time (s)');
ylabel('vertical oscillation (mm)');

subplot(6,2,5);
plot( timestamp - timestamp(1), stance_time_percent );
xlabel('time (s)');
ylabel('stance time percent (%)');

subplot(6,2,6);
plot( timestamp - timestamp(1), stance_time );
xlabel('time (s)');
ylabel('stance time (ms)');

subplot(6,2,7);
plot( timestamp - timestamp(1), vertical_ratio );
xlabel('time (s)');
ylabel('vertical ratio (%)');

subplot(6,2,8);
plot( timestamp - timestamp(1), stance_time_balance );
xlabel('time (s)');
ylabel('stance time balance (%)');

subplot(6,2,9);
plot( timestamp - timestamp(1), step_length );
xlabel('time (s)');
ylabel('step length (mm)');

subplot(6,2,10);
plot( timestamp - timestamp(1), heart_rate );
xlabel('time (s)');
ylabel('heart rate (bpm)');

subplot(6,2,11);
plot( timestamp - timestamp(1), cadence );
xlabel('time (s)');
ylabel('cadence (rpm)');

[Voor 31% gewijzigd door route99 op 03-07-2020 10:09. Reden: code verplaatst. editing daarvan door @slow whoop ook mogelijk]

Je eigen geluk bepaal je zelf!


  • route99
  • Registratie: Augustus 2017
  • Laatst online: 23:24

route99

just passionately curious...

Topicstarter
Verplaatst naar de topic start zodat @slow whoop ook deze editen kan...

[Voor 98% gewijzigd door route99 op 02-07-2020 22:30]

Je eigen geluk bepaal je zelf!


  • route99
  • Registratie: Augustus 2017
  • Laatst online: 23:24

route99

just passionately curious...

Topicstarter
Kleine aanvulling op wat ervaringen:

In een vroege poging om in Excel in te zoomen via zelf gemaakt schuifjes voor de grafieken kwam ik daarna deze add-on tegen:
YouTube: YouTube
Naast het zoomen kun je van een geselecteerd gebied ook statistische data laten berekenen en die naast de grafiek plaatsen. De add-in is gratis te gebruiken, zie hun home page.

Voor Calc zal; dit wrs niet werken. Nog geen tijd gehad om naar een workaround te kijken, of gewoon ook daar zelf schuifjes te maken met de tools die in Calc zitten.

Je eigen geluk bepaal je zelf!


  • Antonius
  • Registratie: Juli 2000
  • Laatst online: 04-12 16:38
Een behoorlijke kick, maar wel on-topic :)

Ik ben nog niet zo heel lang aan het hardlopen. Snelheid/inspanning doe ik vooralsnog puur op gevoel en dat gaat prima. Ik heb een duursport verleden, dus ik voel automagisch vrij goed aan welke inspanning ik langer vol houd en wanneer ik mijzelf "op zou blazen". Daarmee kan ik dus al aardig inschatten hoe ik mijn krachten verdeel. Kan dus een langere belasting van begin tot eind mooi vlak lopen. In intervallen gemakkelijk aanvoelen dat ik wat dieper kan gaan. Ik loop recreatief, geen wedstrijden, ben niet bezig met het behalen van het maximaal haalbare, PR's, etc. Helemaal geen noodzaak dus tot gebruik van een sporthorloge.

Maar ik zit niet voor niets al sinds de oertijd op Tweakers, dus de nerd in mij is best benieuwd naar dingen als afstanden, snelheden, verloop van hartslag/ademhaling tijdens inspanning en herstel etc. Sporthorloges zijn er volop en aardig betaalbaar. Echter, bijna allemaal gaat het via een of andere cloud service van de makers van het horloge. Daar heb ik geen behoefte aan. Ik heb niet de illusie dat ik onzichtbaar ben voor de big tech jongens en andere geïnteresseerden. Van de andere kant vind ik dat we dit soort gegevens niet in bulk op een presenteerblaadje hoeven aan te bieden. Temeer omdat er een duidelijke link ligt met gezondheidsaspecten en individuele traceerbaarheid.

Kortom, ik zou best een sporthorloge willen gebruiken, maar alleen als ik de data zelf rechtstreeks uit het device kan trekken. Offline, met een USB kabeltje naar mijn eigen computer en niet via een of andere app of service van Garmin of een andere leverancier. Is dat mogelijk met deze tools? Zoja, dan ga ik misschien wel een black friday dealtje scoren en lekker zelf aan het hacken met de uitgelezen data.

  • route99
  • Registratie: Augustus 2017
  • Laatst online: 23:24

route99

just passionately curious...

Topicstarter
Antonius schreef op donderdag 24 november 2022 @ 13:26:
Kortom, ik zou best een sporthorloge willen gebruiken, maar alleen als ik de data zelf rechtstreeks uit het device kan trekken. Offline, met een USB kabeltje naar mijn eigen computer en niet via een of andere app of service van Garmin of een andere leverancier. Is dat mogelijk met deze tools? Zoja, dan ga ik misschien wel een black friday dealtje scoren en lekker zelf aan het hacken met de uitgelezen data.
Dit, zie plaatje, is wat je ziet op de PC als het USB kabeltje op deze Garmin aangesloten is.
Je hoeft dan alleen nog de FIT bestanden "hacken "......
Succes.

Je eigen geluk bepaal je zelf!


  • Antonius
  • Registratie: Juli 2000
  • Laatst online: 04-12 16:38
Leuk, dank je wel. Nog een kleine dag om te beslissen of ik een BF deal ga meepakken en ook de nerd-kant van hardlopen ga bekijken (8>


EDIT:
Een Forerunner 55 is besteld :)

[Voor 14% gewijzigd door Antonius op 25-11-2022 18:35]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee