"""Dieses Modul beinhalten unterschiedliche Hilfsfunktionen, wie z.B.
Stringmanipulationen, Einheitenumrechnungen sowie Berechnungen von
Korrekturwerten.
"""
import calendar
import time
import numpy as np
[Doku]def drehzahlkorrektur(gewuenschte_drehzahl, steigung, offset):
"""Berechnet die an den CNC-Controller zu sendende Drehzahl über die lineare
Regression.
Args:
gewuenschte_drehzahl (int): Drehzahl in 1/min die der Drehteller
erreichen soll.
steigung (float): Steigung der interpolierten Geradengleichung.
offset (float): Offset der interpolierten Geradengleichung.
Returns:
float: Gibt die korrigierte Drehzahl in 1/min zurück.
"""
einzustellende_drehzahl = (
gewuenschte_drehzahl - float(offset)) / float(steigung)
return einzustellende_drehzahl
[Doku]def winkel_zu_pulsweite(winkel, us_pro_grad):
"""Rechnet den gewünschten Einstellwinkel des Servos in die Pulsweite des
PWM-Signales um.
Args:
winkel (float): Einzustellender Winkel in Grad.
us_pro_grad (float): Umrechnungsfaktor
Returns:
float: Gibt die Pulsweite in :math:`{\\mu s}` zurück.
"""
# Ein Winkel von 0° entspricht einer Pulsweite von 1530us, 10us Differenz
# entsprechen ca. 1°
pulsweite = 1530 + (winkel * us_pro_grad)
return pulsweite
[Doku]def winkel_korrektur(winkel):
"""Berechnet die relativen Korrekturkoordinaten, wenn der Winkel des
Reinigungskopfes vom Standard (22.7°) abweicht.
Note:
Das Ergebnis wird zum Reinigunsstartpunkt als Offset dazu addiert.
Args:
winkel (float): Verstellwinkel des Reinigungskopfes in Grad.
Returns:
tuple: Gibt ein Tupel *(float, float)* mit X- und Z-Korrekturwert zurück.
"""
# Konstanten aus CAD-Zeichnung
radius = 66.6
alpha = 22.7
# Berechnung
x_0 = radius * np.cos(np.deg2rad(alpha))
z_0 = radius * np.sin(np.deg2rad(alpha))
x_neu = radius * np.cos(np.deg2rad(alpha + winkel))
z_neu = radius * np.sin(np.deg2rad(alpha + winkel))
v_0 = complex(x_0, z_0)
v_neu = complex(x_neu, z_neu)
v_korrektur = v_0 - v_neu
x_korrektur = np.real(v_korrektur)
z_korrektur = np.imag(v_korrektur)
return x_korrektur, z_korrektur
[Doku]def aus_datei_einlesen(pfad):
"""Liest Konfigurations- und Profildateien ein, entfernt die Kommentare
welche mit '#' gekennzeichnet sind und speichert Attribut sowie Wert in
einer separaten Liste ab.
Jede Zeile der Datei muss folgende Form ausweisen: ``attribut:wert``
Args:
pfad (str): Pfad zum einzulesenden Profil bzw. zu den
Grundeinstellungen.
Returns:
tuple: Gibt ein Tupel *(list, list)* mit Attributen und Werten zurück.
"""
graph_data = open(pfad, 'r').read()
attribut = []
wert = []
zeilen = graph_data.split('\n')
# Kommentarte herausfiltern und Attribute und Werte in Liste speichern
for zeile in zeilen:
if len(zeile) > 1 and zeile.find('#') < 0:
a, b = zeile.split(':')
attribut.append(a)
wert.append(b)
return attribut, wert
[Doku]def zeitstempel():
"""
Erstellt einen aktuellen Zeitstempel (GMT), welcher an den Dateinamen der zu
speichernden Profildatei angehängt wird, damit keine Profildatei
überspeichert wird.
Beispiel für eine Ausgabe: ``1671810993``
Returns:
str: Aktueller Zeitstempel als Unixtime.
"""
# Aktuelle GMT Zeit im a Tupleformat auslesen
aktuelle_GMT = time.gmtime()
# Zeitstempel generieren
zeitstempel = calendar.timegm(aktuelle_GMT)
return zeitstempel
[Doku]def radius_berechnen(p1, p2, p3):
"""Berechnet den Radius eines Kreisbogens anhand von drei gegebenen Punkten
im Format [X, Z].
Note:
Quellcode in Anlehnung an
https://stackoverflow.com/questions/28910718/give-3-points-and-a-plot-circle
zuletzt besucht am 11.01.2022. Authoren: Glorfindel, DieterDP
Args:
p1 (list): Erster Punkt des Kreisbogens.
p2 (list): Zweiter Punkt des Kreisbogens.
p3 (list): Dritter Punkt des Kreisbogens.
Returns:
float: Gibt den Radius (float) des Kreisbogens zurück.
"""
temp = p2[0] * p2[0] + p2[1] * p2[1]
bc = (p1[0] * p1[0] + p1[1] * p1[1] - temp) / 2
cd = (temp - p3[0] * p3[0] - p3[1] * p3[1]) / 2
det = (p1[0] - p2[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p2[1])
if abs(det) < 1.0e-6:
return (None, np.inf)
# Zentrum des Kreises
cx = (bc * (p2[1] - p3[1]) - cd * (p1[1] - p2[1])) / det
cy = ((p1[0] - p2[0]) * cd - (p2[0] - p3[0]) * bc) / det
# Radiusberechnung
radius = np.sqrt((cx - p1[0])**2 + (cy - p1[1])**2)
return radius