Die Variante, die Daten über ein Videobild zu legen, ist ähnlich, wie mit Kanonen auf Spatzen zu schießen. Das sieht zwar schön aus, aber ist sehr viel Aufwand. Oft reicht es auch aus, die Daten in Diagrammen darzustellen.
Im Folgenden möchte ich zeigen, wie man Daten aus einer Datei in anschauliche Diagramme verpackt und automatisiert abspeichert.
Datenaufzeichnung
Die Daten sind aus der gleichen Quelle, wie im Artikel “Datenvisualisierung mit Matlab”.
Matlab Script zum Erstellen von Diagrammen aus Excel Datei
Das Script ließt Werte aus einer Excel Datei, erstellt verschiedene Diagramme und speichert diese in Druckqualität als .PNG Datei ab. Die Bearbeitung dauert ca. 10s, je nach CPU. Das zeigt, wie überlegen Mathworks Matlab im Vergleich zu Tabellenkalkulationsprogrammen wie Excel ist, wenn es um die Auswertung von Messdaten geht.
1. Excel Datei öffnen und Variablen in Workspace legen
clear all, close all, clc
%% open data file
[filename,path] = uigetfile('*.xls', 'Load XLS File');
if (isequal(filename, 0))
return; % cancel
end
data = xlsread(fullfile(path,filename));
%% Variablen Fahrdynamik
t = data(:,1); %Zeit in s
v = data(:,2); %Geschwindigkeit in km/h
ay = data(:,3); %Querbeschleunigung in g
ax = data(:,4); %Längsbeschleunigung in g
yaw = data(:,5); %Fahrtrichtung in Grad
vv = data(:,6); %Vertical Speed in km/h
nu = data(:,7); %Anzahl Satelitten
B = data(:,8); %Breitengrad in min
L = data(:,9); %Längengrad in min
s = data(:,10);%Weg in m
R = data(:,12);%Kurvenradius in m
dt = diff(t);
dt = dt(1); %Abtastzeit der Daten
%% Filtern um Hochfrequenten Anteil weg zu bekommen
ayf = filter(ones(1,10)/10,1,ay);
yawf = filter(ones(1,10)/10,1,yaw);
%% Rundenzeiten aus Messschrieb
lap0 = 150; %Einführungsrunde
lap1 = lap0 + 136.1;
lap2 = lap1 + 135.8;
lap3 = lap2 + 133.1;
lap4 = lap3 + 134.5;
lap5 = lap4 + 133.9;
% Runde definieren
start = find(t>lap1,1,'first');
stop = find(t>lap2,1,'first');
% Rundenzeiten berechnen für Diagramme
rundenzeit = t(stop)-t(start);
min = fix(rundenzeit/60);
sek = rundenzeit - min*60;
rundenzeit = [num2str(min) ':' num2str(sek)];
2. Diagramm Querbeschleunigung über Zeit
%% Querbeschleunigung
figure(1)
line(t(start:stop),ayf(start:stop).*9.81,'Color','red','LineWidth',3)
grid on
xlim([t(start) t(stop)])
ylim([-15 15])
title(['Eurospeedway BMW M3 HotLap: ' rundenzeit])
xlabel('Zeit [s]')
ylabel('Querbeschleunigung [m/s²]')
print(gcf,'-dpng','-r300','Querbeschleunigung-Zeit.png')
3. Diagramm Querbeschleunigung über Strecke
%% Querbeschleunigung über Strecke
figure(2)
aymaxindex = find(ayf(start:stop)>1.2)+start;
% Beschleunigungssignal einfügen
for i=start:1:stop
ll = -ayf(i)./30; % Skalierung
dL = L(i+5)-L(i);
dB = B(i+5)-B(i);
ld = atan2(dL,dB); % Richtungswinkel bestimmen
ld = ld+pi/2; % Senkrechte dazu
%farbe = abs(ayf(i))/max(ayf); %normieren auf max g
line([B(i) (B(i)+ll*cos(ld))],[L(i) (L(i)+ll*sin(ld))],...
'color',[1 0 0],'LineWidth',5)
end
aymaxindex = find(ayf(start:stop)>1.2)+start;
for i=start:1:stop % nochmal Maxima einfügen
if (i==4289)||(i==4460)||(i==4657)||(i==5170)||(i==5359) %dort sind hohe ay
text('Position',[B(i) L(i)-0.05],'HorizontalAlignment','center',...
'String',{'\uparrow'; [num2str(round(9.81*ayf(i)*100)/100) 'm/s²']})
end
end
%Kurs überlagern
line(B(start:stop),L(start:stop),'LineWidth',4,'color','black')
axis off
title(['Eurospeedway BMW M3 HotLap: ' rundenzeit])
legend('Querbeschleunigung','location','Southoutside')
print(gcf,'-dpng','-r300','Querbeschleunigung-Strecke.png')
4. Diagramm Geschwindigkeit über Zeit
%% Geschwindigkeit
figure(3)
line(t(start:stop),v(start:stop),'LineWidth',2)
grid on
xlim([t(start) t(stop)])
ylim([0 200])
title(['Eurospeedway BMW M3 HotLap: ' rundenzeit])
xlabel('Zeit [s]')
ylabel('Geschwindigkeit [km/h]')
print(gcf,'-dpng','-r300','Geschwindigkeit-Zeit.png')
5. Diagramm Geschwindigkeit über Strecke
%% Geschwindigkeit über Strecke
figure(4)
% Geschwindigkeitssignal einfügen
for i=start:1:stop
ll = -v(i)./3000; % Skalierung
dL = L(i+5)-L(i);
dB = B(i+5)-B(i);
ld = atan2(dL,dB); % Richtungswinkel bestimmen
ld = ld+pi/2; % Senkrechte dazu
%farbe = abs(ayf(i))/max(ayf); %normieren auf max g
line([B(i) (B(i)+ll*cos(ld))],[L(i) (L(i)+ll*sin(ld))],...
'color',[0 0 1],'LineWidth',5)
end
%Kurs überlagern
line(B(start:stop),L(start:stop),'LineWidth',4,'color','black')
axis off
title(['Eurospeedway BMW M3 HotLap: ' rundenzeit])
legend('Geschwindigkeit','location','Southoutside')
print(gcf,'-dpng','-r300','Geschwindigkeit-Strecke.png')
6. Diagramm Geschwindigkeit über Strecke in 3D
%% Geschwindigkeit über Strecke 3D
figure(5);
h=stem3(B(start:2:stop),L(start:2:stop),v(start:2:stop),...
'fill','MarkerSize',2,'MarkerFaceColor',[0 0 1],'Color',[.8 .8 .8]);
hold on
view(143,60)
%Kurs überlagern
line(B(start:10:stop),L(start:10:stop),'LineWidth',4,'color','black')
title(['Eurospeedway BMW M3 HotLap: ' rundenzeit])
legend('Geschwindigkeit','location','Southoutside')
set(gca,'XTicklabel',[],'YTicklabel',[]);
grid on
box off
print(gcf,'-dpng','-r300','Geschwindigkeit-Strecke-3D.png')
close all;
Animation
Wenn man den view Befehl noch etwas variiert, kann man das Diagramm auch noch animieren:


