Wie kompiliert man MicroPython vom Quellcode selbst?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Ja logisch, und anstatt die K-Werte zu ändern bin ich von Microsekunden auf Millisekunden zurück. Ich dachte, dass das vielleicht zu schnell war und ich deswegen Probleme hatte. Naja die "dummen" Fehler bleiben auf jeden Fall auch in Erinnerung.

Ja das ist geschickt, ich möchte ja die maximale Beschleunigung ausnutzen. Dann teste ich das auch mal.

Allerdings sind die Tests gerade alle immer noch ohne Last, da die Maschine noch nicht gebaut ist. Mein letzter Stand ist, dass die Zeichnungen raus sind, also etwas Zeit habe ich noch. Ich hoffe wenn ich die Einstellungen ohne Last hinbekomme, habe ich schon etwas Hintergrundwissen und Gefühl dafür und brauche später dann vielleicht nicht mehr ganz sooooooo lange.

Ich bin auch gespannt.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Ich muss leider ganz kurz das Thema wechseln, weil sonst bekomme ich das Programm, das mir meine Daten auswertet, bis morgen nicht hin.

Die Webseite erstellt der ESP in einer Funktion so:

Code: Alles auswählen

return """<html>{} {} {}</html>""".format(x, y, z)
x, y, z sind im richtigen Code die Listen. Habe das hier nur zu Versuchszwecken nachgebaut.

Ich habe eigentlich noch nie Daten aus einer Webseite ausgelesen und teste mich gerade durch. Wenn ich versuche:

Code: Alles auswählen

import requests

print(requests.get('http://192.168.4.1').text)
auszuführen, dann erhalte ich folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
    response.begin()
  File "/usr/lib/python3.9/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.9/http/client.py", line 289, in _read_status
    raise BadStatusLine(line)
http.client.BadStatusLine: <html>[1, 2, 3] [4, 5, 6] [8, 9, 10]</html>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 532, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3/dist-packages/six.py", line 718, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
    response.begin()
  File "/usr/lib/python3.9/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.9/http/client.py", line 289, in _read_status
    raise BadStatusLine(line)
