Projekt: Autonomer Roboter

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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.

    ...Klick mal auf den RoPi Link in meiner Signatur...

    Auch wenn du ein sog. GRID Raster auf deine Rasenfläche softwareseitig legst, muss dein Gefährt trotzdem wissen wo in diesem Raster er sich selbst befindet und wo welches Quadrat liegt, um die entsprechende Richtung einschlagen zu können.

    Angenommen du hast solch ein Raster:

    Code
    1 2 3
    4 5 6
    7 8 9

    Dein Gefährt befindet sich auf der 5 Koordinate, guckt Richtung Koordinate 2 und soll zur 9 fahren... Was muss er dann machen?

    Er muss von sich selber wissen das er in Richtung 2 guckt. Dann muss eine Default-Dreh-Richtung festgelegt sein, zB nach rechts. Dann muss er wissen wie oft/lange er nach rechts drehen muss, wie weit eine Drehbewegung geht damit er 45° vollzogen hat und wie weit er dann fahren muss um auf Höhe von 9 zu stoppen.

    Wenn du dich dabei also weder auf einen Kompass noch auf Odometrie-Sensoren stützt, wie willst du das bewerkstelligen?

  • Hallo Bastelstube,

    wie es dann weitergeht soweit bin ich noch nicht mit meiner Überlegung.

    Es lässt sich zielgerichteter programmieren, wenn Deine Überlegungen alles beinhalten, was Dein Gefährt können soll - insbesondere die Art der Navigation, die Fahrmanöver.

    Wenn jede einzelne Information in ein Programm einfließt, dann ist die Wahrscheinlichkeit sehr hoch, dass frühere Dinge wieder rausfliegen, die mühselig programmiert wurde. Wäre das gesamte Konzept ausgearbeitet worden, programmiert man nur einmal und es läuft dann.

    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.

  • Naja, während der Entwicklung kann sich durch aus die ein oder andere Idee oder Verbesserung ergeben und somit kann es durch aus vor kommen, dass man ein Programm später umfangreicher / anders beendet als es Anfangs angedacht war - eigentlich nichts ungewöhnliches, insbesondere wenn man in dem Bereich neu unterwegs ist.

    Natürlich kann man ein Projekt auch von vorneherein leicht erweiterbar gestalten, manchmal ist das aber auch zu viel des guten..

    Wenn man ein Projekt aber von Anfang an gut struktuiert und zB so wenig wie möglich hardcoded hinterlegt, lassen sich Parameter nachträglich einfach verändern.. Zum Beispiel wenn der US-Sensor ausgetauscht wird aber sich dann die "min distance" verändert, hat man dafür eine Konfigurations-Variable gesetzt brauch man nur diesen eine Zeile anpassen, wurde es aber hardcoded sonst wo im Source gesetzt muss man ggf mehrere Zeilen anpassen....

    Also so gesehen würde ich "Konzept des Projekts" und "Konzept des Programms" unterscheiden ;)

    Die größte Schwierigkeit besteht wie gesagt darin, ein Programm mit geschmeidigen&reibungslosen Abläufen zu konstruieren.

    Jedes "sleep" blockiert den Ablauf, daher ist es empfehlenswert unterschiedliche Bereiche auszulagern wie zB. US-Sensor, Motorsteuerung und Kartierung, wobei ein Hauptprozess alles kontrolliert / beeinflussen kann.

    Und wie auch schon erwähnt bremsen mehrere Threads das Konstrukt aus, mehrere Prozesse sind besser, die müssen dann aber miteinander reden können...

    Ich will dir weißgott nicht mein Konzept aufzwängen, aber wieso das Rad neu erfinden?

    Sieh dir zum Beispiel mal folgende Links an:

    Entwicklung: RoPi - Autonomer Roboter mit RaspberryPI

  • Ich sehe das genauso wie Du. Das "Konzept des Projektes" beeinhaltet ja mehrere Instanzen (Räder, Chasis, Sensoren etc.) und da ist die Instanz "Source" nur eine von vielen. Das "Konzept des Programms" beschäftigt sich ja "nur" mit der Umsetzung die einzelnen Komponennten zu verknüpfen. Soll heißen es muss keine Auswahl an Komponennten mehr erfolgen. Das Rad muss man auch nciht neu erfinden. Es gibt einen sehr guten Spruch den ich mir immer wieder sage. "Nur weil es etwas schon gibt, heißt das nicht das man es besser machen kann" (Siehe diverse Mähroboter Hersteller).

    Das was es halt noch nicht gibt, ist die Umsetzung das ganze ohne Leitkabel zu machen. Klar ist es wahrscheinlich aufwändiger und braucht auch seine Zeit jedoch führt es nachher - wenn es gut durchdacht ist - zum gewünschten Erfolg.

    Deinen RoPi habe ich mir schonmal angeschaut, bin jedoch noch nicht ganz fertig mit lesen :D

    Ich werde meinen Code in den nächsten Tagen nochmal hier hinein stellen, nachdem ich Ihn weiter angepasst habe. Ich schaue mal das ich es hinbekomme weniger bis gar keine sleeps zu verwenden da es ja eine flüssige Bewegung/Ablauf sein soll. Ebenfalls schaue ich mal das ich evtl. fest Codierterte Paramter herausnehme und variabel gestalte.

    LG

    Bastelstube

  • Wenn jede einzelne Information in ein Programm einfließt, dann ist die Wahrscheinlichkeit sehr hoch, dass frühere Dinge wieder rausfliegen, die mühselig programmiert wurde. Wäre das gesamte Konzept ausgearbeitet worden, programmiert man nur einmal und es läuft dann.

    Das programmierte Dinge wieder entfernt werden ist denke ich keine seltenheit. Der Quellcode von beliebigen Projekten wird ja auch dauerhaft angepasst (Updates). Ich glaube das man nie "nur" einmal programmiert. Während der Arbeit fallen einem imemr wieder neue Dinge ein oder wie man es doch anders gestalten könnte.

    LG

    Bastelstube

  • Hallo Bastelstube,

    Das programmierte Dinge wieder entfernt werden ist denke ich keine seltenheit. Der Quellcode von beliebigen Projekten wird ja auch dauerhaft angepasst (Updates). Ich glaube das man nie "nur" einmal programmiert. Während der Arbeit fallen einem imemr wieder neue Dinge ein oder wie man es doch anders gestalten könnte.

    LG

    Bastelstube

    nicht, wenn das Konzept steht und ausgereift ist. Dann programmierst Du echt alles nur einmal, testest und gut ist.

    Dagegen gefährdet man jedes Projekt, wenn ständig die Anforderungen verändert werden, die gravierenden Einfluss auf die Software-Architektur haben.

    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.

  • Dagegen gefährdet man jedes Projekt, wenn ständig die Anforderungen verändert werden, die gravierenden Einfluss auf die Software-Architektur haben.

    das unterschreibe ich!

    ich hatte ja ein Programm mit Menüführung Steuerkreuz Tasten up/down left/right esc und enter.

    als ich auf Encoder umstellte musste ich alle Menüs anfassen! weil es kein esc mehr gab, raus kam man nur mit Wahl weiterer Menüpunkte und enter (encoder Taster drücken)

    auch gab es kein rechts links mehr für Untermenüs, alles war nur noch up/down

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo zusammen,

    habe nun endlich die Zeit gefunden den Code mal anzupassen.

    Ich bekomme jedoch den Fehler, dass vor dem def main(): die Formatierung nicht stimmt, was aber irgendwie nicht sein kann.

    File "MotorTest.py", line 106 def main(): ^ IndentationError: expected an indented block

    Für eure Hilfe wäre ich dankbar, damit das ganze so langsam mal ans fahren kommt :D


    LG

    Bastelstube

    Einmal editiert, zuletzt von Shaq (14. Januar 2018 um 13:17)

  • Wenn du except entfernst musst du auch das try in Zeile 95 entfernen, das gehört zusammen und verändert sonst auch die Einrückungsebene.

    Zeile 97 und 100 ist aber auch Falsch. Und das sleep in Zeile 99 ist überflüssig - da wären wir nämlich auch wieder mit unnötigen Blockaden des Scripts.

  • Wo liegt denn der Fehler in Zeile 97 und 100?

    Danke für den Hinweis das ich das try  rausnehmen muss ist auch irgendiwe logisch.

    Wenn ich aber das time.sleep(0.2)entferne, dann misst den Sensor die Entfernung ohne Begrenzung eines zeitlichen Abstandes. Heißt ich kann dem Sensor nicht mehr sagen messe nur noch alle 0.5 Sekuden.

    Desweiteren wird auch nicht der Wert den der Sensor misst ausgegeben sondern nur Entfernung = %2.f cm obwohl ja deklariert ist das er es ausgeben soll oder etwa nicht?

    Dadurch drehen sich auch keine Räder etc.

    LG

    Bastelstube

    Einmal editiert, zuletzt von Shaq (14. Januar 2018 um 15:06)

  • In Zeil 97 musst du einen Funktionsaufruf machen und in Zeile 100 dann den Rückgabewert der Funktion wie du es der Variable zugewiesene hast verwenden

    By the Way wird Zeile 98 so auch nicht funktionieren wie erhofft ;)

  • Entschuldige aber wie hast du es geschafft den Rest zu programmieren wenn du denn nicht mal weißt wie ein Funktionsaufruf aussehen müsste?

    Zeile 98 fügt keinen Wert ein

  • Ich bekomme jedoch den Fehler, dass vor dem def main(): die Formatierung nicht stimmt, was aber irgendwie nicht sein kann.

    File "MotorTest.py", line 106 def main(): ^ IndentationError: expected an indented block

    Kann es sein, dass du Leerzeichen und Tabulatoren gemischt in deinem Code verwendest?

    (Gern gemachter Fehler.

    Und bitte @all: Keine Diskussion bzgl. der Einrückungszeichen hier).

    Der Code, den du gesendet hast, sieht bzgl. der Einrückungen ok aus, was man nicht sieht ist, welche Einrückungszeichen verwendet wurden.

  • Funktionsaufrufe sehen so aus : distance1 = distance()

    Danke, habe nicht gemerkt das die Klammern gefehlt haben.

    Entschuldige aber wie hast du es geschafft den Rest zu programmieren wenn du denn nicht mal weißt wie ein Funktionsaufruf aussehen müsste?

    Habe wie oben gesagt, nicht gesehen, dass ich die Klammern vergessen habe.

    Kann es sein, dass du Leerzeichen und Tabulatoren gemischt in deinem Code verwendest?

    Habe nochmal nachgeschaut und alles überprüft und ist alles mit Leerzeichen.

  • Ich habe die autonome Fahrweise jetzt mal umgeschrieben. Die Ausgabe der Entfernung funktioniert ohne Probleme. Ich habe auch die Funktion zum vorwärts fahren ausserhalb der Schleife angebracht, da der Roboter ja zunächst einmal gerade aus fahren soll.

    Nur leider wird die Funktion in der zweiten Schleife nicht aufgerufen, obwohl der Sensor sagt "zu nah". Woran kann das liegen? Kann man die Funktion auch ausführen ohne das eine Zahl in den Klammern steht oder muss ich dafür nochmal extra was deklarieren?

  • Wieso verschachtelst du überhaupt 2 while Schleifen? Lass das als "if" dann funktioniert es besser da es am Anfang steht.

    Und man kann der Funktion ein "default"-Wert definieren, wenn dann bei Ausführung nichts übergeben wird wird der default verwendet...


    Aber wie gesagt, zu viele sleeps

Jetzt mitmachen!

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