Monthly Archives: February 2012

Hackerdehack

Herken je dit? Je hebt een GPS track, van een tracklogger (in .gpx formaat) of van je Garmin horloge (in .tcx formaat), maar er zitten geen splits in, omdat je niet bij elke post op het knopje hebt gedrukt. En de club gebruikt niet Winsplits in combinatie met die ene specifieke server waar Quickroute mee praat, dus je kan de splits niet automatisch in Quickroute krijgen.

Herkenbaar? Je zult handmatig de tijden in moeten voeren, door op de juiste plaatsen op de kaart te klikken.

Of je schrijft een klein programmatje in Matlab (of gebruikt mijn code) om de .tcx files te voorzien van de splits die je eenvoudig van de Slitsbrowser pagina haalt (de regel in de Results Table met jouw naam er voor; copy – paste).

Heb je geen Garmin .tcx file, maar een generieke .gpx file van een tracklogger, maak er dan eerst een .tcx file van met GPSbabel.
gpsbabel -t -i gpx -f dit_track_bestand.gpx -o gtrnctr,course=0 -F het_nieuwe_bestand.tcx

En zo heb ik bijvoorbeeld deze kaart van Hamont gemaakt, met de controls direct op de juiste plek.

Er zit een slimmigheidje in de functie om te detecteren hoeveel tijdverschil er tussen de GPS gegevens zit en de start. Mocht dat niet werken, knip dan handmatig tevoren het stuk van de track tot vlak voor de start, en vlak na de finish af.

Mochten ze in QuickRoute het inladen van SplitsBrowser files ondersteuen, dan zal het wel op het QuickRoute Forum te lezen zijn. En dat is wellicht ook de plaats om om deze feature te vragen. Hoe meer mensen het hier over hebben, hoe groter de kans.

function splits2tcx(in_file,splits)
% om een extra neutralisatie-post in mee te nemen die niet in de splits zat, voeg een
% +0:17 (of andere tijd) toe op de plaats. 
 
% gpsbabel = 'c:\localdata\bin\gpsbabel\gpsbabel.exe'
 
% CHECK various splits strings
 
force_tcx_conversion = 1; % force gpsbabel to convert tcx to tcx (to fix for example Android Garmin Uploader files)
if nargin support for %s files not yet implemented.\n',fe);
    end
    if nok
        error('err-> conversion to .tcx file failed');
    else
        fprintf('done.\n'); % JHH
    end
end
 
fprintf('** acquiring splits **\n');
if nargin0) % absolute times
    if splits(1)~=splits(end)
        warning('I expected the total time (1st data point) to be equal to the finish time (last data point). Netralized leg compensation?');
    end
    splittimes = [0 splits(2:end)];
else % relative times
    splittimes = [0 cumsum(splits)];
end
 
