Projekt: Autonomer Roboter

  • Hallo zusammen,

    kurze Frage an Euch. Wie baue ich am sinnvollsten eine Schleife oder eine If-Anweisung in den nachfolgenden Code. Die Anweisung muss folgendes können.

    - Wenn Abstand größer 15 dann fahr einfach gerade aus bis Abstand wieder kleiner 15.

    LG

    Bastelstube

  • Hallo Bastelstube,

    die gegebene Info reicht noch nicht für eine eindeutige Lösung.

    Bewegt sich das Gefährt auf einer Schiene in Plus- und Minus-Richtung?

    Oder kann sich das Gefährt auf einer xy-Ebene in allen Richtungen bewegen?

    Im ersten Fall musst Du die Richtung noch vorgeben, sonst kann die Entfernung immer größer werden, bis das Gefährt aus der Reichweite verschwunden ist.

    Im zweiten Fall braucht Du sogar noch die Richtung zu einem Mittelpunkt. Ansonsten kann es passieren (bei einer Passanten), dass ds Gefährt nie in diese 15er Zone gelangt und auch aus der Reichweite verschwindet.

    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 Andreas,

    das Gefährt kann sich in wie ein Staubsauger- oder Mähroboter bewegen. Das heißt in alle Richtungen ausser nach oben oder unten.

    Zur besseren Übersicht ist hier mal der ganze Quellcode:

    LG

    Bastelstube

  • Hallo Bastelstube,

    warum machst Du nach jeder Bewegung ein

    Code
    gpio.cleanup()

    ???

    Das führt dazu, dass nach der ersten Bewegung (egal in welcher Richtung) die GPIO-Zuordnung und -Richtung unbekannt sind. Und dann geht da nichts mehr...

    Zur Lösung Deines eigentlichen Problems kann es dann gar nicht mehr kommen...


    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.

  • Dies habe ich gemacht, damit die einzelnen Funktionen resettet werden, falls sich eine davon aufhängt. Aktuell fuktioniert es auch so, die dauer der Ausführung kann man ja unten in der For Schleife einstellen. Dies wollte ich jedoch nachher noch abändern, dass ich das Scipt einmal starte und es solange läuft bis ich es abbreche.

    Wie würde es denn deiner Meinung nach besser aussehen, dann würde ich dies anpassen und testen und dir dann eine Rückmeldung geben.

    Edit: Habe ds gpio.cleanup() rausgenommen und siehe da nach dem durchlauf bleiben gewisse Pins aktiv und ein Reifen dreht sich weiter obwohl das Script durchgelaufen ist.

    LG

    Bastelstube

    Einmal editiert, zuletzt von Shaq (29. Dezember 2017 um 18:09)

  • Hallo Bastelstube,

    soll das heißen, dass das Skript regelmäßig gestartet wird und nur solange läuft, bis das Gefährt sich in der Zielzone befindet?

    Das macht für mich wenig Sinn. Das Skript sollte meiner Meinung nach dauerhaft laufen und je nach Position die Richtung ändern können - sprich autonom fahren.

    Ich würde Dir gern Code posten - aber leider wurde mir untersagt, zu bestehendem Python-Code mit Icon-Code "um die Ecke zu kommen". Letztlich wärest Du überrascht, wie kompakt die Lösung ausfallen würde.


    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. Dezember 2017 um 15:55)

  • Hallo Andreas,

    das Scipt soll später dauerhaft laufen. Sprich der Roboter ändert immer wieder seine Position wenn er auf einen Gegenstand trifft. Das Programm soll dann nur durch Strg + C oder ähnliches beendet werden können.

    Wie du schon gesagt hast, soll das ganze auch autonom fahren. Dies diente lediglich dazu um zu testen wie sich das ganze verhält.

    Hast auch eine PN von mir :)

    LG

    Bastelstube

  • 1. Veränderbare Sachen nicht hardcoded hinterlegen sondern über Konstante: Die GPIO-Pins die genutzt werden.

    2. Eindeutige Variable-Namen setzen, damit auch sofort ersichtlich wird was damit gemeint ist: tf

    3. Nicht ständig init() ausführen. Wenn die GPIO's ein mal konfiguriert sind bleiben die auch so. Du führst das nicht nur in jeder Funktion aus sondern auch im eigentlich Ablauf von autonomy()... Doppelt hält besser?

    4. Nicht ständig gpio.cleanup() ausführen. Wenn sich eine Funktion aufhängt liegt das am Programm nicht an den GPIOs.

    Du hast in check_front() zwei Abfragen die aber beide nahe zu identisch sind und etwas seltsam wirkt.. Was genau soll da denn passieren? Mehrmals versuchen und irgendwann einfach aufgeben?

    Man muss beachten:

    Solange eine Funktion beschäftigt ist wird das restliche Script blockiert. Wenn du also deinem Gefährt sagst es soll für 5 Sekunden vorwärts fahren, dann wird das Script für 5 Sekunden lang blockiert und kann auf nichts anderes reagieren, es kann dann also zwischendurch auch keine erneute Messung durchgeführt werden.

    Um das zu umgehen hast du mehrere Möglichkeiten - wobei ich jetzt nur zwei nenne um es nicht allzu kompliziert werden zu lassen:

    1. Es werden die GPIO's einfach nur geschaltet, die zum vorwärtsfahren zuständig sind. Dann führst du für einen festgelegten Zeitraum ständig Messungen durch und sobald der Abstand zu gering ist werden die GPIO's so gesetzt dass das Gefährt stoppt.

    2. Die Fahrbewegung wird ausgelagert sodass parallel Messungen durchgeführt werden können die wiederum in den ausgelagerten Process verwendet werden. Oder andersherum natürlich auch: Messungen auslagern.

    Dafür wird aber eine IPC benötigt, was man üblicherweise über Queue löst. Das ganze kann via Threading oder multiprocessing gemacht werden.

    Für deinen Fall würde ich aber erst mal 1. versuchen: Eine Hauptschleife in der alle Vorgänge gesteuert werden.

    Basis:

  • Hallo meigrafd,

    vorab schonmal vielen Dank für die großzügige Unterstützung. :)

    Das tf steht für timeframe. Sprich die Dauer wie lange das ganze ausgeführt werden soll. Das init() habe ich deshalb in jeder Funktion gehabt, da ich der Meinung war, dass man nach dem Ausführen der Funktion immer eine neue Initalisierung der Pins machen muss - wieder was dazu gelernt.

    In check_front()sollte zunächst nur getestet werden, ob sich die Räder in die gewünschte Richtung drehen. Durch das beenden mit Strg + Cwird dies aber hinfällig.

    Das ganze soll nachher so aussehen, dass dauerhaft eine Messung ausgeführt wird und parallel sich das Gefährt in Richtung X bewegt. Soabald der Sensor (aktuell noch einer, wollte aber später vorne zwei und hinten einen befestigen) erkennt, dass der Abstand nicht mehr passt, fährt das ganze zurück oder nach links oder in eine sonostige Richtung bis der Abstand an allen Sensoren wieder passt. Eine Messung soll dauerhaft ausgeführt werden. Als bestes Beispiel wie das ganze später aussehen soll dient ein Mähroboter. Diese fahren ja genauso wie ich es oben beschrieben habe. Hierbei spreche ich jetzt nur von der Abstandsmessung und der Fahrweise. Nicht von einem Leitkabel oder ähnlichem.

    Binde ich dann in die main Funktion eine whileSchleife ein die dauerhaft die Funktion measureausführt ein?

    Die Hauptfunktion ist ja zunächst einmal nur vorwärts Fahren bis ein Gegenstand in der jeweiligen Entfernung erreicht ist (wie oben beschrieben).

    LG

    Bastelstube

  • Naja @bootmann zum einen steht über dem Code "ungetestet", zum anderen ist das auch nicht wirklich optimal da wieder sehr viele "time.sleep()" eingefügt wurden und somit das Script derweil blockiert wird.


    Wie gesagt gibt es immer viele Wege ans Ziel. Da wir nicht in dein Kopf hinein schauen können, wissen wir auch nicht was mit tf gemeint sein könnte, ebenso wenig was das spätere Ziel sein soll oder welche Aspekte des Vorhabens wichtiger sind als andere...

    Wenn du permanent Messungen durchführen willst hast du hierbei bereits das Problem der jeweils verwendeten Hardware - wozu wir auch nichts genaues wissen. Zu kurze Intervalle können die Messungen verfälschen/beeinträchtigen, je nach verwendetem Sensor.

    Je nach Umgebung können Messungen verfälscht/abgelenkt werden, weshalb man sich eigentlich nie auf nur eine einzige Messung oder einen Sensor verlässt, hinzu kommt die Relation zur Fahrgeschwindigkeit denn wenn sich das Gefährt nur sehr langsam bewegt spielt das nicht so ne große Rolle als wenn es mit 10km/h unterwegs ist...

    Und wie auch schon gesagt, blockiert eine Befehlsbearbeitung das ganze Script. Es macht aber nicht viel Sinn tausende Threads zu erstellen, denn dadurch wird alles langsamer - Threads sind kein allheilmittel, man muss damit schon behutsam und gut durchdacht umgehen... Halte ich persönlich eh nicht viel von, Multiprocessing ist definitiv besser.

    Ich hab selber ein recht komplexes Projekt in der Entwicklung, an dem ich nunmehr schon seit 2 Jahren werkel => RoPi. Habe viele verschiedene Ansätze durchprobiert und mittlerweile 4 mal komplett von vorne angefangen weil irgendwann ein Punkt erreicht wurde, wo es entweder nicht weiter ging oder die Performance unerträglich wurde. Aktuell steht die Grundfunktionalität sehr zufriedenstellend, die Schwierigkeit an der ich mir aktuell die Zähne ausbeiße besteht in der Kartierung und möglichen KI-Funktionalität - daher glaub ich zumindest bis da hin schon ein bisschen zu wissen wovon ich da rede und worauf es ankommt ;)

    Wie gesagt, fange am besten erst mal damit an dein Grundgerüst vernünftig zu gestalten. Darauf aufbauend kann man dann gucken die Messung auszulagern und was dafür sonst noch nötig ist. Und dann guckt man wie das in die Hauptfunktion eingebaut werden kann.

    Mach das bitte erst, zeige den Code und dann erarbeiten wir weiteres

  • Hallo meigrafd,

    vor ein paar Jahren habe ich mal was gebastelt (s. Icon-Tutorial Teil 41) und programmiert (s. Screenshot).

    Ein Ultraschall-Sensor ist auf einer Platine montiert, die von einem Servo-Motor gradweise um 180 ° gedreht wird. Pro 180 ° vergehen knapp 2 Sekunden. Somit sind rund 100 Abstandmessungen pro Sekunde möglich.


    Aus der Konstanz der Messungen kannst Du auch entnehmen, dass es keine Rolle spielt, wie viel Zeit zwischen dem Abschluss einer Messung und dem Auslösen einer neuen Messung vergeht.

    Wenn es einen Einfluss gäbe, müssten da gelegentlich mal Aussetzer oder erhebliche Abweichungen einzelner Messungen zu benachbarten Winkelgrade auftreten. Tun se aber nüsch.

    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 (2. Januar 2018 um 01:21)

  • Hallo meigrafd,

    siehe Zitate:

    Wie gesagt gibt es immer viele Wege ans Ziel. Da wir nicht in dein Kopf hinein schauen können, wissen wir auch nicht was mit tf gemeint sein könnte, ebenso wenig was das spätere Ziel sein soll oder welche Aspekte des Vorhabens wichtiger sind als andere...

    Das tf steht für timeframe. Sprich die Dauer wie lange das ganze ausgeführt werden soll. Das init() habe ich deshalb in jeder Funktion gehabt, da ich der Meinung war, dass man nach dem Ausführen der Funktion immer eine neue Initalisierung der Pins machen muss - wieder was dazu gelernt.

    In check_front()sollte zunächst nur getestet werden, ob sich die Räder in die gewünschte Richtung drehen. Durch das beenden mit Strg + Cwird dies aber hinfällig.

    Das ganze soll nachher so aussehen, dass dauerhaft eine Messung ausgeführt wird und parallel sich das Gefährt in Richtung X bewegt. Soabald der Sensor (aktuell noch einer, wollte aber später vorne zwei und hinten einen befestigen) erkennt, dass der Abstand nicht mehr passt, fährt das ganze zurück oder nach links oder in eine sonostige Richtung bis der Abstand an allen Sensoren wieder passt. Eine Messung soll dauerhaft ausgeführt werden. Als bestes Beispiel wie das ganze später aussehen soll dient ein Mähroboter. Diese fahren ja genauso wie ich es oben beschrieben habe. Hierbei spreche ich jetzt nur von der Abstandsmessung und der Fahrweise. Nicht von einem Leitkabel oder ähnlichem.

    Wenn die Fahrweise schonmal funktioniert, soll das ganze später per App steuerbar sein. Genauso eine Kartierung per GoogleMaps woran man erkennen kann, wo das Gefährt gefahren ist. Das ist aber alle Zukunfts denken. Zunächst einmal steht die Fahrweise und die Messung im Vordergrund.

    Noch als kleiner Zusatz was ich verwende:

    - Raspberry Pi 3 Model B mit Rasbian

    - Als Sensor den Ultraschallsensor HC-SR04

    - Ein Voltage Translator von joy-kit

    - Die H-Brücke ist vom Typ L298n

    - Die zwei Getriebemotoren sind ebenfalls von joy-it (sind gelblich)

    Gerne kann ich euch auch mal meinen Aufbau in einem Steckplatinenplan in fritzing zu Verfügung stellen. An einem Schaltplan arbeite ich aktuell noch.

    LG

    Bastelstube

    2 Mal editiert, zuletzt von Shaq (2. Januar 2018 um 16:06)

  • Schau dir mal das an:

    https://www.python-forum.de/vi…c.php?f=7&t=40595#p309980

    dürfte für dich Interessantes dabei sein...

    Hört sich interessant an, jedoch ist es so wie meigrafd sagte, es ist ungetestet. Habe mir aber den Aufbau mal angeschaut und teile davon umgeschrieben und bei mir eingebaut, jedoch bin ich noch nicht ganz fertig und kann deshalb noch keinen Testbericht sowie den Quellcode zur Verfügung stellen.

    LG

    Bastelstube

  • Andreas Du kannst gerne die "Ping Rate" der unterschiedlichsten Ultraschall-Sensoren recherchieren - sie existiert definitiv.

    Beim HC-SR04 hab ich im Datasheet irgendwas bzgl. "we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal" gelesen.

    Manche teureren Sensoren haben selbst einen Filter verbaut, ein HC-SR04 aber nicht.

    Shaq Ein Pi3 ist für dein Vorhaben relativ oversized. Nicht nur weil der viel mehr Strom benötigt (ca. 3x so viel wie ein Pi0W) sondern auch weil du für Dein Vorhaben nicht so viel Rechenpower benötigst. Dafür würde auch schon ein Arduino reichen.

    Wenn du einen Staubsaug-Roboter baust wirst du mit GoogleMaps aber nicht viel machen können. Hin zu kommt das du für eine Kartierung mehr als nur einen Sensor-Typ benötigst, da du auch die zurückgelegte Strecke brauchst, sowie die Fahrtrichtung und somit auch einen Kompass.

    Zeig deinen Code, dann erarbeiten wir gemeinsam weiteres. Vorkauen werde ichs dir aber nicht einfach so ;)

  • Zeig deinen Code, dann erarbeiten wir gemeinsam weiteres. Vorkauen werde ichs dir aber nicht einfach so

    Das möchte ich auch definitiv nicht, da ich es ja selber können möchte. Aus Fehlern lernt man. Solange ich es selber hinbekomme es zu programmieren mit etwas unterstützung bin ich zufrieden.

    Es soll ja uach nicht wie ein Staubsaugerroboter sein sondern wie ein Möhroboter. Zum Beispiel Husqvarna. Die arbeiten ja mit GoogleMaps und zurückgelegter Strecke. In diese Richtung soll das ganze gehen mit der Zeit nur besser und zwar ohne Leitkabel. Eine vorstellung wie man dies realisieren könnte habe ich aber wie gesagt das ist Zukunfts denken ohne Leitkabel. Erstmal die Basics und dann Step by Step.


    Hier mal der Link von den Robotern von der Firma, damit man es auch sieht was ich meine.

    http://www.husqvarna.com/de/produkte/maehroboter/

    Mit welchem Modul man die GPS unterstützung inkl. Datenverbindung bauen kann habe ich mir schon recherchiert. Wie aber schon oben gesgat Zukunfts denken.

    Werde mich heute noch oder morgen daran begeben weiter zu basteln, da ich aktuell Job bedingt nicht so die Zeit habe in der Woche.

    LG

    Bastelstube

  • Wieso redest du dann erst von Staubsauger aber nu von Mähroboter?

    Letztere haben andere Anforderungen und verwenden keine UltraSchall-Sensoren mit so einem hohen Streuwinkel wie vom HC-SR04, denn dann erkennen sie zB schon den überstehenden Busch als Hindernis, sollten aber auch unterhalb des Buch's mähen... Einfach manuell den HC-SR04 begrenzen ist auch keine gute Idee, lieber zu einem anderen US greifen.

    Bei den UltraSchall-Sensoren gibt es da auch unterschiedliche, manche sind für höhere Distanz besser, andere für den Nahbereich.

    Für "zurückgelegte Strecke" benötigst du sog. Odometrie-Sensoren - werden überwiegend durch Encoder im Antrieb umgesetzt.

    "Leitkabel" ist bei einem Mähroboter schon sinnvoll - insbesondere dann wenn du dir nicht Softwareseitig die Mühe machen willst, die Bereiche die nicht gemäht werden sollen/dürfen zu markieren, denn sonst kann es passieren das der Roboter auch mal Blumen plättet. Mit "Leitkabel" mäht es sich i.d.R. präziser.

    Mähroboter gibts by the way sehr viele, auch Marke-Eigenbau. Hab ich mich auch schon mal dran versucht, allerdings möglichst Low-Budget, aber die Anforderung an die Mechanik ist wegen der Sicherheit enorm, das Mähwerk sollte man nicht unterschätzen.

    Wenn du dann auch noch eine Ladestation verwenden willst, muss das Gefährt ja auch wieder präzise zurück finden.


    Willst du das Gehäuse/Gestell selber entwickeln, oder einen defekten Mähroboter ausschlachten?

    //EDIT: Wichtig => http://robomaeher.de/blog/wann-darf…er-rasenmaehen/

  • Habe einen Fehler gemacht sorry. Es sollte als Beispiel ein Mähroboter sein :)

    Wegen den Ultraschallsensoren würde ich dann später mal schauen, wenn das ganze von der Funktionsweise her schonmal fährt. Die Sensoren würde ich dann später austauschen durch geeignete.

    Von Odometrie-Sensoren habe ich noch nicht gehört. Danke für die Info, werde mir diese mal anschauen. Verbauen aber wahrscheinlich erst später, wenn die Angabe der zurückgelegten Strecke von Bedeutung wird.

    Als Leitkabel ersatz habe ich mir das so gedacht, dass man in einem array ein Koordinatensystem (X,Y) realisiert. Hierbei soll der Roboter dann in seiner Ladestation stehen und dann gesagt werden diese Punkt ist X (Fahr wenn leer zurück zu X). Von der Ladestation soll der Mähroboter einmal um das Grundstück von Hand herum gefahren werden, wodurch auch die Y Koordinate berechnet werden soll. Anhand der entstanden Fläche soll dann gesagt werden mähe nur in diesem Feld. Wenn ein zweites Grundstück zusätzlich gemäht werden soll, wird auch wieder gesagt, wenn leer dann fahre zur Ladestaion etc. etc. wie es dann weitergeht soweit bin ich noch nicht mit meiner Überlegung.

    LG

    Bastelstube

Jetzt mitmachen!

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