Problem: UltraSonic 2D Map

  • Ich versuche seit einiger Zeit die Messergebnisse eines UltraSchall Sensors zu visualisieren. Vorzugsweise mit Tkinter. Irgendwie stehe ich gewaltig aufm Schlauch und brauch mal wieder ein Denkanstoß.

    Es soll quasi so aussehen wie hier zu sehen:
    sensors_IRSLAM.gif
    Nur natürlich nicht so schnell... Aber halt eine graue Fläche und ein Echo wird als schwarzer Punkt geplottet.
    Basiert halt auf SLAM usw aber das sollte erstmal nicht weiter von Bedeutung sein.

    Ich finde bisher nur irgendwelche "Radar" Beispiele, grüne Fläche und so wie mans Sonarmäßig kennt, aber sowas möchte ich nicht.

    Die Richtung ist ebenfalls relevant und bekannt - hab auch ein Kompass der in die selbe Richtung wie der US schaut.

    Also:
    In Tkinter ein graues Quadrat, zB 300x300. US sendet ein Ping und die Messung ergibt: 10cm.
    Wie schaffe ich es nun von der Mitte aus bis zum "Ziel" eine weiße Linie zu zeichnen und am Ziel einen definierten schwarzen Fleck?
    Absolut perfekte Maße sind irrelevant, es ist also wurscht ob der Punkt nun exakt 10cm von der Mitte aus platziert wird oder was auch immer...
    Ja, gut, wie man eine Linie zeichnet weiß ich eigentlich auch schon von meiner Graph Code Umsetzung - stehe trotzdem aufm Schlauch :blush:


    Ich hab sowas ähnliches ja schon gebaut, allerdings in JavaScript....
    Hintergrund ist dass ich mein RoPi Projekt von HTML/JS umschreibe so dass das UI auf dem PC ausgeführt wird und via Socket die Daten empfängt/übermittelt....

    Irgendwelche Berechnungsformeln helfen mir nicht weiter - also bitte keine Beiträge wo nur irgendwelche Formeln drin stehen. Danke.

    Das einzig augenscheinlich brauchbare war folgendes, habs aber noch nicht ausprobiert: https://github.com/vatsan/slam/blob/master/scripts/slam.py

  • Hallo Meigrafd,

    so ein Sonar-Dings habe ich auch mal programmiert. War ganz spaßig.

    Was Du suchst bzw. was Dein Problem löst, verbirgt sich hinter folgenden Begriffen:
    - Trigonometrie (um von Kompass-Daten auf Winkel im mathematischen Sinne zu kommen und über sin() und cos() die Anteile in zwei senkrecht stehende Koordinaten-Achsen zu berechnen)
    - Umrechnung Grad in Bogenmaß
    - Polarkoordinaten
    - Transformation von Koordinatensystemen (insbesondere Translation)

    Hinter jedem Begriff verbergen sich Formeln, mit denen Du letztlich von einem Ausgangspunkt, Richtung, Winkel, Bogenmaß auf die neue Koordinate kommst.
    Die beiden Punkte alt nach neu verbindest Du mit einer geraden Linie. Wie Du Ausgangs- und Endpunkt gestaltest, obliegt Deiner Phantasie.

    Wie Du es noch eleganter hinbekomnmen kannst: Eine Programmiersprache, die Turtle-Graphik unterstützt. Da vereinfacht sich ALLES, da die ganze (höhere) Mathematik in Turtle-Graphik implementiert ist und Du sagen kannst. Von Ausgangspunkt in die oder die Richtung jene Entfernung = Endpunkt.

    Sinnigerweise enthält eines meiner Icon-Tutorials auch eine Einführung in Turtle-Graphik - mit reichlich Programmierbeispielen, von denen mindestens zwei in die Richtung gehen, die Du hier thematisierst.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (31. März 2017 um 19:41)

  • Ich möchte aber kein Sonar.

    Steht auch so in Beitrag#1. Wieso kommst du trotzdem mit Sonar um die Ecke? :-/ Sieht das gif für Dich aus wie ein Sonar?

    Hab aber auch erwähnt das irgendwelche Formeln mich nicht weiter bringen..

    Und ich möchte auch kein ICON sondern Tkinter, auf pygame würde ich mich auch noch ein lassen, aber definitiv kein "non-python".

    Geh doch bitte ein mal auf das was IM Beitrag steht ein - das letzte mal haste nämlich auch schon mit irgendwelchen Formeln um dich geworfen und auf dein heißgeliebtes Icon verwiesen ... auch damals sagte ich dir schon das ich kein Sonar möchte.

  • Hallo Meigrafd,

    ich bin auf jeden Punkt Deines Problems eingegangen. Der Lösungsweg besteht in höherer Mathematik. Lösungsbildende Begriffe habe ich Dir genannt.

    Was in der Programmiersprache X als Codebeispiel funktioniert, kann man leicht in Programmiersprache Y umschreiben. Das ist der Vorteil von Formeln und Algorithmen.

    Sonar war nur ein Beispiel. Weil dahinter die gleiche Technik (nur einfacher) steckt.

    Ich bin dann hier raus.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo,

    Zitat

    Ich hab sowas ähnliches ja schon gebaut, allerdings in JavaScript....


    Dann hast du doch einen Lösugsweg - den musst du halt "nur" nach Python Übertragen, was von JS -> Python ja IMHO nicht so schwer ist. An dem Punkt gebe ich Andreas recht: das Prinzip der Umsetzung ist wichtig, die Implementierung kommt erst danach.

    Was mir nicht klar ist, ist das:

    Zitat

    Wie schaffe ich es nun von der Mitte aus bis zum "Ziel" eine weiße Linie zu zeichnen und am Ziel einen definierten schwarzen Fleck?


    Die beiden Beispiele sehen für mich so aus, als würde der Raum komplett "von null" per US kartographiert. Was meinst du mit "weiße Linie" und "schwarzer Fleck"?

    Gruß, noisefloor

  • Da ich das ja bereits in JS umgesetzt habe, sind mir "Formeln" usw bekannt. Deshalb hab ich auch explizit erwähnt das Beiträge mit Formeln überflüssig sind - da meine Glaskugel quasi vorhergesehen hat das Andreas wieder mit solch einem Beitrag um die Ecke kommen würde, wie eben das letzte mal auch schon.

    Was meinst du mit "weiße Linie" und "schwarzer Fleck"?

    Guck dir die beiden Gifs oben an, insbesondere das letzte (Beitrag#5). Eine graue Fläche. Eine Messung bewirkt das bis zum "Ziel" eine weiße Linie gezogen wird und am Ende, eben am Ziel, ein schwarzer Punkt gesetzt wird.
    Keine Ahnung wie ich das anders beschreiben soll - sieht man aber doch auch am Bild oder nicht? :-/

    Wie ich mit Tkinter eine Linie zeichne ist mir ebenfalls bekannt - steht ebenfalls in Beitrag#1 (Graph Code).

    Also noch mal:

    Ich hab ne Fläche 300x300
    Der Mittelpunkt ist einfach zu ermitteln: x/2 und y/2
    Der Kompass gibt eine Richtung vor, zum Beispiel: 270 ... das entspricht: Osten
    US ermittelt ein Objekt in 10cm Entfernung.

    Wie gesagt weiß ich wie ich eine Linie zeichne, und auch in welche Richtung es gehen soll etc.. Mein Problem ist aber die Darstellung an sich. Wie stelle ich in der 300x300 Umgebung einigermaßen passend 10cm dar?

  • Hallo,

    Zitat

    Eine Messung bewirkt das bis zum "Ziel" eine weiße Linie gezogen wird und am Ende, eben am Ziel, ein schwarzer Punkt gesetzt wird.


    Axo, verstanden. Das GIF läuft zumindest bei mir so schnell, dass man das Ziehen der Linie nicht sieht.

    Zitat

    Mein Problem ist aber die Darstellung an sich. Wie stelle ich in der 300x300 Umgebung einigermaßen passend 10cm dar?


    Antwort: kommt drauf an ;) Kommt drauf an, wie groß der Raum ist, der kartographiert wird. Es macht halt einen Unterschied, ob du deinem Robi in einer Halle mit der Größe eines Fussballfelds fährst oder die 16 qm Küche in der Wohnung. Bei erstem sind 150px halt 50 Meter, bei letzterem sind 150 px halt 4 Meter. Da du eine Rastergrafik zeichnest, musst du vorher festlegen, wie viele Pixel einem Meter (oder 10 Zentimetern oder ...) entsprechen. Dann weißt du auch, welche Pixel-Länge deine weiße Linie haben muss und wo dann der weiße Punkt sein muss.

    Wenn du hier absolut flexible sein willst, kommst du wohl eine dynamische Neu-Skalierung nicht umhin. Was dann aber ein bisschen tricky sein kann.

    Eine Idee (die man aber noch zu Ende denke müsste) ist, ob man die US Daten nicht in einem Array speichert (hier würde sich IMHO stark ein Numpy-Array, Datentyp Boolean anbieten) und die Grafik nicht aus den Daten des Arrays generiert. Dann wäre (denke ich) das Umskalieren auch einfacher.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!