fprintf('** using split times: "%s" **\n',reshape(strvcat(m2ms(splittimes'/60,1)',' '),1,[]));
 
fprintf('** reading tcx file: "%s" **\n',tcx_file);
t = []; tp = [];
d = []; dp = [];
ll = []; lp = [];
 
[fid,err] = fopen(tcx_file,'r');
if fid failed opening file "%s" for reading, with error: %s',tcx_file,err);
end
 
arm = 0;
while ~feof(fid)
    l = fgetl(fid);
    hms = sscanf(l,'%*[^&lt;]<time>%*[^T]T%d:%d:%dZ</time>');
    if ~isempty(hms)
        t(max(length(d),size(ll,1))+1) = [60*60 60 1]*hms;
        tp(max(length(d),size(ll,1))+1) = ftell(fid);
        arm = 1;
    else
        dm = sscanf(l,'%*[^&lt;]%f');
        if arm &amp;&amp; ~isempty(dm)
            d(length(t)) = dm;
            dp(length(t)) = ftell(fid);
            if length(d)&gt;length(t)
                l
            elseif length(d)&lt;length(t)
                l
            end
            arm = 0;
        else
            la = sscanf(l,'%*[^&lt;]%f');
            if arm &amp;&amp; ~isempty(la)
                ll(length(t),1) = la;
                lp(length(t)) = ftell(fid);
            else
                lo = sscanf(l,'%*[^&lt;]%f');
                if arm &amp;&amp; ~isempty(lo)
                    ll(length(t),2) = lo;
                else
                    ls = sscanf(l,'%*[^&lt;]');
                    if ~isempty(ls)
                        arm = 0;
                    end
                end
            end
        end
    end
end
if arm % last timepoint has no location or distance
    if ~isempty(d)
        t = t(1:length(d));
    elseif ~isempty(ll)
        t = t(1:size(ll,1));
    end
end
 
findmin = inline('min(find(a(:)==min(a(:))))','a');
if ~isempty(d)
    fprintf('%d timestamps; %d distances; %d splits; %d gaps\n',length(t),length(d),length(find(diff(t)==0)),length(find(diff(t)&gt;1)));
else
    fprintf('%d timestamps; %d distances; %d splits; %d gaps\n',length(t),length(ll),length(find(diff(t)==0)),length(find(diff(t)&gt;1)));
end
lapsplit = find(diff(t)==0);
t(lapsplit) = [];
ll(lapsplit,:) = [];
if ~isempty(d)
    d(lapsplit) = [];
    dd = diff(d);
else
    [x,y] = deg2utm(ll(:,1),ll(:,2));
    dd = sqrt(sum(diff([x y]).^2,2));
end
 
dd = dd(:).';
 
if 1
    %%
    dt = diff(t);
    if any(dt&gt;1)
        fprintf('missing track-points at: \n%s',sprintf('%d:%02d : %d [s]\n',[round(m2ms((t(find(diff(t)&gt;1))-t(1))/60)).';dt(dt&gt;1)]));
        %         if any(diff(t)&gt;2)
        %             error('only solves single missing points');
        %         end
        for ii = fliplr(find(dt&gt;1))
            dd(1:end+dt(ii)-1) = [dd(1:ii-1) repmat(dd(ii)/dt(ii),1,dt(ii)) dd(ii+1:end)];
        end
        t = t(1):t(end);
        %         t1(cumsum([1 (diff(t)&gt;1)+1])) = t;
        %         d1(cumsum([1 (diff(t)&gt;1)+1])) = dd;
        %         d1(find(~t1))   = d1(find(~t1)-1)/2;
        %         d1(find(~t1)-1) = d1(find(~t1));
        %         t1(~t1) = t1(find(~t1)-1);
    end
 
%     comb = repmat(round(splittimes),2,1)+repmat([1:2]',1,length(splittimes));
%     window(comb(:)) = 1;
%     xc = xcorr(window,dd);
%     those = length(xc)-length(dd)-[0:length(dd)-splittimes(end)];
%     xcdt = detrend(xc(those),'linear',ceil(length(those)/2));
%     %plot(xcdt)
%     offset = findmin(xcdt);
%     figure(12345);
%     s1=subplot(211);plot(dd);line(offset,0,'marker','o','color','r');line(offset+splittimes,0,'marker','s','color','g');
%     s2=subplot(212);plot(xc(those));line(offset,xc(those(offset)),'marker','o','color','r');
%     set(s2,'xlim',get(s1,'xlim'));
    %%
    m = 2;
    comb = repmat(round(splittimes),m,1)+repmat([1:m]',1,length(splittimes));
    window = [];
    window(comb(:)) = 1;
    if length(window)&gt;length(dd)
        dd = [zeros(1,2*(length(window)-length(dd))) dd zeros(1,2*(length(window)-length(dd)))];
    end
    xc = xcorr(window,dd);
    those = length(xc)-length(dd)-[0:length(dd)-splittimes(end)];
    xcdt = detrend(xc(those),'linear',ceil(length(those)/2));
    %plot(xcdt)
    offset = findmin(xcdt)+floor(m/2)
    figure(12345);
    s1=subplot(2,4,1:4);plot(dd*3600/1000);line(offset,0,'marker','o','color','r');line(offset+splittimes,0,'marker','s','color','g');
    s2=subplot(2,4,5:6);plot([1:length(those)],xc(those));line(offset-floor(m/2),xc(those(offset-floor(m/2))),'marker','o','color','r');
    n = 20;
    x=reshape(offset+repmat(0*splittimes(:)',2*n+2,1)+repmat([-n:n nan]',1,length(splittimes)),1,[]);
    y=reshape(offset+repmat(splittimes(:)',2*n+2,1)+repmat([-n:n nan]',1,length(splittimes)),1,[]);
    s3=subplot(2,4,[7 8]);plot(x,dd(min(max(y,1),length(dd))));line(offset,0,'marker','s','color','r');
    %%
else
    %%
    [b,a] = butter(2,0.9);
    dd = filtfilt(b,a,dd);
    for ii = 1:(t(end)-t(1))-splittimes(end)+1
        td(ii) = 0;
        ti = ii+(1:splittimes(end))-1;
        for jj = 1:length(splittimes)
            deze(jj) = findmin(abs((t(ti)-t(1))-splittimes(jj)));
            td(ii) = td(ii)+dd(deze(jj));
        end
    end
    offset = t(max(find(abs(td)==min(abs(td)))))-t(1);
    %%
end
 
s = sprintf('Estimated offset of GPS (nr of seconds the GPS was started before the splittimer): %0.1f [s]',offset);
fprintf('%s\n',s);
 
new_offset = inputdlg(strvcat(s,'Keep this value, or enter a different offset (based on the graphs):'),'Corect estimated offset',1,{sprintf('%0.1f',offset)});
drawnow;
if ~isempty(new_offset{1}), 
    if isempty(str2num(new_offset{1}))
        error('err-&gt; invalid value: "%s"',new_offset{1});
    end
    offset = str2num(new_offset{1});
    s3=subplot(2,4,[7 8]);
    line(offset,0,'marker','s','color','m');
end
 
 
t_sync = t-t(1)-offset;
for jj = 1:length(splittimes)
    splittimes_sync(jj) = t_sync(findmin(abs(t_sync-splittimes(jj))));
end
splittimes_abs = splittimes_sync+t(1)+offset;
 
fprintf('** finished reading tcx file **\n');
 
frewind(fid);
[fp,fn,fe] = fileparts(in_file);
outfile = fullfile(fp,[fn '_splits.tcx']);
fprintf('** writing output file: "%s" **\n',outfile);
fod = fopen(outfile,'w');
[fod,err] = fopen(outfile,'w');
if fod failed opening file "%s" for writing, with error: %s',outfile,err);
end
 
distance_offset = 0;
 
phase = 0;
% phases:
% 0 header
% 1 first track header, until first point to be included
% 2 first trackpoints being included
% 3 other trackpoints being included
% 4 buffering last point of current lap
% 5 obsolete lap header
% 6 last trackpoint writing
% 7 trackpoints after last trackpoint
% 8 trailer
 
trackpointbuffer = {};
lap = 0;
while ~feof(fid)
    l = fgets(fid);
 
    if phase==0
        lp = sscanf(l,'%*[^&lt;]&lt;Lap%s'); % StartTime=%s');
        if ~isempty(lp) &amp;&amp; phase==0
            phase = 1;
            % do not parse from here
        end
    else
        lp = sscanf(l,'%*[^&lt;]%c');
        if ~isempty(lp) &amp;&amp; phase&gt;0
            phase = 8;
            % do parse trailer from here
        else
            lp = sscanf(l,'%*[^&lt;]&lt;Creator%s'); if ~isempty(lp) &amp;&amp; phase&gt;0
                phase = 8;
                % do parse trailer from here
            end
        end
    end
 
    if any(phase==[2 3 4])
        lp = sscanf(l,'%*[^&lt;]%c');
        if ~isempty(lp)
            if any(phase==[2 3]) % not if phase is 4, since then already a lap was included here
                phase = 5;
                % do not parse from here, until next lap started
            elseif phase==4 % buffered, but continue including lap
                phase = 3; % continue writing; lap is OK here
                trackpointbuffer = {};
                lap = lap+1;
            end
        end
    end
 
    laptext = [0 0];
 
    if any(phase==[4 5 6])
        lp = sscanf(l,'%*[^&lt;]%c');
        if ~isempty(lp)
            if phase==6
                % last point passed, no output anymore except trailer
                phase = 7;
                fprintf(fod,l);
                l = '';
                laptext = [0 1];
            elseif phase==4
                % copying last trackpoint for new track
                % inlude lap split
                fprintf(fod,l);
                laptext = [1 1]; % implicitly include trackpointbuffer
            elseif phase==5
                % skip first trackpoint after lap, since it is identical
                phase = 3;
                l = '';
            end
        end
    end
 
    hms = sscanf(l,'%*[^&lt;]<time>%*[^T]T%d:%d:%dZ</time>');
    if ~isempty(hms)
        timestr = sscanf(l,'%*[^&lt;]<time>%[^Z]Z</time>');
        if [60*60 60 1]*hms&gt;=splittimes_abs(1) &amp;&amp; phase=splittimes_abs(end) &amp;&amp; phase=splittimes_abs(lap+1) &amp;&amp; phase%f');
        if ~isempty(lp)
            if phase==2
                distance_offset = lp;
            end
            l = sprintf('            %0.7f\n',lp-distance_offset);
        end
    end
 
    if laptext(2)
        fprintf(fod,'         \n');
        fprintf(fod,'       \n');
    end
    if laptext(1)
        lap = lap+1;
        fprintf(fod,'       \n',timestr);
        fprintf(fod,'         %0.7f\n',diff(splittimes_abs(lap+[0:1])));
        fprintf(fod,'         Active\n');
        fprintf(fod,'         Manual\n');
        fprintf(fod,'         \n');
        fprintf(fod,'           \n');
    end
    if phase==4
        if all(laptext)
            fprintf(fod,'%s',trackpointbuffer{:});
            trackpointbuffer = {};
            phase = 3;
        else
            trackpointbuffer{end+1} = l;
        end
    end
 
    if any(phase==[0 2 3 4 6 8])
        fprintf(fod,'%s',l);
    end
 
end
fclose(fod);
fclose(fid);
fclose('all');
 
fprintf('** finished successfully: splits were included in tcx file **\n');
 
 
 
 
function times = readtimes(in)
times = [];
offset = 0;
for ii = 1:length(in)
    this = sscanf(in{ii},'%d%*[.:]%d%*[.:]%d');
    if length(this)==2
        if in{ii}(1)=='+'
            offset = offset+[60 1]*this;
            times(end+1) = times(end)+offset;
        else
            times(end+1) = [60 1]*this+offset;
        end
    elseif length(this)==3
        if in{ii}(1)=='+'
            offset = offset+[60*60 60 1]*this;
            times(end+1) = times(end)+offset;
        else
            times(end+1) = [60*60 60 1]*this+offset;
        end
    end
end
 
 
% function strs = split(str,sep,include,num)
% % SPLIT - split a string in substrings by separator
% matches = [1 strfind(str,sep)+1 length(str)+2];
% for ii = 1:length(matches)-1
%     strs{ii} = str(matches(ii)+(ii&gt;1)*(size(sep,2)-1):matches(ii+1)-2);
% end
 
 
 
function  [x,y,utmzone] = deg2utm(Lat,Lon)
% -------------------------------------------------------------------------
% [x,y,utmzone] = deg2utm(Lat,Lon)
%
% Description: Function to convert lat/lon vectors into UTM coordinates (WGS84).
% Some code has been extracted from UTM.m function by Gabriel Ruiz Martinez.
%
% Inputs:
%    Lat: Latitude vector.   Degrees.  +ddd.ddddd  WGS84
%    Lon: Longitude vector.  Degrees.  +ddd.ddddd  WGS84
%
% Outputs:
%    x, y , utmzone.   See example
%
% Example 1:
%    Lat=[40.3154333; 46.283900; 37.577833; 28.645650; 38.855550; 25.061783];
%    Lon=[-3.4857166; 7.8012333; -119.95525; -17.759533; -94.7990166; 121.640266];
%    [x,y,utmzone] = deg2utm(Lat,Lon);
%    fprintf('%7.0f ',x)
%       458731  407653  239027  230253  343898  362850
%    fprintf('%7.0f ',y)
%      4462881 5126290 4163083 3171843 4302285 2772478
%    utmzone =
%       30 T
%       32 T
%       11 S
%       28 R
%       15 S
%       51 R
%
% Example 2: If you have Lat/Lon coordinates in Degrees, Minutes and Seconds
%    LatDMS=[40 18 55.56; 46 17 2.04];
%    LonDMS=[-3 29  8.58;  7 48 4.44];
%    Lat=dms2deg(mat2dms(LatDMS)); %convert into degrees
%    Lon=dms2deg(mat2dms(LonDMS)); %convert into degrees
%    [x,y,utmzone] = deg2utm(Lat,Lon)
%
% Author: 
%   Rafael Palacios
%   Universidad Pontificia Comillas
%   Madrid, Spain
% Version: Apr/06, Jun/06, Aug/06, Aug/06
% Aug/06: fixed a problem (found by Rodolphe Dewarrat) related to southern 
%    hemisphere coordinates. 
% Aug/06: corrected m-Lint warnings
%-------------------------------------------------------------------------
 
% Argument checking
%
error(nargchk(2, 2, nargin));  %2 arguments required
n1=length(Lat);
n2=length(Lon);
if (n1~=n2)
   error('Lat and Lon vectors should have the same length');
end
 
 
% Memory pre-allocation
%
x=zeros(n1,1);
y=zeros(n1,1);
utmzone(n1,:)='60 X';
 
% Main Loop
%
for i=1:n1
   la=Lat(i);
   lo=Lon(i);
 
   sa = 6378137.000000 ; sb = 6356752.314245;
 
   %e = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sa;
   e2 = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sb;
   e2cuadrada = e2 ^ 2;
   c = ( sa ^ 2 ) / sb;
   %alpha = ( sa - sb ) / sa;             %f
   %ablandamiento = 1 / alpha;   % 1/f
 
   lat = la * ( pi / 180 );
   lon = lo * ( pi / 180 );
 
   Huso = fix( ( lo / 6 ) + 31);
   S = ( ( Huso * 6 ) - 183 );
   deltaS = lon - ( S * ( pi / 180 ) );
 
   if (la&lt;-72), Letra='C';
   elseif (la&lt;-64), Letra='D';
   elseif (la&lt;-56), Letra='E';
   elseif (la&lt;-48), Letra='F';
   elseif (la&lt;-40), Letra='G';
   elseif (la&lt;-32), Letra='H';
   elseif (la&lt;-24), Letra='J';
   elseif (la&lt;-16), Letra='K';
   elseif (la&lt;-8), Letra='L';
   elseif (la&lt;0), Letra='M';
   elseif (la&lt;8), Letra='N';
   elseif (la&lt;16), Letra='P';
   elseif (la&lt;24), Letra='Q';
   elseif (la&lt;32), Letra='R';
   elseif (la&lt;40), Letra='S';
   elseif (la&lt;48), Letra='T';
   elseif (la&lt;56), Letra='U';
   elseif (la&lt;64), Letra='V';
   elseif (la&lt;72), Letra='W';
   else Letra='X';
   end
 
   a = cos(lat) * sin(deltaS);
   epsilon = 0.5 * log( ( 1 +  a) / ( 1 - a ) );
   nu = atan( tan(lat) / cos(deltaS) ) - lat;
   v = ( c / ( ( 1 + ( e2cuadrada * ( cos(lat) ) ^ 2 ) ) ) ^ 0.5 ) * 0.9996;
   ta = ( e2cuadrada / 2 ) * epsilon ^ 2 * ( cos(lat) ) ^ 2;
   a1 = sin( 2 * lat );
   a2 = a1 * ( cos(lat) ) ^ 2;
   j2 = lat + ( a1 / 2 );
   j4 = ( ( 3 * j2 ) + a2 ) / 4;
   j6 = ( ( 5 * j4 ) + ( a2 * ( cos(lat) ) ^ 2) ) / 3;
   alfa = ( 3 / 4 ) * e2cuadrada;
   beta = ( 5 / 3 ) * alfa ^ 2;
   gama = ( 35 / 27 ) * alfa ^ 3;
   Bm = 0.9996 * c * ( lat - alfa * j2 + beta * j4 - gama * j6 );
   xx = epsilon * v * ( 1 + ( ta / 3 ) ) + 500000;
   yy = nu * v * ( 1 + ta ) + Bm;
 
   if (yy&lt;0)
       yy=9999999+yy;
   end
 
   x(i)=xx;
   y(i)=yy;
   utmzone(i,:)=sprintf('%02d %c',Huso,Letra);
end
 
 
 
 
function ms = m2ms(m,textout)
% min to min:sec
% if second argument is true, then text is output
 
if nargin1 &amp;&amp; ~~textout)
    if any(ms(:,1)&gt;=60)
        f = '%d:%02d';
        hms = [floor(ms(:,1)/60) mod(ms,60)];
    else
        f = '%02d';
        hms = ms;
    end
    if any(abs(m*60-round(m*60))&gt;1e-3)
        f = [f ':%06.3f'];
    else
        f = [f ':%02.0f'];
    end
    if ~nargout
        fprintf([f '\n'],hms.');
        clear ms;
    else
        ms = num2str(hms,f);
    end
end

Wie weet maak in nog een keer een .exe file hier van, of een online tool zodat je op mijn website jouw gpx/tcx files van splits kan voorzien. Laat hier onder, als commentaar, opmerkingen, wensen of suggesties achter. Mocht je handig zijn met Perl, PHP, Python, of zo, dan kan je wellicht deze, op zich redelijke simpele, code herschrijven.

Super gelopen in Hamont

Alweer een week geleden, intussen elke avond denkend dat ik wel even een leuk verslagje ging typen, was het dat ik door regen, sneeuw, maar ook schitterende zonneschijn, gelopen heb in Hamont. Nou ja, ik kende het gebied beter als Beverbeek. Want ik was er al ooit, wat zeg ik, dikwijls, geweest om diverse geocaches te loggen. Zoals je hier rechts kan zien.

Het lopen deze ochtend had ik me erg op verheugd. Een beetje om te compenseren wat er de vrijdag hier voor allemaal minder lekker was gelopen. Maar ook omdat ik gewoon enorme zin had om te gaan oriënteren.

En lekker ging het ook! Tot de laatste paar posten geen fouten gemaakt, overal alles gevonden, soms flink doorgestoken, maar dankzij mijn kompas, en het tijdig herkennen van de juiste stoplijnen, telkens recht op het doel afgelopen.

Het laatste stukje alleen, waar de posten nogal dicht op elkaar lagen, en kriskras mensen uit het gebladerte verschenen, me wat laten afleiden en minder geconcentreerd, liep ik een paar punten voorbij, om na wat zoekwerkt, toch te klokken. Kijk maar op de Quickroute kaart, bovenaan.

Maar de tijd was helemaal niet slecht. Ik had in de langste categorie meegelopen, wat zeker niet te veel kilometers waren, maar wel met als nadeel dat daar ook de jonge snelle mannen meeliepen. Nou ja, een paar posten voor het eind werd ik ingehaald door de nummer 2, maar toch wist ik voor hem te finishen. Het kan dus wel. Zou ik ooit eens eerste worden? Dit is in elk geval de Splits-score van deze wedstrijd.

Ik heb ook weer een videofilmpje gemaakt. Aanvankelijk wilde ik er later commentaar bij inspreken, maar we zijn alweer een week verder, en als ik me dat echt voorneem komt hij nooit af. Dus verzin verder je eigen commentaar er bij, of luister naar wat ik onderweg tegen de camera zeg (voor zover dat verstaanbaar is). Of kijk gewoon naar de schitterende omgeving, en de sneeuwvlokken op 2/3 van de tijd.

Veel plezier met kijken, en als je opmerkingen hebt kan je die altijd hier onder plaatsen. Ideeën voor ruitenwissers op mijn HeadCam worden ten zeerste gewaardeerd.

Nacht-OL in Ham, waar ze “handboeken” schrijven

N.B. De linkjes naar de filmpjes naast de filmprojector icons zijn links naar mijn eigen server, en een stuk trager dan de YouTube frames.

Op http://hamok.be/techniek/orientatielopen/ staat alles wat je wilt weten (met dank aan Luc Cloostermans, weet ik nu *).  Wat ik niet wist was dat het bos in Ham behoorlijk vol staat. Met bomen (duh), maar ook doorntakken (inmiddels zonder bramen maar met stekels), kreupelhout, en bijzonder veel dunnen stammetjes. Ook op de witte stukken kaart. En des te groener was ik zelf na afloop, mijn armen, benen, en zelfs op mijn hoofd. Groen voelde ik me ook, want ik heb toch een paar behoorlijke beginnersfouten gemaakt.

Foutjes

Kijk maar eens naar deze kaartjes. Vooral de route van 1 naar 2 was erg slordig. Ik zou nu, als ik toch eenmaal op de verharde weg was beland, die hebben gevolgd, en het pad rechtstreeks naar post 2 hebben gekozen. Waarom ik dat niet deed, en ging dolen, weet ik niet. Ik kwam onderweg Thomas van der Kleij tegen, en dacht dat hij al van 2 vandaan kwam. Dus ging ik de kant op waar hij uit kwam. Fout!

Zie hier het filmfragment:

En dan het stuk van 22 naar 23! Ik ben gewoon over de post heengelopen, volgens mijn GPS, en ben vervolgens gaan dolen. Nou ja, op zich verstandig om een referentie te zoeken, maar waarom ik nou helemaal een rondje heb gemaakt?

De hele route kan je hier zijn, in mijn Quickroute archief.

Als ik naar de splits kijk ging het nog niet zo slecht. Kon beter, maar ik ben niet ontevreden. Het beste wat ik kan doen is de balans opmaken, en er van leren. Want ik ben niet heel overdreven tevreden over mijzelf. Vermoedelijk had ik verwacht dat met mijn nieuwe hoofdlampje het lopen vanzelf zou gaan.

Leermomenten

Drie dingen gingen mis:

  • het niet vinden van punten (door te grote risico’s nemen op de verkeerde momenten),
  • minder optimale routekeuzes (door niet goed genoeg op de kaart te kijken), en
  • tijdverlies door stilstaan om op de kaart te kijken, deze te plooien, veters te strikken, hoofdlampje her aan te sluiten, en te zoeken waar ik ook alweer was op de kaart.

Wat doe ik er aan? Er zit wat tegenstrijdigs in. Enerzijds maak ik wat foutjes die toe te schrijven zijn aan het niet-de-tijd-nemen om goed op de kaart te kijken, om de juiste, snelste danwel veiligste, route te kiezen (en juist de afweging tussen die twee vergt goed kaart kijken). Anderzijds moet het sneller, minder tijd kaartlezen en harder lopen. Want Quickroute is onverbiddelijk: 25% van mijn tijd heb ik langzamer dan 15 min/km gelopen, geschuifeld of stil gestaan. Niet goed. En dat kwam niet doordat het af en toe behoorlijk glad was.

  • Stress is niet goed. Het gevoel dat ik door moet lopen, ook als ik even niet weet waar heen, moet onderdrukt worden! Beter dan stilstaan? Niet die keer dat ik lijnrecht de verkeerde kant op van de post rende. Gelukkig maar 30 meter.
  • Kaartlezen tijdens het lopen, dat zou tijd schelen. Ik heb een GPS track van Ralph Kurt gezien. Die gaat maar door. Ooit vertelde hij me dat hij geoefend heeft door de krant te lezen tijdens het joggen. Moet ik ook maar eens gaan doen.
  • Terrein inschatten is een vak. Meer dan eens bleek “wit” bos door doorntakken en talloze jonge stammen onbegaanbaar, en was “groen” bos prima doorloopbaar op begane grond niveau. Dat had ik na een paar keer mijn neus stoten toch moeten weten. Gaat doorsteken vaker fout dan goed? Pak dan in het vervolg de paden. Meer dan 40% om is het zelden, en meestal 20% sneller. Als je voor dat tijdverlies wel de zekerheid hebt de post te vinden is het geen slechte deal.
  • Ik moet gedisciplineerder mijn kaart vasthouden. Niet steeds overpakken naar de andere hand, en mijn vinger, de punt van het kompas, de nul van mijn schaal, wat dan ook, op de juiste plek houden. Zodat ik direct, bij een blik op de kaart, zie waar ik ben. Misschien moet mijn schaaltje van het kompas, zodat die het zicht niet beperkt.
  • De Verkeerslichten Methode gebruiken om op het juiste moment vol gas te geven als het niet kritisch is om mijn positie op de kaart exact te volgen. En zorgvuldig te werk gaan als het lastig wordt. Ook al komt een gokje vaak wel goed, als het mis gaat kost het veel tijd.

Materiaal

En ik heb nog wat opmerkingen over mijn gebruikte materiaal. Dat overigens steeds meer wordt, in aantal. (Het begon zo mooi, mijn eerste OL vorig jaar, met alleen een kompas en wat kleren, en een zaklamp. Maar inmiddels heb ik een duimkompas, een GPS-horloge, een hartslagband, een hoofdlamp, een accu, een GPS-tracker, een passen-schaalverdeling, een headcam, scheenbeschermers, een postomschrijvinghoesje, en een fluitje. Wat een ballast!)

  • De schaalverdeling die ik op mijn kompas heb mijn geplakt, uitgemeten in passen ik gemiddeld terrein, zit in de weg. Ik merk dat ik af en toe mijn kaart van hand wissel omdat hij onder m’n kompas niet handig leest. Toch een andere schaal? Hij is ook wel weer handig. Hier moet ik maar weer eens mee experimenteren.
  • Hoofdlampje is top. Veel licht, dimmen is onzin, hoe meer licht hoe beter, en hij strooit  bovendien veel rest-licht in het rond, wat ideaal is om het pad pal voor je neus te zien, takken die je moet ontwijken over 0.2 s, en de kaart te lezen zonder jezelf te verblinden. Maar het is wel onhandig dat onderweg drie keer mijn stekkertje door een tak uit de accu werd getrokken, zodat ik plotsklaps in het stik-donker stond. Een knoop in het snoer, rondom de interconnectie, is de oplossing, maar niet elegant. Volgende keer snoer onder mijn shirt, of iets met tape of klittenband.
  • Die accu (4×18650 Li-ion = 4400 mAh) is een blok aan het been. Of aan het heuptasje. Dat alle kanten op slingert. Niet fijn. Nog een 2e generatie houder voor verzinnen. Heb ik mooi weer wat te doen.
  • De elastische hoofdband waaraan zowel mijn lampje als mijn camera hangen, ziet wat strak. Volgende keer koop ik 1 cm meer elastiek. Tja, met €0,40 naar de fourniturenzaak in de wijk fietsen is misschien wat optimistisch geweest.
  • Het is niet zo handig als je camera voortijdig uit gaat. Tape-je over de schakelaar? Of gewoon reageren als het piep-piep-ik-ga-uit toontje klinkt?

Headcam video

Ik had mijn Contour Roam weer meegenomen. Helaas ging hij 8 minuten voor de finish uit toen ik tegen een boom liep. Gevoeld, knop leek nog aan, maar dat bleek niet zo te zijn. Jammer. Ik ga nog kijken of een nacht-video bruikbaar is, of of ik RGmapVideo aan ga slingeren.

Een stukje camerawerk in het donker:

Bier

Erg leuk nog een biertje gedronken na afloop. Gezellige kerels van Hamok (bijna hebben ze een Hamok-softshell aangesmeerd -mooi spul, daar niet van, maar eerst maar eens een KOVZ kloffie aanschaffen-) en KOL die graag wilden dat ik met een te hoog promillage naar huis reed. En daar hoorde ik dat er van het O-handboek ook een papieren off-line versie bestaat. En dat sommige woorden in het Vlaams iets heel anders betekenen dan in het Nederlands 🙂

Attackpoint

De grote vraag is of ik genoeg discipline heb om na elk stukje hardlopen de gegevens in te voeren op Attackpoint, maar het is een mooi streven.

Ik kende de site al wel langer, maar werd geprikkeld door een mail van A3, gisteren:

Beste KOVZers,

Er wordt de laatste maanden door een redelijke groep lopers dankbaar gebruik gemaakt van de inspanningen van Peter. Of te wel, er wordt flink getraind. En dan hoor ik ook nog eens dat een steeds grotere groep KOVZers aan looptraining doet. Hartstikke goed natuurlijk, zo gaan de prestaties lekker vooruit.

Een volgende stap is het registreren van je trainingen, attackpoint (een online gratis trainingslogboek) is daar een goed hulpmiddel voor. Ik hoor een aantal mensen al denken ‘wat is daar nou het nut van’? Dat kan meer omvattend zijn dan je denkt, hieronder een paar van de vele voordelen:

  • Je kunt als je een b.v. blessure oploopt terug kijken wat je anders/meer hebt gedaan dan normaal. Dat geeft je een handvat voor de toekomst (rustiger opbouwen)
  • Je kunt als je uitstekend in vorm raakt terug kijken hoe je dat gefikst hebt en dat in een volgend seizoen nog eens over doen.
  • Het is soms voor jezelf een motivatie om toch te gaan trainen.
  • Het kan voor anderen een voorbeeld/stimulans/motivatie zijn om ook te trainen.
  • Je kunt reageren op een log van andere lopers en ze een hart onder de riem steken of je bewondering uitspreken.
  • Als je ook nog eens aanmeld bij de KOVZ en NOLB groep en kijkt wat en hoe anderen het doen is het ook nog eens saamhorigheids bevorderend, lekker voor onze vereniging.
  • en nog veel meer…………kijken dus.

Waar kun je je aanmelden? http://www.attackpoint.org Je kunt daar al je gegevens invoeren en vergeet niet om ook lid te worden van de KOVZ groep!! (een aantal KOVZers zijn al actief maar hebben zich nog niet bij onze groep aangemeld) Benieuwd wie zich al wel in de KOVZ groep hebben gemeld? Meld je snel aan, ook als je alleen af en toe een wedstrijdje loopt en alleen maar de KOVZ trainingen af en toe meeloopt.

O-groeten,
Adrie.

Twee maanden later: Inmiddels heb ik vrijwel alles wat ik sneller gelopen heb dan stapvoets, sinds oktober vorig jaar, in Attachpoint gezet. En ik houd het nog steeds bij. Het is inderdaad motiverend om weer een paar kilometers en uren te kunnen noteren. Alsof het lopen een 2e nut heeft, behalve dan een vluchtige vermoeiing en wat langer blijvende conditieverbetering. Alsof je een geocache logt, zo iets. Maar dan minder nutteloos.

Met andere woorden: ik ben verkocht.

Training VI: hoogtelijnen

(Het duurde even voordat ik deze post op mijn Blog plaatste, maar ik had eigenlijk andere plannen: RouteGadget kaarten maken en hier linken waarop iedereen zijn route kon intekenen).

RouteGadget

Eerst maar even daar over. Het idee was simpel: net als bij de Sylvester op de Boshoverheide, waarvoor ik een RouteGadget kaart op mijn site had gezet, zou ik dat ook voor de laatste training doen. Het resultaat is deze kaart waar iedereen die trainde zijn kaart op kan bekijken. Maar naast bekijken bedacht Peter dat het leuk was als iedereen ook zijn route in zou kunnen tekenen. En daar is RG ook voor gemaakt, eigenlijk. Maar intekenen en uploaden vanaf GPS lukt niet. Twee avonden mee gestoeid, maar niets werkt. Intekenen lukt wel, de route wordt ook opgeslagen, maar niet getoond.

En dat is nou het leuke van zo’n weblog: je hebt het gevoel dat er iemand over je schouder meekijkt. En dus doe je extra je best (wat je er ook vanaf ziet stralen bij de headcam filmpjes, natuurlijk -knipoog-). Ik kon het niet laten om, nadat ik voorgaande paragraaf had getypt, toch even te kijken wat er mis ging. En weldra had ik het gevonden. De gesimuleerde splits (ja, bij de training gebruiken we geen Emits, dus die files moest ik met Matlab genereren) werden niet goed ingelezen. Er stond wel wat, wat juist het verwarrende was, maar niet iets dat klopte. En nu werkt het wel! Dus jullie kunnen, 2 weken na dato, alsnog je route intekenen.

Hoogtelijnen

Dat was waar deze training over ging. Eerst gaf Peter uitleg over hoe je hoogtelijnen moet lezen. Het lijkt triviaal, maar dat is het niet. En juist omdat Peter zelf kaartenmaker is, wist hij heel goed uit te leggen hoe het terrein er door het oog van een tekenaar uitziet, wat natuurlijk ook is hoe het vervolgens op papier komt te staan.

Opmerkelijk is dat, in relatief vlak terrein als Nederland, de hoogtelijnen vooral overeenkomen met de zichtbare reliefvormen. Ze geven dus niet noodzakelijk 15, 16, 17, meter boven N.A.P. aan, om maar wat te noemen als het hoogtelijneninterval 1 meter is, maar de vorm van wat je 1 meter boven het maaiveld uit ziet steken als je in het landschap staat. Of 2 meter er boven, etc. Goed om te weten. Wat je op de kaart ziet staat er zo omdat de kaartenmaker dat op het ook ook zo zag.

In de echte bergen zal dat natuurlijk anders zijn, daar spelen de hoogtelijnen een hele andere rol, en zijn de hoogteverschillen veel nadrukkelijker aanwezig.

Oro-hydro kaart

Geheel in het verlengde daarvan waren ook de kaarten waar we deze training op liepen (voor een aantal lopers) aangepast. Dat waren zogenaamde oro-hydro kaarten, kaarten met alleen hoogtelijnen en water. En de route langs de posten natuurlijk. Zeg maar een kaart waarbij alleen de bruine, blauwe, en magenta inkt niet op was. Je krijgt dan zo iets:

En ik moet zeggen dat me dat helemaal niet tegen viel. Juist omdat je niet wordt afgeleid door bos en pad en hei, maar alleen naar de vorm van de ondergrond kijkt, wordt het best overzichtelijk. Natuurlijk waren de posten er ook wel een beetje naar geplaatst, zodat je niet midden in een vlak terrein moest zoeken naar kenmerken die niet op de kaart stonden, maar toch had ik het lastiger verwacht. Daar kwam nog bij dat het behoorlijk besneeuwd was. Wat het bovendien wel extra mooi maakte.

Het hydro-aspect van de kaart kwam wat minder naar voren, ook omdat de grond en alle watertjes stijf bevroren waren, en bedekt met sneeuw. Maar dat was misschien maar goed ook, want als je alleen hoogtelijnen op de kaart hebt kan je zo in zeven sloten tegelijk lopen.

Al kan je over zo’n hoogtelijn ook behoorlijk struikelen, zoals in het onderstaande filmpje: