Ich habe in letzter Zeit viel über Subsumption Architecture gelesen und es gibt verschiedene Möglichkeiten, wie sich die Leute dafür einsetzen.
Zum Beispiel verwenden einige Leute eine globale "Flag" -Variable, damit eine Aufgabe die Kontrolle übernimmt. Andere benutzen das endTimeSlice()
und erlauben dem Schiedsrichter, wirklich zu wählen. Und ich denke das ist richtig.
Ich habe diesen kleinen Abschnitt des RobotC- Codes, an dem ich für einen Zeilenfolge-Roboter arbeite, bin mir aber nicht sicher, ob ich es richtig mache, da derzeit die Track-Methode immer die Find-Methode übernimmt. Der richtige Fluss sollte sein, dass der Fund den Roboter über einen spiralförmigen Pfad zur Linie führt, um die Linie zu finden. Sobald die Linie gefunden ist, sollte die Spur übernehmen.
task evade(){
if(SensorValue(forwardSonarSensor) > threshold){
//box the obstruction
}
}
task find(){
if(SensorValue(lightSensor) > threshold){
//spiral the robot
}
}
task track(){
if(SensorValue(lightSensor) < threshold){
//go straight
}else{
//execute turns to follow the line
}
}
task main(){
while(true){
StartTask(evade,9);
StartTask(track,8);
StartTask(find,7);
wait1Msec(250);
}
}
Ich habe hier nur einige Kommentare anstelle des eigentlichen Codes verwendet, um es kurz zu halten. Sind meine if-Aussagen als Bedingungen nicht gut genug, denn wenn der Roboter aus der Reihe ist, track()
übernimmt. Liegt das an der else-Anweisung in der Spur? Wenn ja, wie kann track()
man Züge durchführen, wenn die Leine verloren geht, ohne zu Beginn des Programms das Futter zu übernehmen?
quelle
StartTask
, die Priorität der Aufgabe? Wird 9 die höchste Priorität haben? Sollte in diesem Fall nichtfind
mehr Priorität haben alstrack
? In der Tat sind der Zustand vonfind
und derelse
Zustand vontrack
gleich. Was würden Sie als Mensch tun, wenn der Sensorwert größer als der Schwellenwert ist? Auf Spirale gehen oder drehen, um die Linie anzupassen?Antworten:
Mit Subsumtion Architektur, sollten Sie sorgfältig Ihr Verhalten in so gestalten , dass , wenn Sie assign Aufgabe
T
Prioritätn
, dannT
sollte das sein , was der Roboter tun soll , wenn alle Aufgaben mit höherer Priorität alsn
ignoriert werden.Lassen Sie uns Ihre Beispielaufgaben bestellen und dann einen Weg finden, sie zu implementieren. Ihre Aufgaben sind
evade
,find
undtrack
.Im Allgemeinen möchten Sie, dass der Roboter eine Linie verfolgt. Wenn es die Linie jedoch nicht erkennen konnte, sollte es versuchen, sie zu finden. Vor allem sollte es Hindernissen ausweichen. Dies gibt uns die folgende Reihenfolge:
evade
find
track
Der Grund
find
hat eine höhere Priorität als der,track
dass Sie, wie oben erwähnt,track
nur dannevade
undfind
unnötig sind. Wenn Siefind
unten angebentrack
, bedeutet dies, dass Sie mit der Verfolgung beginnen, wenn kein Hindernis vorhanden ist, auch wenn Sie nicht in der Leitung sind.Schauen wir uns nun Ihre Implementierung an:
Denken Sie daran, dass wir
find
eine höhere Priorität gegeben haben. Wenn der Roboter das nicht erkennen kannlightSensor
, wird er spiralförmig versuchen, die Linie zu finden. Sobald dies der Fall ist,track
tritt ein. Wie Sie sehen können, tritt derelse
Zustand vontrack
nie auf.Während dies funktioniert, würde sich der Roboter sehr ungeschickt bewegen. Angesichts des aktuellen Aufbaus Ihres Roboters können Sie nicht viel dagegen tun.
Ich habe Ihre Frage zwar bereits beantwortet, aber hier ist eine einfache Verbesserung Ihrer Leitungsverfolgung:
Verwenden Sie anstelle eines Lichtsensors zwei.
ls_left
undls_right
. Mit (mindestens) zwei Sensoren können Sie nachvollziehen, ob Sie sich vollständig außerhalb der Spur befinden oder kurz davor stehen, die Spur zu verlassen. Im zweiten Fall können Sie leicht in die richtige Richtung abbiegen und wieder auf Kurs kommen.Ihre
find
Aufgabe ist ähnlich:Das heißt, Sie gehen nur dann spiralförmig vor, wenn Sie überhaupt nichts spüren
Ihre
track
Aufgabe wird jetzt effizienter:Mit einer Matrix von Lichtsensoren können Sie natürlich besser beurteilen, wie schlecht Sie aus der Spur geraten (dh mit welchem Winkel), und besser entscheiden, wie Sie wieder auf die Spur kommen (dh mit welcher Winkelgeschwindigkeit).
quelle
kurze Antwort; Nein, Sie müssen die Dinge wirklich ganz anders machen.
lange unvollständige Antwort; Lassen Sie mich Ihnen einen für robotC geeigneten Pseudocode geben, der Sie auf einen besseren Weg bringt. Verwenden Sie zunächst keine Aufgaben - dies ist NICHT der Zweck von robotC-Aufgaben. Sie könnten zum Funktionieren gebracht werden, vielleicht, vielleicht auch nicht (und Sie müssen einige Änderungen vornehmen, um es überhaupt zu versuchen).
hier gibt es ein paar Dinge; Priorität wird irrelevant. So schön es scheint, Aufgaben in robotC mit Prioritäten zu haben, sie sind meiner Erfahrung nach keine gute Wahl für die Implementierung von Subsumtionen. Aus Gründen wie Prioritäten werden Prioritäten nicht immer eingehalten, Aufgaben können (manchmal) nicht unterbrochen werden. Wenn also ein Ereignis mit höherer Priorität eintritt, reagiert es nicht wie erwartet. RobotC wurde erst kürzlich wieder eingeführt, sodass beispielsweise auf einen Sensor zugegriffen werden kann von mehr als einer Aufgabe kann riskant sein (I2C-Timing-Probleme), und in einigen Fällen ist dies nicht der Fall (automatisch abgefragte Sensoren).
Sie können der obigen Schleife Ihre eigene Prioritätsimplementierung hinzufügen, wenn die Dinge funktionieren, aber sie wird für Starts wirklich nicht benötigt.
Ihr Kommentar "// Box the Obstruction" beschreibt ein ballistisches Verhalten. Diese sind mit Multitasking etwas schwierig zu implementieren. Die einfache Schleife, die ich verwendet habe, macht es viel einfacher und besser für Anfänger / Lernen.
Die andere Sache, die ich Ihnen überlassen werde, ist, dass die Subsumtion, obwohl sie ordentlich und für viele Dinge angemessen ist, kein guter Weg ist, um das umzusetzen, was traditionell besser gemacht wird. In der Tat mag der Teil "Ausweichen" ein guter Kandidat für die Subsumtion sein, aber ehrlich gesagt sollte Ihre andere Aufgabe "GoOnAboutYourBusiness" heißen. Ich sage das, weil Sie wahrscheinlich nicht von der Suche zur Verfolgung mit Subsumtion wechseln möchten. Behandeln Sie diese mit herkömmlichen Programmierschleifen. - Wird bei einem einzelnen Sensor das Licht dunkler oder heller wahrgenommen als bei der letzten Schleife? Wenn es dunkler wird (unter der Annahme einer schwarzen Linie), drehen Sie weiter in die gleiche Richtung. Wenn es heller wird, drehen Sie sich in die andere Richtung. Wenn es gleich bleibt, fahren Sie geradeaus. Sie müssen wahrscheinlich etwas PID hinzufügen und eine Lenkkurve verwenden, anstatt nur nach links und rechts zu drehen, um glatter zu sein.
Und ja, mehrere Sensoren helfen. http://www.mindsensors.com/ - Ja, das bin ich derzeit im Film (10.11.2012)
Update: aktueller Code
Ich werde dies in Kürze ausprobieren, aber es kompiliert und illustriert, was ich oben geschrieben habe:
quelle