Parameter | Kursinformationen |
---|---|
Veranstaltung: | @config.lecture |
Semester | @config.semester |
Hochschule: | Technische Universität Freiberg |
Inhalte: | Anwendungen der Datenerhebung und Analyse |
Link auf Repository: | https://github.com/TUBAF-IfI-LiaScript/VL_EAVD/blob/master/12_Anwendungen.md |
Autoren | @author |
Organisatorisches
Konsultationsangebote der Tutoren und Mitarbeiter ()
- Mittwoch, 8.02.2023, 17:45 (Rammler Bau)
- weitere Termine nach Abstimmung in den Übungsgruppen sowie im Übungsordner im Git
Fragen an die heutige Veranstaltung ...
- In welche strukturellen Einheiten lässt sich die Verarbeitungskette ?
Mit Blick auf die Sensoren haben wir darüber gesprochen, dass die Distanzmessung von Ultraschallsensoren von der Temperatur abhängt.
Wir wollen dies mit einer sehr einfachen Messkampange bestätigen. Dazu wurde ein HC-SR04 Ultraschallsensor in einem ungeheizten Gebäude auf eine Wand gerichtet. Die Distanz zur Wand betrug
Der Messaufbau wurde über 3 Wochen im Januar 2023 betrieben. Die gesammelten Daten wurden über ein WLAN-Kommunikation mit der Webseite https://thingspeak.com/ abgelegt. Der zugehörige Code findet sich im Projektrepository.
Über den Export von Thinkspeak wurde das gesamten Datenset als CSV-Datei exportiert.
created_at,entry_id,field1,field2,field3,latitude,longitude,elevation,status
2023-01-06T16:44:16+00:00,1,12.600000,69.699997,8512.000000,,,,
2023-01-06T16:44:36+00:00,2,12.600000,69.800003,8610.000000,,,,
2023-01-06T16:44:57+00:00,3,12.400000,69.800003,8365.000000,,,,
2023-01-06T16:45:17+00:00,4,12.400000,70.000000,8536.000000,,,,
Folgende Adaptionen waren notwendig:
- Wie im Programmcode sichtbar, wurde alle 20s eine Messung erhoben. Diese zeitliche Auflösung ist für die weitere Verwendung (die Daten werden bei jedem Start der Analysen von Github geladen) zu hoch.
- Die Spaltenköpfe treffen keine Aussage zu zur Bedeutung der Messwerte - hier sollten aussagekräftige Spaltenbezeichner verwendet werden.
Für die Realisierung wurde in Python-Skript verwendet
import pandas as pd
df=pd.read_csv("distanceMeasurements.csv", sep=',', header = 0)
# Löschen der irrelevanten Spalten aus dem Datensatz
df.drop(['entry_id', 'latitude', 'longitude', 'elevation', 'status'], axis=1, inplace=True)
# Entfernen aller Messungen mit geradem Index
df_filtered = df[df.reset_index().index % 2 != 0].copy()
df_filtered.head(5)
df_filtered.reset_index(drop=True, inplace = True)
# Umbenennen der Spaltennamen
df_filtered.rename(columns = {'field1':'Temperature',
'field2':'Humidity',
'field3':'US_duration'}, inplace = True)
df_filtered.head(5)
# Speichern als neue csv Datei
df_filtered.to_csv("distanceMeasurements_filtered.csv", index= False)
{{0-1}}
Fragekomplex 1: Welche Temperaturentwicklung konnte beobachtet werden?
import pandas as pd
import matplotlib.pyplot as plt
url="https://raw.githubusercontent.com/TUBAF-IfI-LiaScript/"+ \
"VL_ProzeduraleProgrammierung/master/examples/"+ \
"12_Anwendungen/US_experiment/Datenset/"+ \
"distanceMeasurements_filtered.csv"
df=pd.read_csv(url, sep=',', header = 0)
# Einfügen einer "echten" Zeitspalte
df['date'] = pd.to_datetime(df['created_at'])
print(df.head(3))
df.plot(x="date", y="Temperature")
#plt.show()
plt.savefig('foo.png') # notwendig für die Ausgabe in LiaScript
@LIA.eval(["main.py"]
, none
, python3 main.py
)
Welche Spitzenwerte in Bezug auf die Temperatur wurden erreicht? Zu welchen Zeitpunkten traten diese auf?
{{1-2}}
Fragekomplex 2: Welche Auswirkung hatte dies für die die Distanzmessung?
Die Schallgeschwindigkeit lässt sich nach der Gleichung
abschätzen. Dabei ist zu beachten, dass die Zeitmessung in
import pandas as pd
url="https://raw.githubusercontent.com/TUBAF-IfI-LiaScript/"+ \
"VL_ProzeduraleProgrammierung/master/examples/"+ \
"12_Anwendungen/US_experiment/Datenset/"+ \
"distanceMeasurements_filtered.csv"
df=pd.read_csv(url, sep=',', header = 0)
df["US_speed"] = (331.3 + (0.606 * df["Temperature"])) / 1000 / 1000 * 100
df["US_distance"] = df["US_duration"]*df["US_speed"] / 2
print(df.head(3))
#plt.show()
#plt.savefig('foo.png') # notwendig für die Ausgabe in LiaScript
@LIA.eval(["main.py"]
, none
, python3 main.py
)
Bewerten Sie die Messgenauigkeit des Sensors.
Ein Blick zurück in den Oktober ... mit welchen Zielen/ Motivation waren wir gestartet:
Vorlesung I - 16.10.2023
Anwendungssicht
Wir möchten Sie in die Lage versetzen einfache Messaufgaben (mit einem Mikrocontroller) zu realisieren und die Daten auszuwerten.
Algorithmische Perspektive
Wir möchten Sie dazu ertüchtigen den Algorithmusbegriff der Informatik zu durchdringen und anwenden zu können.
Konzeptionelle Perspektive
Sie erlernen grundlegende Elemente der prozeduralen und der objektorientierten Programmierung.
Umsetzungssicht
Wir vermitteln Grundkenntnisse in den Programmiersprachen C++ und Python.
Bislang programmieren wir unsere Anwendungen in einem klassischen Format. Wir schreiben den Code in eine Datei und führen diesen mit einem Mausklick in der Entwicklungsumgebung oder einem Aufruf im Terminal aus.
Insbesondere im Bereich der Datenverarbeitung und der künstlichen Intelligenz sind aber auch die Verwendung von Notebooks etabliert. Jupyter Notebook (früher IPython Notebooks) ist eine web-basierte interaktive Umgebung, mit der Jupyter-Notebook-Dokumente erstellt werden können. Dabei wird der Code in Blöcken aufgeteilt - die unabhänig von einander ausgeführt werden können. Ergänzt werden diese durch Kommentarblöcke, die wiederum in Markdown geschrieben werden können.
Achtung: Notebooks erlauben einen schnellen Einstieg in die Arbeit und eine gute Kommentierung der Codeblöcke, sind aber aus dem Blick des Entwicklungsprozesses kritisch zu sehen:
- Ausgabe und Code verschmelzen in einem Dokument. Dies macht die Nachvollziehbarkeit von Änderungen am Code aufwändig.
- Die beliebige Reihung der Ausführung während der Entwicklung führt dazu, dass Notebooks häufig nicht intuitiv von oben nach unten ausführbar sind.
- Notebooks selbst eignen sich nicht, um Code zu modularisieren.
Was konnten / wollten wir dabei nicht leisten:
- Der Softwareentwicklungsprozess ist völlig unberücksichtigt geblieben.
- Sie haben die Programmiersprachen C++ und Python nur in den Grundkonzepten kennen gelernt.
- Die unterschiedlichen Programmiertechniken von C++ für Mikrocontroller und Desktop-Anwendungen wurden nicht berührt.
- ...
Wenn Sie Lust auf mehr "Software" haben, bietet die Veranstaltung Softwareentwicklung im kommenden Semester einen guten Ansatzpunkt!
Gehen Sie bitte von folgenden Aufgabentypen für die Klausur aus:
- Korrektur eines Programmes: Finden Sie Fehler im nachfolgenden Codebeispiel ...
- Entwerfen eines Programmes / Ergänzen von Methoden: Erweitern Sie den Code um eine Methode XY ...
- Analyse eines Programmes: Welchen Wert gibt das Programm mit dem Erreichen der Zeile N aus?
- Konzeptionelle Fragen: Nennen Sie drei Ganzzahldatentypen in C++.
Für die Auswertung der Messergebnisse wird eine Funktion benötigt, die den größten Wert und seine Position in einem Array ermittelt. Es kann dabei davon ausgegangen werden, dass der Wert im Array nur einmal vorkommt. Die vorliegende Implementierung der Funktion sowie die dazugehörige main-Funktion enthalten syntaktische und logische Fehler, die es zu korrigieren gilt: Schreiben Sie das korrigierte Programm auf.
#include <iostream>
int maximum(double values,double& max_value)
{
for (i=0;i<anz;i++)
{
&max_value=values[0];
if (values[i]<max_value)
{
value[i]=&max_value;
i=pos;
}
}
return pos;
}
int main(void)
{
double werte[100];max;
int I;
for (i=0;i<100,i++) cin<<werte[i];
std::cout<<"Position: <<maximum(werte,100,max)>>"\n";
std::cout<<"Maximum: ",<<max
return 0;
}
@LIA.eval(["main.cpp"]
, g++ -Wall main.cpp -o a.out
, ./a.out
)
Machen Sie sich bewusst, dass Sie in der Klausur keine Möglichkeit haben, den Compiler "zu befragen". Üben Sie daher das lesen von Code. Tauschen Sie dazu Programme aus den Übungen untereinander aus und evaluieren Sie diesen.
Die Klasse Akte enthält als Datenfelder die Angaben zum Aktenzeichen und der Laufzeit:
class Akte
{
private:
std::string aktenzeichen;
int laufzeit;
};
@LIA.eval(["main.cpp"]
, g++ -Wall main.cpp -o a.out
, ./a.out
)
Eine weitere von der Klasse Akte
abgeleitete Klasse AkteX
soll neben den bereits in der Klasse Akte
enthaltenen Angaben einen Aktencode (eine dreistellige ganze Zahl) enthalten.
Definieren Sie die Klasse AkteX
und vervollständigen Sie die Klasse Akte
um die Member, die folgende Anweisungen in der main-Funktion ermöglichen würden:
int main() {
Akte akte1("08-15",2),
akte2;
std::cout << "Voraussichtliche Laufzeit: "<<akte1.getLaufzeit()<<"\n";
akte1.setLaufzeit(4);
akte2.ausgabe();
AkteX aktex("08-16",99,816);
aktex.ausgabe();
std::cout <<aktex.getAktencode()<<"\n";
}
- Die Funktion
ausgabe()
beider Klassen soll alle in einem Objekt gespeicherten Angaben auf dem Standard-Output ausgeben. - In der Klasse
AkteX
sollen allerdings sowohl die Funktionausgabe
als auch die FunktiongetAktencode
statt des gespeicherten Wertes dessen Quersumme ausgeben bzw. liefern. - Hinweis: bei den Objekten der Klasse
sdt:string
ist (anders als beichar[]
) die Zuweisung mit=Operator
möglich.
-
Markieren Sie alle Ganzzahldatentypen in folgender Aufstellung.
- [( )] std:string
- [(X)] short
- [( )] float
- [( )] bool
-
Welchen Inhalt gibt das folgenden Codefragment aus?
char text [] = "Dieser lange Text ergibt keinen Sinn"; for (int i=0;i<4;i=i+2) std::cout<<text[i]; std::cout<<text[5];
[[Der]]
-
Schreiben Sie den Code in 2) als Python code.
text = "Dieser lange Text ergibt keinen Sinn"
@LIA.eval(
["main.py"]
,none
,python3 main.py
) -
Welches Konzept nutzt C++ um die Member einer Klasse vor dem Zugriff aus der anderen Klassen zu schützen.
[[Kapselung]]
-
Mit Hilfe welcher Methoden werden C++-Objekte erstellt?
- [( )] Destruktoren
- [(X)] Konstruktoren
- [( )] private Methoden
- [( )]
new
Vielen Dank für Ihre Beteiligung während der Übungen und der Vorlesungen und toi toi toi für die anstehenden!