urllib3.exceptions.ProtocolError: ('Connection aborted.', BadStatusLine('<html>[1, 2, 3] [4, 5, 6] [8, 9, 10]</html>'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/dennis/Dokumente/test.py", line 3, in <module>
    print(requests.get('http://192.168.4.1').text)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('<html>[1, 2, 3] [4, 5, 6] [8, 9, 10]</html>'))
Das erhalte ich auch, wenn ich es unter Windows probiere und wenn ich es mir 'urllib' versuche, erhalte ich auch den 'BadStatusLine'.

Da meint wohl jemand, dass die Webseit-Daten keinen Sinn ergeben und deswegen der Fehler kommt. Ich habe dann auch schon gelesen, das es an 'http' liegen könnte.
Wie müsste ich die Webseite denn aufbauen, damit die für 'requests' Sinn macht.
Ich habe eine Vorlage gefunden und die Seite danach erstellt:

Code: Alles auswählen

def web_page():
    return """ <html lang="de">
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Titel der Seite | Name der Website</title>
      </head>
      <body>
        <!-- Sichtbarer Dokumentinhalt im body -->
        <p>{} {} {}</p>
      </body>
    </html>""".format(x, y, z)
Dann kommt wieder der Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
    response.begin()
  File "/usr/lib/python3.9/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.9/http/client.py", line 289, in _read_status
    raise BadStatusLine(line)
http.client.BadStatusLine:  <html lang="de">


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 532, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3/dist-packages/six.py", line 718, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.9/http/client.py", line 1347, in getresponse
    response.begin()
  File "/usr/lib/python3.9/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.9/http/client.py", line 289, in _read_status
    raise BadStatusLine(line)
urllib3.exceptions.ProtocolError: ('Connection aborted.', BadStatusLine(' <html lang="de">\n'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/dennis/Dokumente/test.py", line 3, in <module>
    print(requests.get('http://192.168.4.1').text)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine(' <html lang="de">\n'))
Wie bekomme ich das in den Griff? Oder gibts eine ganz andere, einfachere Möglichkeit?

Vielen Dank und sorry, das ich von einem Problem zum nächsten springe.

Grüße
Dennis

Edit: Mal die Werte, die ich mit nach Hause genommen habe und manuell in Python eingetragen habe bekomme ich mit Kp = 0,003 und Ki = Kd = 0 folgendes Diagramm:
https://www.dropbox.com/s/k6f14urvgiacd ... t.png?dl=0

Wenn ich das so sehe, sollte ich die PWM-Werte vielleicht auch aufzeichnen, damit ich sehe wie der Regler eingreift.
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Und was sollen wir mit der einen Zeile Code anfangen? Du hast offensichtlich nicht das HTTP-Protokoll implementiert.
Es macht auch wenig Sinn, die Repräsentation von Listen als HTML auszuliefern, JSON wäre da wohl ein besseres Format.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für deine Antwort.
Ich wollte den Link des verwendeten Tutorials ja noch einfügen. Sorry, das ging irgendwie unter:
https://randomnerdtutorials.com/micropy ... -point-ap/

Wer sich das nicht alles durchlesen will, der Code der auf der Seite zu finden ist sieht so aus:

Code: Alles auswählen

try:
  import usocket as socket
except:
  import socket

import network

import esp
esp.osdebug(None)

import gc
gc.collect()

ssid = 'MicroPython-AP'
password = '123456789'

ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid=ssid, password=password)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

def web_page():
  html = """<html><head><meta name="viewport" content="width=device-width, initial-scale=1"></head>
  <body><h1>Hello, World!</h1></body></html>"""
  return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(1024)
  print('Content = %s' % str(request))
  response = web_page()
  conn.send(response)
  conn.close()
Ein http Protokoll kann ich den dem Code nicht finden, ich mach mich mal schlau, danke.
Wie ich das mit JSON anstellen könnte, schaue ich auch mal nach.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

So mit dem Beispiel aus der MicroPython-Dokumentation hat es funktioniert.

In Sachen JSON bin ich noch nicht wirklich weiter gekommen. Soll ich die Listen in JSON umwandeln und dann in die HTML integrieren?
Wenn ich das mit 'json.dumps(liste)' mache, dann sehe ich gerade den Vorteil noch nicht.

Gerade habe ich eher den Nachteil, das wenn ich die Webseite mit BeautifulSoup auslese, ich einen String erhalten der so aussieht "[1, 2, 3] [4, 5, 6] [8, 9, 10]". Das jetzt wieder zurück in drei Listen wandeln, ist sicherlich nicht die Methode die man verwenden würde. Wenn ich allerdings die Liste in JSON wandle und dann die Webseite auslese, bekomme ich den selben String zurück.

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

def main():
    soup = BeautifulSoup(requests.get('http://192.168.4.1').text, 'html.parser')
    content = soup.p.text
    print(content)
    print(type(content))


if __name__ == '__main__':
    main()
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du brauchst kein HTML und ebensowenig BeautifulSoup. Es reicht JSON und die json-Methode von requests.get.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Ach das gibts ja gar nicht. Wie einfach das damit geht.
Jetzt habe ich von meiner letzten Antwort damit verbracht, den zurückgegebenen String in drei Listen zu formen, die dann auch Zahlentypen enthalten. Gerade wurde ich fertig, sehe deine Antwort, ein Blick in die Doku und keine 15 Minuten später habe ich alles was ich brauche.

Vielen Dank für den Tipp, das machts mir hier alles wesentlich einfacher und übersichtlicher.

So dann werde ich mich das nächste mal, nun aber wirklich mit Diagrammen wieder melden. 👍


Grüße und gute Nacht
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

einen Teil des Sonntags konnte ich für das Projekt nutzen.
Beschleunigung positiv und negativ = 90
Konstante Fahrt = 180
Geschwindigkeit = 0,1

Ich bin wieder auf 'ticks_us' gewechselt, allerdings musste ich die Zeit, die ich zum Berechnen der Soll-Werte übergeben muss durch 1000 teilen. Ansonsten habe ich einen Konstanten Soll-Wert von 360 als Ausgabe erhalten.

Damit sich das nicht ewig aufschauckelt und ich wieder ein Problem mit dem Speicher bekomme, habe ich eine Abschaltbedingung eingebaut. Wenn 370° erreicht wurden, wird die Schleife verlassen und der Motor abgeschaltet.
Ich muss mal schauen, ob man die Diagramme nicht etwas detaillierter hinbekommt, aber die Abweichungen von Soll und Ist lassen sich schon mal gut erkennen und teilweise auch die Veränderungen der Regelparameter:
Hier mal meine ersten Experimente

Viele Grüße und einen schönen Sonntag,
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das sieht doch ansich schon mal sehr vielversprechend aus. Was man sehen kann: du hast ein aufschaukeln. Das heisst, der P-Wert ist zu gross. Hier zB https://pidexplained.com/how-to-tune-a-pid-controller/ ist ein Tuning-Guide, den du mal probieren kannst.

Was ich dir empfehlen wuerde: programmier eine Reihe von Fahrten mit variierenden Parametern, damit du nicht in ein Problem laeufst, das System fuer nur einen Wert zu tunen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

So, wie ueblich nochmal weiter darueber nachgedacht, und mehr Erkenntnisse gewonnen: das ist ja das Positions-Diagramm. Das heisst, er oszilliert am Ende um den Stoppunkt herum? Das ist natuerlich doof. Und das er am Anfang doch eine ganze Weile braucht, um in die Puschen zu kommen.

Das spricht dann doch eher dafuer, dass da noch P fehlt. Und das Endpunkt Problem muessen wir nochmal genauer analysieren. Zur Not kannst du da natuerlich auch einfach nach ueberfahren der Endposition das Ding abschalten, und ggf. reicht das fuer deinen Anwendungszweck schonmal.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für deine Antwort.

Also für meine Anwendung bin ich mir eigentlich sicher, dass das einfache Abschalten an der Endposition ausreicht. Es muss ja nur sicher gestellt sein, dass der Anfang der Schweißnaht überschweißt wird. Sollte aus irgendwelchen Gründen, mal nur 180° geschweißt werden müssen, dann sind die Toleranzen nicht sooo eng bemessen.
Und das er am Anfang doch eine ganze Weile braucht, um in die Puschen zu kommen.
Das stört mich schon eher, da das Einfluss auf die Schweißnaht hat und sicherlich je nach Geschwindigkeit auch anders ist.

Ich schaue mir später mal deinen Link an und werde heute Abend oder morgen Abend dann mal die Änderung mit mehr P aufzeichnen und weiters experimentieren und auch mal verschiedene Wege fahren.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Wenn ich P höher setze dann schwingt das System mehr um die Soll-Position.
Laut deinem Link soll ich P so einstellen, dass das System so konstant wie möglich ist und von diesem Wert die Hälfte nehmen.
Das habe ich mal gemacht. Danach hatte ich allerdings wieder ein System das um Soll schwingt und das habe ich mit dem I-Wert nur minimal ändern können.

Die besten Ergebnisse habe ich mit dem P-Wert erreicht, der das System konstantgehalten hat und dann habe ich den I-Wert solange verändert bis folgende Kurven kamen:
https://www.dropbox.com/s/ttxruzyc5rdek ... t.pdf?dl=0

Natürlich ist das jetzt nur für ein Fahrprofil, mit einem anderen (schnelleren) schwingt das System wieder um die Soll-Position. Dann ging mir für heute aber auch die Zeit aus. Das war alles wieder etwas experimentieren um zu sehen, wo welche Größe Einfluss nimmt. Das gehört für mich da auch etwas dazu. Aus der reinen Theorie in die Praxis umzusetzen und gleich noch wissen was jetzt abgeht, so weit bin ich noch lange nicht.

Morgen werde ich erst mal die Grenzen des Systems suchen, hatten wir ja ein paar Postings davor. Dann lege ich drei Fahrprofile fest und schau mir jede Regleränderung für alle drei Profile an, so das ich einen Kompromiss wählen kann. Naja und dann gehe ich nochmal wie in deinem PID-Tuning-Guid vor und schaue mal was dabei raus kommt.

Werde ich morgen nicht alles schaffen, aber da beginne ich zumindest damit.


Gerade habe ich mir noch die Frage gestellt, wie denn das in der Zukunft aussieht. Jetzt probiere ich ja gerade ohne Last um ein Gefühl für die EInstellerei zu bekommen. Irgendwann bekomme ich die Maschine und kann auch ein Testwerkstück einspannen und dann stelle ich das wieder ein. Aber ich kann das ja nicht für alle erdenktlichen Werkstücke-Geschwindigkeitskombinationen machen.
Ist zwar jetzt schon sehr weit vorgegriffen, aber bekommt man das irgendwie in den Griff?

Danke und schönen Rest-Sonntag,
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Hoffnung ist schon, dass der PID Regler einen gewissen Bereich abdeckt. Aber es kann auch durchaus sein, dass man für verschiedene Gewichtsklassen verschiedene Einstellungen braucht. Das ist tatsächlich möglich, und müsste dann zb durch die Eingabe des Arbeitsauftrags entsprechend geregelt werden.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier sind nochmal zwei Methoden vorgestellt, eine davon (Ziegler…) beruht auf dem step-response. https://www.electronicshub.org/pid-cont ... g-methods/
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank!

Das mit den unterschiedlichen Werten behalte ich mal irgendwo im Hinterkopf. Vorerst muss das mal für die gängigsten Rohre funktionieren. Da muss ich mal nachfragen in welchem Bereich wir uns bewegen. Aber wenn ich mich recht erinnere sind die relativ ähnlich und unterscheiden sich eher in der Länge. Das hätte auf das Maßenträgheitsmoment nicht so eine hohe Auswirkung, wie wenn die Durchmesser start varrieren würden.


Ich melde mich dann die Tage mit neuen Diagrammen zurück.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich habe nicht aufgegeben und war auch nicht faul. Gestern hatte ich leider keine Zeit und heute noch nicht viel.
Ich habe mir mal deinen Link zu Herzen genommen und will die Methode versuchen, in der die Konstanten der Regler berechnet werden. Das ist auf dem letzten Link, die letzte Methode.
Dafür habe ich gerade die Punkte "L" und "T" berechnet und zur Überprüfung auch mal grafisch ausgeben lassen:
Einmal die roten und blauen Kontrolllinien von Hand eingezeichnet und einmal beide Funktionen übereinander

L = 0,5 und T = 4,5

Mit diesen Werten bzw. dieser Berechnung werde ich morgen mal schauen, wie sich der Regler verhält. Ansonsten wird weiter probiert.

Der Code ist eigentlich deiner, ich habe nur die Geradeberechnung zwischrein gequetscht:

Code: Alles auswählen

import numpy as np
from matplotlib import pyplot as plt


class PathPlanner:

    def __init__(self, prologue, saddle, epilogue, speed):
        self.prologue = prologue
        self.epilogue = epilogue
        self.saddle = saddle
        self.speed = speed
        # follows from the velocity leading ramp
        # interpretation and its integral as position
        self.t_prologue = 2 * prologue / speed
        self.t_epilogue = 2 * epilogue / speed
        self.a_prologue = speed / self.t_prologue
        self.a_epilogue = speed / self.t_epilogue
        # the saddle is a simple rect, so duration is
        # length / speed
        self.t_saddle = saddle / speed
        self.duration = self.t_prologue + self.t_saddle + self.t_epilogue
        self.length = prologue + saddle + epilogue

    def __call__(self, t):
        if t < self.t_prologue:
            return 0.5 * self.a_prologue * t ** 2
        position = self.prologue
        t -= self.t_prologue
        if t < self.t_saddle:
            position += t * self.speed
            return position
        t -= self.t_saddle
        position += self.saddle
        if t < self.t_epilogue:
            # to understand this, think about the integral of the decelerating speed ramp
            # its a bit of a twister :)
            position += self.epilogue - (0.5 * self.a_epilogue * (self.t_epilogue - t) ** 2)
            return position

        return self.length


def main():
    path = PathPlanner(15, 90, 15, 30)
    size = 500
    l = np.linspace(0, path.duration, size)
    positions = [path(t) for t in l]
    pitch = path.saddle / path.t_saddle
    y_axis_section = (((path.t_saddle + path.t_prologue) * path.prologue) -
                      (path.t_prologue * (path.saddle + path.prologue))) / path.t_saddle
    delay_time = -y_axis_section / pitch
    constant_time = (positions[-1] - y_axis_section) / pitch
    y = [pitch * t + y_axis_section if delay_time <= t <= constant_time else None for t in l]
    print(f'L: {-y_axis_section / pitch}')
    print(f'T: {(positions[-1] - y_axis_section) / pitch}')
    plt.plot(l, positions)
    plt.plot(l, y)
    plt.show()
    plt.close()
    speed = np.diff(positions)  # simple derivative
    plt.plot(l[:-1], speed)
    plt.show()
    plt.close()


main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Moment, hast du das jetzt anhand des geplanten Pfads gemacht? Das ist nicht die Idee. Diese Kurve ist die 100% step response, aufgezeichnet.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Achso, ja das habe ich anhand des geplanten Pfads gemacht. Müsste ich, wenn der Ist-Wert um dem Soll-Wert schwingt, eine Periode der Schwingung als S-Kurve "herausnehmen" und daran die zwei Werte "L" und "T" berechnen?

Sonst habe ich eigentlich keine S-Kurve, wenn ich nichts übersehe.

Mir hat die Idee eigentlich gefallen, weil ich dachte, durch die Berechnung würde sich der Regler an veränderte Strecken "automatisch" anpassen.

Dankeschön und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bei den PID Werten geht es um dein tatsächliches System. Nicht um einen Wunschpfad. Der könnte doch bebeliebig sein, zum Mond & zurück in unter einer Sekunde. Aber das geht halt nicht.

Diese Heuristik soll aus dem open loop, also ungeregelten Verhalten, Einstellungen für den geregelten Fall machen.

Und wenn du einfach mal Vollgas gibst & die Position über die Zeit aufträgst, dann sieht das ziemlich so aus.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Das macht natürlich Sinn und trifft sich auch ziemlich gut, da das ja für den nächsten Versuch eh auf dem Plan stand.

Danke für die Richtigstellung, das hätte mich wieder Nerven gekostet.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten