Roboter mit Keyevent - Tastatur Steuerung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich würde gerne einen keinen Robotor mit der Tastatur steuern. Wenn ich z.B. "w" drücke soll der Roboter gerade aus fahren, wenn ich los lasse soll er wieder stehen bleiben. Ich habe etwas im Internet gesucht und gefunden, dass man mit pygame die Funktionen KEYDOWN und KEYUP hat. Als Test habe ich mir folgendes Programm zusammengestellt:

    Da ich Python 3.2 verwende musste ich pygame wie hier beschrieben installieren.

    Wenn ich das Programm starte und eine Eingabe (Pfeiltasten auf der Tastatur) mache, erhalte ich folgendes Bild:

    Wo liegt mein Fehler?

    Einmal editiert, zuletzt von Schl87 (11. Januar 2015 um 17:09)

  • Hey Schl87,

    so etwas in die Richtung habe ich auch gemacht -->hier<--, vielleicht hilft dir dieser Link ab Beitrag #8.
    Habe das mit der Tastatursteuerung jedoch schlussendlich sein gelassen, weil Python (meines Wissens kann mich aber auch irren) die Keyreleasefunktion nicht auslesen kann, also als extra Event. Deshalb bin ich auf einen XBox Controller umgestiegen, der die Nullposition als eigenen Event hat. Anregungen hierfür findest du -->hier<--.
    Ich hoffe du kannst damit was anfangen, wenn nicht melde dich einfach wieder.

    Liebe Grüße

    Neolinga


  • Kann pygame ohne GUI/Fenster Events abfangen und bearbeiten?

    Das ist vermutlich die wichtigste Frage zu meinem Problem.

    Code
    def getch():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

    Ich habe auch so versucht die Tastatureingabe zu bekommen. Allerdings erhalte ich so immer nur eine Eingabe, wenn auch eine Taste gedrückt wird (bzw. wenn eine Eingabe getätigt wurde) und nicht wenn sie wieder losgelassen wird.
    Also müsste ich den Befehl nach einer gewissen Zeit (z.B. 0.2s) wieder zurücksetzen... das führt allerdings zum ruckeln der Antriebe.

    Einmal editiert, zuletzt von Schl87 (10. Januar 2015 um 17:35)

  • Das ist genau das Problem das ich damals hatte - keine keyrelease Events über python realisierbar (zumindest keinen weg gefunden). Deshalb bin ich ja umgestiegen. Wenn du jedoch auf eine Lösung stößt fände ich dies interresant.

    Liebe Grüße

    Neolinga

  • Kann pygame ohne GUI/Fenster Events abfangen und bearbeiten?

    Ich habs grade gegengetestet, genau das dürfte die Lösung des Problems sein.

    Die Event-Geschichten gelten - leider - nur für von Pygame selbst erstellte Fenster. Ein

    Code
    pygame.display.set_mode((640, 480))

    direkt nach [font="Courier"]pygame.init()[/font] erstellt ein 640x480-Pixel großes Fenster. Wenn dieses Fenster im Vordergrund steht, reagieren auch die entsprechenden Events.

    Hier mal ein korrigiertes Beispiel (zusätzlich hab ich [font="Courier"]pygame.time.Clock()[/font] benutzt, und die Berechnung auf 10 Abfragen/Sekunde begrenzt mittels der [font="Courier"]clock()[/font]-Methode. Ansonsten sorgt die Schleife für eine 100% ausgelastete CPU, womit der arme RPi unnötig belastet wird und ggf. auch Kühlprobleme mit sich bringen kann):

  • Kann es am Zugriff per Putty liegen?

    Damit kann man den Pygame-Ansatz beinah komplett wegwerfen... (Ja, es gibt einen Weg über X11-Forwarding, aber der ist für diesen Einsatzzweck ungefähr so, als ob man mit Kanonen auf Spatzen schießen würde...)

    In dem Fall wirst du wahrscheinlich auf das [font="Courier"]curses[/font]-Modul in Python zurückgreifen müssen; das bietet Methoden an, um auch in der Shell eine Tastatursteuerung zu ermöglichen. Wie man mit dem Modul allerdings genau umgeht, weiß ich selbst nicht - da musst du selbst recherchieren oder jemanden finden, der dir das erklären will.

    Auf die Schnelle habe ich das da *Click* gefunden, wie man das wohl grundlegend über [font="Courier"]curses[/font] abfragen kann.

    Einmal editiert, zuletzt von Astorek86 (11. Januar 2015 um 12:56)

  • Vielleicht muss ich mein Konzept noch einmal überdenken.
    Ich will den Roboter per Handy, Tablet, Laptop kontrolieren. Beim Zugriff dachte ich, ich richte den Pi als Accesspoint ein.

    Wie euch vielleicht aufgefallen ist, ich bin in Sachen programmieren blutiger Anfänger.

    Wie mache ichs am besten?

  • Hallo, ich bin auch gerade dabei einen Roboter mit dem Raspberry Pi zu entwickeln und in Python zu programmieren. Ich habe den Roboter bis jetzt autark agieren lassen. Die Basis, also Motorsteuerung, Lenkung und Verbindung zu einem anderen Rechner (ssh) steht also schon. Ich habe jetzt angefangen eine GUI zu entwickeln. Für die Tastenabfrage benutze ich tkinter und callback events. Du kannst Dir ja mal tkinter und callback Events anschauen. Ich finde es eine ganz gute Alternative zu pygame
    Sobald ich meinen Code fertig und getestet habe, werde ich diesen auf meiner Homepage veröffentlichen. Dort findest Du auch den aktuellen Code von meinem Roboter eventuell hilft Dir der ja weiter.

    Der Link zum Roboter: https://blackit.de/category/pirobot/

    Einmal editiert, zuletzt von thinktux (20. Januar 2015 um 19:30)

  • Du kannst prinzipiell grafische Fenster über ssh -X pi@piserver übertragen. Daher müsste es eigentlich funktionieren. Wie gut die Übertragung ist muss ich schauen wenn es soweit ist. Da ich gerade mein Abitur mache, habe ich erst ab April wieder richtig Zeit. Kann also noch dauern bis es bei mir wirklich weiter geht...

  • Danke Dir, Du kannst auch immer mal wieder auf https://blackit.de vorbei schauen oder uns bei Twitter/Facebook suchen um auf dem laufenden zu bleiben. Inzwischen sind wir schon 5 Leute die auf dieser Plattform über Basteleien schreiben. Aber sobald ich weiter mache und die ersten Codes zur Steuerung auf der Seite habe. Melde ich mich hier nochmal. Vielleicht schreibt ja vorher schon jemand anderes etwas was mir dann auch zur Hilfe kommen kann :D
    Auf jeden Fall viel Erfolg mit deinem Projekt

  • Astorek86: Dem muss ich widersprechen :fies:

    Mithilfe von X11-Forwarding brauch man keinen X-Server installiert haben, nur der SSH-Client muss das unterstützen und auf Windows reicht dann sowas wie Xming.

    Ich hab auf meinen PI's kein LXDE o.ä. installiert aber kann mir trotzdem TKinter / PyQt Fenster auf dem Windows PC vom PI anzeigen lassen :fies:
    Das verwende ich sehr gerne/viel , siehe dazu: Grafische Umgebung über Netzwerk mit X11-Forwarding
    Das ist auch wesentlich Resourcenschonender (CPU/RAM) als VNC oder son Rotz.

  • Also ich hab Xming installiert und ich kann jetzt auch den Desktop per startlxde mit Putty starten, allerdings bekomme ich folgende Fehlermeldung wenn ich ein Programm mit tkinter starte:

    Code
    _tkinter.TclError: couldn't connect to display "localhost:10.0"

    Ich habe in Putty einen localhost angegeben, wodurch die Meldung oben verschwindet und folgende auftaucht:

    Code
    _tkinter.TclError: no display name an no $DISPLAY enviroment variable

    Mein:

    Code
    /etc/ssh/sshd_config

    sieht so aus:

    Einmal editiert, zuletzt von Schl87 (30. Januar 2015 um 23:15)

Jetzt mitmachen!

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