Der bezug ist der Thread
https://www.sps-forum.de/programmie...kabelwicklung-auf-kabeltrommel-berechnen.html
Wenn du eine Trommel abwickelst, dann ergibts das eine nicht stetige Funktion der Länge des Kabels, die auch noch iteriert werden muss. Jede Lage produziert eine Gerade, die mit den inneren Lagen flacher wird. An den Übergängen von Lage zu Lage, ist die Funktion nicht differenzierbar. Ich brauche nämlich, die Länge in Abhängigkeit vom Enkoderzähler, der auch als Winkel interpretiert werden kann und dann die Länge des Kabels und dessen Geschwindigkeit in m/s und das für eine Trommel, die abgewickelt werden soll.
Länge(Enkoder)
Damit könnte man vor und zurückrechnen, wenn die Funktion differenzierbar wäre. Das ist wichtig, um z.B. die Geschwindigkeit des Kabels zu ermitteln. Eine nichtstetige Funktion führt zu Jitter. Da wurde die Idee geboren, eine Aproximation zu nehmen. Die Entscheidung für ein Polynom fiel, weil der Thread für die Anzahl der Lagen in Abhängigkeit von der Kabellänge ergab, dass dort max. quadratische Funktionen zu finden sind.
Aproximation:
Code:
Länge(x) = a + bx + cx^2
X entspricht dem Enkoderzähler
Bisher hatte ich nur eine Lösung für die Anzahl der Lagen. Also habe ich eine Python-Funktion geschrieben, die mir die Iteration macht, denn eine analytische Lösung hab ich nicht gefunden. Python zusammen mit Numpy ist Matlab-ähnlich. Dh. alles wird in Listen verwaltet. Beispiel:
Code:
x = [0 1 2 3 ] # X Werte
y = [t*t for t in x] # entspricht dem quadrat von x [0 1 4 9]
plot(x,y)
In meinem Falle habe ich dann die Funktion des Aufrollens eines Kabels iteriert. Abrollen ist nicht so einfach. Das gibt dann 2 Listen mit x und y-Achse
x=[0 1 2 3 4 .... Enkoderendwert]
y = [0 3.14 6.28 .... usw.]
Die Y-Wert sind noch vom aufrollen, müssen also umgedreht (gespiegelt) werden und dann in Relation zum Kabelende gesetzt werden. Daher das Kabelende vom Aufrollen soll 0 beim Abrollen sein.
y = [Kabellänge - t for t in y[::-1]]
Mit y[::1] bekomme ich die gespiegelte Liste.
Das ganze geplottet mit plot(x,y) ergibt dann eine Kurve aus vielen Geraden, die an die Wurzelfunktion erinnert. Damit hatte ich x und y für die Polyfit-Funktion von Numpy, die mir eine Liste (was sonst?) mit Polynomkoeffizenten numerisch errechnet
Code:
koeffizienten = polyfit(x,y,2) # 2. Ordnung.
Z.B.
[-1, 2, 0] was [c, b, a] entspricht für das Polynom a+bx+cx^2
Du kannst auch eine höhere Ordnung probieren, aber die Koeffizienten sind dann wesentlich kleiner als 1E-3. Das Polynom kann man dann gleich ausprobieren mit
Code:
y2 = poly1d(x,koeffizienten)
plot(x,y2)
Die Fehlerfunktion wird einfach mit
Code:
error = sqrt(((y2-y))/y)**2)*100.
plot(x,error)
geplottet.
Jetzt hatte ich den Fehler und die numerische Lösung, die mit einem max Fehler am Ende <0.1% sehr genau ist.
Wenn man jetzt die Winchparameter einzeln modifiziert, hat dass Konsequenzen für die Koeffizienten. a ist 0, weil Länge(0) = 0 ist.
Wenn ich die Breite der Trommel um den Faktor 2 modifiziere, dann wird c um den Faktor 1 / 4 kleiner. Beipiel:
Code:
faktoren = koeffizienten_vor_modifikation / koeffizienten_nach_modifikation
Daher
c ~1 / b^2
Das mache ich so mit allen Parametern und multipliziere die dann nur noch.
Beim Koeffizienten b hab ich das einfacher gemacht, weil ich dort, den
Code:
b = max_Durchmesser*pi*enkoder/enkoderauflöung
als Geschwindigkeit interpretiert habe. Dieser Koeffizient, war leider mal zu hoch, mal zu niedrig, so dass der Fehler bis auf 3% stieg. Es gab in der Gleichung für b eine Subtraktion, die ich dann leicht modifiziert habe.
Als Resultat bin ich nun in der Lage mit m/s zu rechnen, ohne dass ich Jitter zusätzlich einbringe. Ich kann vom Enkoderzähler auf die Länge schliesse und umgekehrt.