PiPs4Controller ohne Ausgabe

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
JollyJumper83
User
Beiträge: 8
Registriert: Mittwoch 7. September 2022, 21:56

Hallo liebes Forum,

ich glaub ich check es gerade nicht. Ich habe mein Robotik Projekt gut vorangetrieben und alles funktioniert einwandfrei. Nun habe ich auch den PS4 Controller connectet und meine Funktionen und Ausgaben geschrieben. Läuft wirklich problemfrei, aber eine Sache check ich nicht oder sehe den Wald vor lauter Bäumen nicht mehr.

Wenn ich den Controller eingebunden habe und die Methoden so umschreibe wie ich es brauche, werden trotzdem die ganzen Ausgaben des Controllers in die Konsole geschrieben. Kann man das irgendwie unterdrücken?

Code: Alles auswählen

from pyPS4Controller.controller import Controller

class MyController(Controller):

    def __init__(self, **kwargs):
        Controller.__init__(self, **kwargs)

    def on_x_press(self):
        #p1.ChangeDutyCycle(20)
        print("START")

controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv=False)
# you can start listening before controller is paired, as long as you pair it within the timeout window
controller.listen(timeout=60)
command = controller.listen()
Bin für jeden Tipp dankbar!
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was für Meldungen, und warum müssen die weg?
JollyJumper83
User
Beiträge: 8
Registriert: Mittwoch 7. September 2022, 21:56

Dieses bekomme ich bei jeder Berührung von Tasten und Sticks angezeigt. Somit werden alle Print-Ausgaben überschrieben.

Ausgabe Konsole:
...
on_R3_right: 5405
on_R3_up: -32767
on_R3_right: 6080
on_R3_right: 6418
on_R3_right: 6080
on_R3_up: -31417
on_R3_right: 5405
on_R3_up: -30404
on_R3_up: -28715
on_R3_right: 5067
on_R3_up: -27026
on_R3_right: 4391
on_R3_up: -22634
on_R3_right: 2702
on_R3_up: -9459
on_R3_x_at_rest
on_R3_y_at_rest
....
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine spektakulär miese Bibliothek. Die macht das halt so. Siehe https://github.com/ArturSpirin/pyPS4Con ... ler.py#L25

Wenn du die weiter benutzen willst, musst du jede einzelne Methode überladen, die du nicht sehen willst. Oder einfach den Code in dem Ding ersetzen mit pass-statements. Oder statt dieser komischen überladung einen delegate mitgeben, der nur existierende Methoden aufgerufen bekommt.
JollyJumper83
User
Beiträge: 8
Registriert: Mittwoch 7. September 2022, 21:56

Vielen Dank für deine Antwort. Ich werde mir die Bibliothek nachher mal anschauen und eine Lösung finden.

Ich habe aber nochmal eine ganz grundsätzliche Frage, da ich an dieser Stelle das erste mal auf dieses Problem stoße.
Vielleicht kann mir jemand einen Tipp geben, wo ich das nachlesen / nachschauen kann.

Im Beispiel des PS4 Controllers kommt das Programm in die Schleife zur Befehlsentgegennahme vom Controller. Diese Schleife kann jedoch nie verlassen werden. Was mir auch irgendwie einleuchtet, da sonst ja kein Befehl mehr im Programm ankommt. Aber wie handle ich soetwas.
Speziell in meinem Fall, verwende ich den PS4 Controller zum steuern des Roboters, im weiteren Verlauf des Programmes, kommen aber weitere Funktonen hinzu, z.B. erhalte ich GPS Daten und Entfernungsdaten aus einem Lidar. Jetzt ist es so, dass ich diesen Punkt im Programm aber nicht mehr erreiche, da sich die Funktion (Klasse) in einer Schleife befindet.

Ich bin mir sicher das es dafür eine einfache Logik geben wird, wie man mit solchen Themen umgeht. Ich würde mich über jeden Hinweis freuen, da ich glaube das es sich hier um eine strukturelle Angelegenheit handelt. Bislang waren meine Programme die ich geschrieben habe, immer in einer Main.py untergebracht. Jetzt ist es das erste mal das es einen größeren Umfang annimmt.

Danke im Voraus !
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine einfache Logik gibt es nicht. Das ist eines der anstrengensten Probleme, die man so hat bei der Programmierung. Weil das wahlweise ereignis-basiert wird, oder nebenlaeufig. Bei ersterem hat man eine Hauptschleife, und es werden Ereignisse - wie hier die Tastendruecke und Steuerbewegungen - abgeliefert. Da hat man dann ueblicherweise auch noch einen Mechanismus, um in regelmaessigen Intervallen Ereignisse zu erzeugen, um wiederkehrende Aufgaben wie eben eine Motoransteuerung vorzunehmen.

Bei deinem Problem hast du ja einen Dateideskriptor, und den wiederum koennte man da rausloesen, und statt dieser blockierenden Schleife das select.select oder select.epoll vorwerden. Zusammen mit https://pypi.org/project/linuxfd/1.4.4/ kann man dann auch Timer-Events erzeugen.

Die vermeitlich einfachere Alternative ist dann Nebenlaeufigkeit mit Threads oder gar Prozessen. Damit kann man zwar schoen mehrere Schleifen laufen und blockieren lassen, aber dann muss man den Zoo an parallelen Vorgaengen erstmal wieder einfangen. Und in schoener Regelmaessigkeit fuehrt das zu Problemen.
JollyJumper83
User
Beiträge: 8
Registriert: Mittwoch 7. September 2022, 21:56

Ach Mensch - wie immer - da stellt man eine Frage und weiß dann postwendend wonach man suchen sollte.
Ich glaube das Schlüsselwort heißt hier Threads - kann das sein?

viewtopic.php?t=7081

http://docs.python.org/lib/module-thread.html

http://docs.python.org/lib/module-threading.html

http://www.python-forum.de/topic-3869.html
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist der zweite oben angesprochene Ansatz. Das geht, hat aber eben so seine eigenen Tuecken.
JollyJumper83
User
Beiträge: 8
Registriert: Mittwoch 7. September 2022, 21:56

__deets__ hat geschrieben: Donnerstag 8. September 2022, 12:58 Eine einfache Logik gibt es nicht. Das ist eines der anstrengensten Probleme, die man so hat bei der Programmierung. Weil das wahlweise ereignis-basiert wird, oder nebenlaeufig. Bei ersterem hat man eine Hauptschleife, und es werden Ereignisse - wie hier die Tastendruecke und Steuerbewegungen - abgeliefert. Da hat man dann ueblicherweise auch noch einen Mechanismus, um in regelmaessigen Intervallen Ereignisse zu erzeugen, um wiederkehrende Aufgaben wie eben eine Motoransteuerung vorzunehmen.

Bei deinem Problem hast du ja einen Dateideskriptor, und den wiederum koennte man da rausloesen, und statt dieser blockierenden Schleife das select.select oder select.epoll vorwerden. Zusammen mit https://pypi.org/project/linuxfd/1.4.4/ kann man dann auch Timer-Events erzeugen.

Die vermeitlich einfachere Alternative ist dann Nebenlaeufigkeit mit Threads oder gar Prozessen. Damit kann man zwar schoen mehrere Schleifen laufen und blockieren lassen, aber dann muss man den Zoo an parallelen Vorgaengen erstmal wieder einfangen. Und in schoener Regelmaessigkeit fuehrt das zu Problemen.
Besten dank! Ich werde mich jetzt mit dem Thema der Threads beschäftigen. Ich denke das wird meine Problematik lösen.
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dazu nur https://twitter.com/davidlohr/status/28 ... 0GxpKJHF3g

Viel Erfolg. Wirst du brauchen 😬
Antworten