Quellcode für hilfsfunktionen

"""Dieses Modul beinhalten unterschiedliche Hilfsfunktionen, wie z.B. 
Stringmanipulationen, Einheitenumrechnungen sowie Berechnungen von 
Korrekturwerten.

"""

import calendar
import time
import numpy as np


[Doku]def status_extrahieren(controller_antwort): """Splittet den Antwortstring des CNC-Controllers auf und speichert die Bestandteile in eine Liste. Args: controller_antwort (str): Antwortstring der CNC-Steuerungsplatine. Returns: str: Gibt den Gerätestatus zurück z.B. 'Idle', 'Run', 'Alarm'... """ # Antwort dekodieren controller_antwort = controller_antwort.decode() # Zerlegen und in Liste Speichern antwort_liste = controller_antwort.split('|') antwort_liste[0] = antwort_liste[0].lstrip('<') geraete_status = antwort_liste[0] # Gesplittete Antwort zurück geben return geraete_status
[Doku]def koordinaten_extrahieren(antwort): """Splittet den Antwortstring des CNC-Controllers auf, extrahiert Maschinenposition und berechnet daraus die Absolutposition des Roboters. Args: antwort (str): Antwortstring der Steuerungsplatine. Returns: list: Gibt absolute Koordinaten in der Form [x, y, z] *(str)* zurück. """ # Absolutkoordinaten inirialsisieren absolute_koordinaten = [0.000, 0.000, 0.000] # Maschinenposition initialisieren mpos = [0.000, 0.000, 0.000] # Working Coordinates Offset (lt. EEPROM des Controllers) wco = [-199.000, -1.000, -1.000] # Antwort dekodieren antwort = antwort.decode() antwort_liste = antwort.split('|') i = 0 if len(antwort_liste) == 0: print("Keine gültige Antwortliste erhalten!") else: # In der Liste nach Maschinenposition suchen while i <= len(antwort_liste) - 1: try: if antwort_liste[i].find("MPos:") == 0: antwort_liste[i] = antwort_liste[i].lstrip('<') antwort_liste[i] = antwort_liste[i].lstrip('MPos:') mpos = antwort_liste[i].split(',') mpos[0] = float(mpos[0]) mpos[1] = float(mpos[1]) mpos[2] = float(mpos[2]) i = i + 1 except: print("Ungültige Koordinaten empfangen!") # Berechnung der Absolutkoordinaten (mpos-wco) j = 0 while j < 3: if len(mpos) == 3: try: absolute_koordinaten[j] = mpos[j] - wco[j] absolute_koordinaten[j] = "{:.2f}".format( absolute_koordinaten[j]) j += 1 except: print("Fehler bei der Berechnung der Koordinaten!") else: print("Koordinaten Liste zu kurz!") break return absolute_koordinaten
[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