Projekt: Autonomer Roboter

  • Wie gesagt, du hast 2 unterschiedliche Distance-Sensoren aber nur ein Dictionay in dem die Werte geschrieben werden...

    Zum Beispiel setzt der Rechte Sensor telemetry['distance'] = '15' aber der Linke Sensor setzt kurz darauf telemetry['distance'] = '20'

    Welche Wert wird dann in der main() verwertet?

    Was self.distance=None damit zu tun haben soll kann ich gerade nicht nachvollziehen. Du hattest zuvor eine Fehlermeldung, damit hatte self.distance=None etwas zu tun .... Also bitte nicht mehrere Sachen vermischen

  • Indem du unterschiedliche Dictionary-Variable-Namen erzeugst? Es wird immer wichtiger das du den Code wirklich verstehst...

    telemetry ist nur der Name einer Variablen, um auf den Inhalt zuzugreifen. Um die Übersicht zu behalten wird innerhalb der Klassen der gleiche Variablen-Namen verwendet - es könnte aber auch xyz heißen...

    Python
    class bla:
        def __init__(self, tel):
            self.xyz = tel
    
    telemetry = dict()
    quark = bla(telemetry)

    Was wir in deinem Fall brauchen sind zwei unterschiedliche dict() Objekte


    Für Dein Szenario bedarf es ein paar weiterer Anpassungen da es sonst auch mit "steerTo" Probleme geben würde... Dh "steerTo" sollte dann nicht mehr in das jeweilige telemetry Dictionary geschrieben werden sondern in status

    ...Über die Logik im "robots brain" Abschnitt machst du dir mal bitte selber Gedanken...

  • Wofür benötigt man den zum Beispiel das self.vor der Variabel. Könnte man das ganze nicht auch ohne das self.machen? Welchen nutzen hat dies?

    Was bedeutet eigentlich =None? Heißt das, dass ich die Variabel auf nullsetze. Sprich kein Inhalt? Weil bei Falsewäre es ja ein Zustand.

    Worin liegt der unterschied und die funktionsweise von einemstaticzu einem sharedDictionary?


    LG

    Bastelstube

    3 Mal editiert, zuletzt von Shaq (20. Februar 2018 um 14:52)

  • Wofür benötigt man den zum Beispiel das self.vor der Variabel. Könnte man das ganze nicht auch ohne das self.machen? Welchen nutzen hat dies?

    Ich versuch das mal anhand einiger Beispiele zu Zeigen - bitte ausprobieren und wenn dann noch etwas unklar ist die Suchmaschiene deines Vertrauens bzgl. Python Klassen befragen.

    Python
    class xyz:
        def __init__(ich, text=None):
            ich.text = text
        def p(ich):
            print(ich.text)
    
    bla = xyz("Hallo")
    bla.p()
    Python
    class xyz:
        def __init__(self, text=None):
            self.text = text
        def p():
            print(self.text)
    
    bla = xyz(text="hAllo")
    bla.p()
    Python
    class xyz:
        def p(text):
            print(text)
    
    bla = xyz().p("haLlo")
    Python
    class xyz:
        def p(self, text):
            print(text)
    
    bla = xyz().p("halLo")
    Python
    class xyz:
        def __init__(self, text):
            print(text)
    
    bla = xyz("hallO")

    Was bedeutet eigentlich =None? Heißt das, dass ich die Variabel auf nullsetze. Sprich kein Inhalt? Weil bei Falsewäre es ja ein Zustand.

    bla = None damit hat bla auch einen Wert, nämlich None.

    Worin liegt der unterschied und die funktionsweise von einemstaticzu einem sharedDictionary?

    Ein Static Dictionary kann von einem anderen Prozess nicht verändert werden.

  • Das ganze läuft jetzt soweit. Die Frage die sich mir momentan noch stellt ist. Im vorherigen Scipt ohne den zweiten Sensor war es so, dass wenn der Roboter einen turn_left()gemacht hat, dass sich das eine rad vorwärts und das andere rückwärts gedreht hat. Dies hätte ich jetzt auch gerne wieder. Sprich das sich die Räder beim turn_left()und beim turn_right()jeweils in die andere Richtung drehen.


    Hierfür muss ich doch in der class Motor_Control()jeweils ein neues steerToanlegen oder?

    Bsp. steerTo_left  und steerTo_right

    LG

    bastelstube

  • Das ganze läuft jetzt soweit.

    Wie sieht denn deine "Roboter Brain" aus?

    m vorherigen Scipt ohne den zweiten Sensor war es so, dass wenn der Roboter einen turn_left()gemacht hat, dass sich das eine rad vorwärts und das andere rückwärts gedreht hat. Dies hätte ich jetzt auch gerne wieder.

    pivot_*

    Hierfür muss ich doch in der class Motor_Control()jeweils ein neues steerToanlegen oder?

    Bsp. steerTo_left und steerTo_right

    Um Gottes Willen, Nein. :elektro:

    Für steerTo wird ein Wert hinterlegt. Wieso also die Variable (bzw den Index) auch noch umbenennen? Der Wert ist entscheidend.

  • Wie sieht denn deine "Roboter Brain" aus?

    pivot_*

    Ach sorry übersehen:sleeping:

  • Der pivot_right() will jedoch nicht so ganz :conf: pivot_left() geht ohne Probleme.

    Die Motor_Control()sieht richtig aus.

    LG

    Bastelstube

  • Zeile 49 und 50 wird so nicht gehen, da es keine "elif" Situation geben könnte... Der Part wird ja nur dann ausgeführt wenn die erste Bedingung nicht Zutraf - was ist aber wenn doch?

    radarProcess.terminate()wird ebenfalls nicht gehen ;)


    Nächster Schritt in der Entwicklung:


    Deine Fest definierte Reihenfolge ist jetzt:

    Wenn Links der Abstand < 15 ist dann Drehe nach Rechts.

    Nächster Durchlauf der Schleife:

    Links Abstand > 15

    Wenn Rechts der Abstand < 15 ist dann Drehe nach Links.

    Problem: Was ist wenn das Gefährt unglücklich in einer Ecke des Raumes steht, und zwar so dass er sich nun nur zur Seite dreht... Links zu wenig Platz, drehe nach rechts, dann ist rechts zu wenig Platz also drehe nach links, dann ist links zu wenig platz und drehe wieder nach rechts... Das geht dann ggf ewig so weiter :angel:

  • Zeile 49 und 50 wird so nicht gehen, da es keine "elif" Situation geben könnte... Der Part wird ja nur dann ausgeführt wenn die erste Bedingung nicht Zutraf - was ist aber wenn doch?


    radarProcess.terminate()wird ebenfalls nicht gehen

    Das radarProcess.terminate()habe ich schon angepasst (Siehe Code). Wegen der elif sache fällt mir momentan keine wirklich passende Lösung ein. Ich hätte jetzt den else Block in den if Block geschrieben bis auf self.end_time = datetime.now().

    datetime.now ist die aktuelle Zeit und starttime.now ist die Zeit wann die Messsung gestartet wurde oder?

    Problem: Was ist wenn das Gefährt unglücklich in einer Ecke des Raumes steht, und zwar so dass er sich nun nur zur Seite dreht... Links zu wenig Platz, drehe nach rechts, dann ist rechts zu wenig Platz also drehe nach links, dann ist links zu wenig platz und drehe wieder nach rechts... Das geht dann ggf ewig so weiter

    Dann wäre es sinvoll wenn er versucht rückwärts zu fahren. Dafür benötige ich aber dann noch einen weiteren Sensor. Das wäre jetzt meine Idee.

    LG

    Bastelstube

    2 Mal editiert, zuletzt von Shaq (20. Februar 2018 um 16:34)

  • Jetzt bin ich verwirrt... Was hat datetime.now() mit radarProcess_left.is_alive() zu tun? :conf:

    Dann wäre es sinvoll wenn er versucht rückwärts zu fahren. Dafür benötige ich aber dann noch einen weiteren Sensor. Das wäre jetzt meine Idee.

    Das einzubauen wäre aber auch nicht richtig... Lieber eine Anzahl an Wiederholungen gleicher Vorgänge und wenn Maximum erreicht dann andere Aktion...

  • Jetzt bin ich verwirrt... Was hat datetime.now() mit radarProcess_left.is_alive() zu tun?

    Das hat nichts miteinander zu tun. Mein Problem ist das pivot_right() nicht funktioniert und ich nicht so recht verstehe warum. Was hat denn pivot_right() mit Zeile 49 und 50 zu tun?

    Ich bin selber gerade etwas verwirrt. :-/


    Das einzubauen wäre aber auch nicht richtig... Lieber eine Anzahl an Wiederholungen gleicher Vorgänge und wenn Maximum erreicht dann andere Aktion...

    Das meinte ich ja, da könnte man dann sagen, dass das Gefährt rückwärts fahren soll etc.

    LG

    Bastelstube

  • Was hat denn pivot_right() mit Zeile 49 und 50 zu tun?

    ....Ich hab in Beitrag#130 geschrieben dass Zeile 49 und 50 fehlerhaft sind. In dem Absatz steht nichts bzgl. pivot. Du aber vermischst in Beitrag#131 alles und schriebst:

    Das radarProcess.terminate()habe ich schon angepasst (Siehe Code). Wegen der elif sache fällt mir momentan keine wirklich passende Lösung ein. Ich hätte jetzt den else Block in den if Block geschrieben bis auf self.end_time = datetime.now().

    Nun fragte ich dich was das miteinander zu tun hat?

  • Achso das meinst du. Ich hatte das jetzt mal so ausprobiert, jedoch selber schnell gemerkt, dass das keinen Sinn macht. Jedoch habe ich keinerlei Idee wo da der Fehler liegen könnte.

    Hast du eine Idee bzgl. der Pivot Thematik?

    LG

    Bastelstube

  • Ohne die Ausgabe zu kennen, nein. Ich kann nicht hellsehen, weiß also gar nicht ob die Funktion (bzw Methode) überhaupt ausgeführt wird und somit ggf etwas an deiner Verkabelung nicht i.o. ist?

    Letztlich ist es ja so: Die Funktion hieß vorher nur anders, vom Umfang ist sie zu "früher" identisch. Wieso also sollte die Funktion jetzt plötzlich nicht mehr funktionieren? Wenn die Software geht liegt es an ....?

  • Hier mal ein Video der aktuellen Situation:

    Video

    Hier der im Video verwendete Code:

    Hier die zum Video & Code zugehörige Ausgabe:

    LG

    Bastelstube

  • Verkabelung habe ich überprüft und mal die Kabel getauscht. Fehler bleibt bestehen. Somit schaue ich dann mal nach dem Code. Hast Du einen Tipp für mich woran es liegen könnte?

    Edit: Mir ist gerade aufgefallen, dass wenn ich den Code ausführe und die Hand zuerst vor den Sensor halte wo es scheinbar nicht funktioniert, funktioniert es für eine kurze Zeit. Wenn ich aber erst den Sensor auslöse wo es definitiv funktioniert und danach den wo es nicht geht, funktioniert es nicht :conf: Liegt es eventuell am Multiprocessing, dass zu viele Prozesse gleichzeitig ausgeführt werden etc.?

    LG

    Bastelstube

    Einmal editiert, zuletzt von Shaq (21. Februar 2018 um 15:31)

Jetzt mitmachen!

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