Toon posts:

FIT-files via Matlab/Octave & Calc/Excel evalueren

Pagina: 1
Acties:

Acties:
  • +4Henk 'm!

  • route99
  • Registratie: augustus 2017
  • Nu online
Mede-auteur:
  • slow whoop
  • Registratie: april 2007
  • Laatst online: 16:06

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]


  • route99
  • Registratie: augustus 2017
  • Nu online
Verplaatst naar de topic start zodat @slow whoop ook deze editen kan...

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


  • route99
  • Registratie: augustus 2017
  • Nu online
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.


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee