Threads mit dem PI

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Leute,
    ich habe eine Frage bezüglich Threads. Ich möchte mit meinem Script bewirken, dass sich mein Bot um die angegebene Grad-Zahl dreht.
    Ich verwende ein Pi 3 mit dem Modul HMC883l sowie einer Motorsteuerung.
    Damit ich ein Verständnis dafür bekomme, sollen noch einige andere Sensoren (DHT22, GPS, Ultraschall...) hinzukommen und miteinander zusammen kommunizieren.
    Mein Script sieht bisher so aus:

    Ich bin nicht so firm in Python... das so vorab. Ich habe mir das Script irgendwie zusammen gebastelt.
    Zur Sicherheit hänge ich es einfach noch mal an.

    Was geschieht, wenn ich das Script starte?
    Nun, ich werde nach der Richtung gefragt, die sich der Bot drehen soll. Nach Eingabe, dreht sich aber der Bot ständig um die eigene Achse.
    Das Script läuft ohne Ende weiter. Eine Fehlermeldung kommt nicht.

    Damit der Bot stehen bleibt, muss ich das Terminal schließen.
    Ich finde einfach den Fehler nicht. Die Variable "z" wird doch übergeben und hat doch einen Wert.... :denker:

    Vielleicht kann ja jemand helfen.

    Ich danke.

  • Bitte Beitrag bearbeiten und entweder den Code-Text entfernen, oder: FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten


    Wenn du 2 voneinander unabhängig laufende "Funktionen" hast, benötigst du eine Inter-Prozess-Kommunikation. Wenn die beiden "Funktionen" sogar in unterschiedlichen Scripts sind, muss diese IPC erweitert ablaufen.... Aber ohne zu wissen was Dein Ziel sein soll kann man dazu aber nicht wirklich mehr sagen.

    Bevor man in Details versinkt frage ich daher: Hast du zufällig vor Tkinter zu nutzen? Später irgendwann mal? Denn damit könnte man sich zusätzliche Threads sparen. Es gibt viele gute Gründe auf Threads zu verzichten.

  • Hallo,

    willkommen in der Hölle von `global` :) `global` verwenden gilt es zu vermeiden, weil man den Zustand des Programms schlecht bis gar nicht nachvollziehen kann. Abgesehen davon, dass man in 99,9% aller Fälle ohne `global` auskommt.

    Wenn zwei Threads miteinander kommunizieren sollen, dann geht das über eine Queue (abgesehen davon bin ich noch nicht mal sicher, ob das schlechte `global` zwischen Threads überhaupt funktioniert).

    Im vorliegenden Fall brauchst du IMHO aber keine Threads, das geht auch in einer Funktion: Motor starten, in einer Schleife die Position via Gyroskop abfragen und wenn's passt die Motoren stoppen.

    Gruß, noisefloor

  • Zitat

    Im vorliegenden Fall brauchst du IMHO aber keine Threads, das geht auch in einer Funktion: Motor starten, in einer Schleife die Position via Gyroskop abfragen und wenn's passt die Motoren stoppen.

    Ich bin neu in Sachen Python unterwegs. Was ist IMHO?

    Zitat

    Bevor man in Details versinkt frage ich daher: Hast du zufällig vor Tkinter zu nutzen? Später irgendwann mal? Denn damit könnte man sich zusätzliche Threads sparen. Es gibt viele gute Gründe auf Threads zu verzichten.

    Ich habe mir das noch nicht so genau angeschaut. Ich finde das nicht mal so schlecht. Findest du nicht auch, dass man zuerst Python erlernen muss, damit man zum nächsten Level aufsteigen kann?

    Ich muss erst verstehen, wie man was macht.

    Wie könnte man das Script verbessern... ähm optimieren?

  • Hallo,

    IMHO = engl. Abk. für: "meiner bescheidenen Meinung nach" - hat also nix mit Python zu tun, ist eine (IMHO ;) ) gängige Abkürzung in Foren.

    Zitat

    Findest du nicht auch, dass man zuerst Python erlernen muss, damit man zum nächsten Level aufsteigen kann?


    Schon, ABER: wenn du das Programm jetzt für die Kommandozeile brauchst und später z.B. mit Tkinter ein GUI dafür schreiben willst, schreibst du große Teile neu und die brauchst für Tkinter auch i.d.R. kein Threading. Darauf zielte die Frage ab.

    Zitat

    Wie könnte man das Script verbessern... ähm optimieren?


    Steht doch oben - entweder alles in eine Funktion oder eine Queue für die Kommunikation. Und in dem Zuge alle `global` los werden. Also am besten fängst du mal an zu coden. Und wenn du nicht weiter kommst am besten noch mal hier posten und den aktuelle Ist-Stand des Codes zeigen.

    Gruß, noisefloor

  • Hi,

    ich habe ein wenig am Script gebastelt und einige Veränderungen vor genommen. Sobald ich das Programm ausführe und eine Zahl ein gebe, drehen die Räder.

    Hier mal der neue Code:

    Ich bin total überfragt, warum die Motoren nach Eingabe der Gard-Zahl endlos drehen. Ich habe die Variablen Z und Turn schon mittels Print-Anweisungen im Bereich "Motorsteuerung" ausgelesen. Es kommen aber am Ende keine vernünftigen Werte raus.

    Kann mir jemand sagen, woran das liegen mag? Habe ich was übersehen?


    Danke
    Grüße

    Einmal editiert, zuletzt von VolkerPI (12. Mai 2017 um 21:42)

  • Hallo Volker,

    Du nutzt globale Variablen.
    Du gibst einen Wert für turn ein - weist dann aber turn val zu. Letzteres ist 0.

    In den Funktionen verwendest Du die gleichen Variablennamen - als interne Variablen.

    Schau Dir doch mal in einem Python-Tutorial die Gültigkeitsbereiche von Variablen an.

    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 (12. Mai 2017 um 22:05)

  • Hallo Andreas,

    ich hab ein wenig herum geschmökert. Ja, ich habe einiges erfahren. Ich habe die globalen Variablen verschwinden lassen. Ich kenne das von C, da muss man die Variablen erst bekannt machen.
    Was ich aber nicht verstehe ist der Abschnitt vom Gyroskop. Warum liefert "Z" nicht die Grad-Angabe? Wenn ich das Programm als solches laufen lasse, also ohne Motorsteuerung, dann bekomme ich auch den richtigen Wert angezeigt.

    Irgendwo muss doch die Info sein, die "Z" so verkorxt...

    Ich habe die Variablen "val" bereits geändert und mit dem Original angeglichen.

    Ich verstehe das noch nicht. Vielleicht hast du noch ein Tipp...

    grüße
    V

    Einmal editiert, zuletzt von VolkerPI (15. Mai 2017 um 20:51)

  • Hallo Leute,

    ich komme einfach nicht weiter. Mache ich da was falsch? Ich habe wieder am Script gebastelt. Sobald ich das Programm laufen lasse, sehe ich, dass sich die Grade ändern, die Motoren aber nicht stehen bleiben.

    Ich habe ein paar Print-Befehle eingebaut. Warum stoppen die Motoren nicht, wie geplant? Ich frage doch die neuen Grade nach jedem Durchlauf ab...

    Wie gehe ich die Sache an? :helpnew:

    Die Ausgabe würde so aussehen:

    Grad Zahl fuer die Drehung des Roboter-Autos: 100
    Speed: 0.7
    -182 Grad < 0
    Speed: 0.7
    -189 Grad < 0
    Speed: 0.7
    -195 Grad < 0
    Speed: 0.7
    -93 Grad < 0
    Speed: 0.7
    -110 Grad < 0
    Speed: 0.7
    -155 Grad < 0
    Speed: 0.7
    -195 Grad < 0
    Speed: 0.7
    -78 Grad < 0
    Speed: 0.7
    -113 Grad < 0
    Speed: 0.7
    -151 Grad < 0
    Speed: 0.7
    -183 Grad < 0
    Speed: 0.7
    -190 Grad < 0
    Speed: 0.7
    -97 Grad < 0
    Speed: 0.7
    -142 Grad < 0
    Speed: 0.7
    -182 Grad < 0
    Speed: 0.7
    -175 Grad < 0
    Speed: 0.7
    -95 Grad < 0
    Speed: 0.7
    -118 Grad < 0
    Speed: 0.7
    -153 Grad < 0
    Speed: 0.7
    -183 Grad < 0
    Speed: 0.7
    -195 Grad < 0
    Speed: 0.7
    -89 Grad < 0
    Speed: 0.7
    -135 Grad < 0
    Speed: 0.7
    -175 Grad < 0
    Speed: 0.7
    -192 Grad < 0
    Speed: 0.7
    -94 Grad < 0
    Speed: 0.7
    -118 Grad < 0
    Speed: 0.7
    -161 Grad < 0
    Speed: 0.7
    -191 Grad < 0
    Speed: 0.7
    -102 Grad < 0
    Speed: 0.7
    -121 Grad < 0

    oder

    Grad Zahl fuer die Drehung des Roboter-Autos: 200
    Speed: 0.7
    10 Grad > 0
    langsamer, Differenz +-15 Grad
    Speed: 0.5
    4 Grad > 0
    langsamer, Differenz +-15 Grad
    Speed: 0.5
    30 Grad > 0
    Speed: 0.5
    49 Grad > 0
    Speed: 0.5
    75 Grad > 0
    Speed: 0.5
    85 Grad > 0
    Speed: 0.5
    67 Grad > 0
    Speed: 0.5
    12 Grad > 0
    langsamer, Differenz +-15 Grad
    Speed: 0.5
    13 Grad > 0
    langsamer, Differenz +-15 Grad
    Speed: 0.5
    37 Grad > 0
    Speed: 0.5
    53 Grad > 0
    Speed: 0.5
    83 Grad > 0
    Speed: 0.5

    Wäre super, wenn ich da an der Stelle Hilfe bekomme.

    Ich bedanke mich... :danke_ATDE:

    Volker

    Einmal editiert, zuletzt von VolkerPI (20. Mai 2017 um 00:08)

  • Fang doch erst mal damit an dein Script aufzuräumen und etwas Ordnung da rein zu bringen...

    Imports und vor allem Konstanten zusammen an einem Platz, nicht wild irgendwo im Script verteilt.... erst legt du "bus" usw fest, dann fragst du "turn" ab und danach steht schon wieder eine "speed" Konstante?

    Das nächste wäre, dass deine (deutschen) Kommentare im Script überflüssig sind. Kommentare sollen dem Leser einen gewissen Mehrwert bieten und nicht einfach das beschreiben, was sowieso klar ist. Zum Beispiel, das eine "import" Zeile ein Module import, ist selbstredend. Oder wo die Kommentare stehen kann auch wichtig sein.

    Überleg dir zutreffendere Variable- oder Konstanten- Namen. Zumindest mich verwirrt dieses "turn" und "grad" gemurxe ... Mal englisch mal deutsch trägt zur Verwirrung und dem Chaos bei. Ebenso wie mal pro Einrückung nur 2 Leerzeichen, mal aber 4 Leerzeichen oder sogar 8? Einheitlich 4 Leerzeichen pro Einrückung, überall!


    Lass die ganze Motorsteuerungsgeschichte erst mal weg, um festzustellen ob deine Verarbeitung überhaupt korrekt ist. Wenn du eh überall print's stehen hast müssen die dir ja signalisieren ob deine Bedingungen und Abfragen/Abläufe richtig sind. Wenn das passt müsste auch die Motorsteuerung laufen, wenn nicht stimmt diesbezüglich etwas nicht.

  • Hi,

    so, ich habe das überflüssige raus und die Abstände "eingebaut". Das alles macht aber das Script nicht besser in der Hinsicht, dass es nicht richtig funktioniert.
    Ich habe die Variablen übersetzt und die Konstanten nach oben geschoben.

    Was macht das Script? Nun, die Printanweisungen geben eifrig die aktuelle Position aus. Wie ich aber sehe, kommt es nie zur letzten If-Anweisung, bei der die Motoren stoppen.
    Das ist genau das, was ich nicht verstehe. Wenn ich das ganze nachrechne, sind das die Werte, die auch angezeigt werden.

    grüße
    volker

  • Hi,

    oh, ich hab das doch glatt vergewssen.. :blush:

    Ich hoffe, dass ich das gemurxe reduziert habe. Nach dem Start sieht man, dass das Gyroskop auf was liefert. Was für mich nicht verständlich ist, dass der Motor sich immer dreht. Er gelangt nicht zur letzten IF-Anweisung.

    Muss ich da noch eine Schleife hoch zählen lassen, damit er grad für grad sich dreht? oder gibt es hier eine andere Lösung.

    Die Variable "turn" soll ja der Winkel sein, bei dem der Bot stehen soll. In "angle" ist die aktuelle Position. Warum ist "turn" nie = "angle"?

    :danke_ATDE:

Jetzt mitmachen!

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