LabVIEWForum.de - Laufendes VI abbrechen

LabVIEWForum.de

Normale Version: Laufendes VI abbrechen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Zusammen
ich habe folgendes Problem:
Ich programmiere einen Roboter welcher autonom auf einem Spielfeld fährt und dort verschiedene Aufgaben erfüllt. Wenn ein Gegnerischer Roboter erkannt wird, soll der Roboter sofort anhalten, einen neuen Weg berechnen und diesem folgen.
Das Problem liegt nun darin, dass wenn während der Fahrt ein Gegner erkannt wird, bricht die Fahrfunktion erst ab, wenn sie fertig ausgeführt wurde. Das ist natürlich zu spät, der Roboter muss sofort anhalten. Ich habe bereits folgende Varianten ausprobiert:

Fahrfunktion in eine While-Schlaufe. Als Abbruchkriterium die Gegnererkennung.
Fahrfunktion in eine Case-Struktur. Die Gegnererkennung ändert dann den Case von "Fahren" auf "Stoppen"
Interrupt: Die Fahrfunktion würde zwar abbrechen und es könnte auch ein zusätzlicher Weg eingeschlagen werden. Sobald dieser aber komplett absolviert wurde, würde der Roboter wieder versuchen den alten Code auszuführen.

Hat irgendjemand eine Idee? Besten Dank für eure Hilfe.

Gruss Patrik
Hallo Patrik,

Standardantwort auf solche Fragen: programmier eine Statemachine!

Einer deiner States erledigt dann das Fahren, aber jeweils nur für kleine Teilstücke des Weges. Nach jedem Teilstück wird geprüft, ob weitergefahren oder angehalten werden muss...
Hoi Gerd
Danke für deine schnelle Antwort. Leider ist die Sache etwas komplexer. Damit der Roboter "schön" fährt ist der Ablauf um von A nach B zu gelangen wie folgt programmiert:

1. Der Roboter berechnet den Winkel sowie die Distanz zum Endpunkt. Ebenfalls wird hier die maximale Geschwindigkeit festgelegt, mit welcher der Roboter maximal fährt. (Streckenabhängig)
2. Der Roboter dreht sich in Richtung des Endpunktes. (Da viele Hindernisse im Weg stehen, sollte der Roboter möglichst gerade fahren. Deshalb zuerst das Ausrichten)
3. Der Roboter beschleunigt nach einer vorgegebener Funktion. (Um ein Durchdrehen der Räder zu vermeiden und somit einem Positionsverlust oder unkontrollierten Bewegungen vorzubeugen.)
4. Der Roboter fährt mit der Maximalgeschwindigkeit in Richtung des Endpunktes. Dabei regelt er den Winkel zum Endpunkt kontinuierlich.
5. Sobald der Roboter erkennt, dass er in der Nähe des Endpunktes ist, beginnt er nach einer gegebener Funktion abzubremsen.

Wenn ich nun eine Strecke in sehr viele Teilstrecken unterteile, funktionieren die obigen (bereits programmierten) Funktionen nicht mehr. Auch würde ich dadurch die Vorteile der streckenabhängigen Geschwindigkeit verlieren und das Beschleunigen und Abbremsen wäre schwierig zu realisieren. (respektive aufwendig zu ändern)

Es wäre wirklich sehr sinnvoll, wenn ich eine der obigen Funktionen sofort unterbrechen könnte, abbremsen, ein neues Ziel berechnen und dieses mit dem obigen Ablauf anfahren.

Gibt es nicht irgendeine Möglichkeit wie ich das erreichen kann? Wenn du willst, kann ich dir die Fahrfunktion schicken. Sie wird übrigens auf einer Singelboard-Rio resp. der FPGA ausgeführt. Die Strategie sollte aus Platzgründen auf den Prozessor.

Gruss Patrik
Hallo Patrik,

ich habe nicht geschrieben, dass der Roboter unterwegs stehen bleiben soll...
Deine Punkte 1-5 könnten alles States einer Statemachine sein. Man kann jeden State "abbrechen" und zu einem anderen State wechseln!

Du kannst das natürlich auch bei deinem jetzigen Stand erreichen: Einfach oft genug eine globale Variable pollen, die vom UserInterface gesetzt wird. Ob das dann "übersichtlicher"/"wartbarer" wird, bleibt dahingestellt...
Was stört dich denn an deinen Lösungen mit While- und For-Schleife? Klingen doch logisch.

Ansonsten muss ich Gerd zustimmen: Eine State-Machine bietet sich an


Gruß
Clyde
Besten Dank für Eure Hilfe.
Ich habs geschafft. Die Idee, die Strecke in Stücke aufzuteilen, ist sehr gut. Ich kann damit zwischen zwei Regelzyklen eingreifen. Da ein einzelner Regelzyklus im Millisekundenbereich liegt, entspricht das beinahe einer sofortigen Abschaltung. Die Entscheidung anzuhalten passiert wie von euch vorgeschlagen via Statemachine.

Nochmals besten Dank.
Gruss Patrik
Referenz-URLs