Ostatnio dużo czytałem o architekturze Subsumption i istnieje kilka różnych sposobów, za którymi ludzie się opowiadają.
Na przykład niektóre osoby używają globalnej zmiennej „flag”, aby mieć kontrolę nad zadaniem. Inni używają endTimeSlice()
i pozwalają arbitrom naprawdę wybrać. I myślę, że to prawda.
Mam tę małą sekcję kodu RobotC , nad którą pracuję dla linii następującej po robocie, ale nie jestem pewien, czy robię to dobrze, ponieważ obecnie metoda śledzenia zawsze przejmuje metodę znajdowania. Prawidłowy przepływ powinien być taki, że znalezienie powinno prowadzić robota do linii za pomocą spiralnej ścieżki, aby znaleźć linię. Po znalezieniu linii tor powinien przejąć kontrolę.
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);
}
}
Po prostu użyłem tutaj kilku komentarzy zamiast faktycznego kodu, aby był krótki. Czy moje stwierdzenia nie są wystarczająco dobre jako warunki, ponieważ gdy robot jest poza linią, track()
przejmuje kontrolę. Czy wynika to z oświadczenia else w ramach śledzenia? Jeśli tak, to w jaki sposób track()
wykonywać skręty, gdy straci linię bez przejmowania paszy na początku programu?
źródło
StartTask
są priorytetem zadania? Czy 9 będzie najwyższym priorytetem? W takim przypadku nie powinnofind
mieć większego priorytetu niżtrack
? W rzeczywistości stanfind
ielse
stantrack
są takie same. Więc jako człowiek, jeśli wartość czujnika jest większa niż próg, co byś zrobił? Iść spiralnie lub obrócić, aby ustawić linię?Odpowiedzi:
Z subsumcji Architektury, należy starannie zaprojektować zachowań w taki sposób, że jeśli przypisać zadanie
T
priorytetowen
, toT
powinno być to, co robot powinien zrobić, jeśli wszystkie zadania z wyższym priorytetem niżn
są ignorowane.Zamówmy przykładowe zadania, a następnie wymyślmy sposób ich realizacji. Twoje zadania są
evade
,find
itrack
.Zasadniczo chciałbyś, aby robot śledził linię. Jeśli jednak nie może wykryć linii, powinien spróbować ją znaleźć. Przede wszystkim powinien omijać przeszkody. To daje nam następujące zamówienie:
evade
find
track
Powodem
find
ma wyższy priorytet niżtrack
jest to, że, jak już wspomniano powyżej, będzietrack
tylko wtedy, gdyevade
ifind
są niepotrzebne. Jeśli umieściszfind
poniżejtrack
, oznacza to, że zaczynasz śledzić, jeśli nie ma przeszkody, nawet jeśli nie jesteś na linii.Teraz spójrzmy na twoją implementację:
Pamiętaj, że nadaliśmy
find
wyższy priorytet. Dlatego jeśli robot nie może wyczućlightSensor
, pójdzie spiralnie, próbując znaleźć linię. Kiedy to nastąpi ,track
rozpoczyna się. Jak widać,else
stantrack
nigdy się nie zdarza.Podczas gdy to działa, robot poruszałby się bardzo niezręcznie. Biorąc pod uwagę obecną wersję robota, niewiele można z tym zrobić.
Chociaż już odpowiedziałem na twoje pytanie, ale oto prosta poprawa śledzenia linii:
Zamiast jednego czujnika światła użyj dwóch;
ls_left
als_right
. Korzystając z (co najmniej) dwóch czujników, możesz zrozumieć, czy jesteś całkowicie poza torem, czy zamierzasz z niego wyjść. W drugim przypadku możesz łatwo skręcić we właściwym kierunku i wrócić na właściwy tor.Twoje
find
zadanie jest podobne:Oznacza to, że wchodzisz w spiralę tylko wtedy, gdy niczego nie wyczuwasz
Twoje
track
zadanie staje się teraz bardziej wydajne:Oczywiście dzięki matrycy czujników światła możesz lepiej ocenić, jak źle zboczysz z trasy (tj. Pod jakim kątem) i lepiej zdecydować, jak wrócić na tor (tj. Z jaką prędkością kątową).
źródło
krótka odpowiedź; nie, naprawdę musisz robić rzeczy całkiem inaczej.
długa niepełna odpowiedź; Pozwól, że dam ci kod psuedo odpowiedni dla robota C, który stawia cię na lepszej ścieżce. Po pierwsze, nie używaj zadań - nie do tego służą zadania robotC. Można je zmusić do pracy, a może nie (i trzeba sporo zmian, aby spróbować).
jest tu kilka rzeczy; priorytet staje się nieistotny. Choć wydaje się, że zadania w robocie C mają priorytety, wydaje się, że z mojego doświadczenia nie są dobrym wyborem do wdrożenia subskrypcji. Z powodów takich jak priorytety nie zawsze są honorowane, zadania nie mogą być przerywane (czasami), więc gdy wystąpi zdarzenie o wyższym priorytecie, nie zareaguje tak, jak się spodziewasz, robotC dopiero niedawno ponownie wszedł, więc rzeczy takie jak dostęp do czujnika od więcej niż jednego zadania może być ryzykowne (problemy z synchronizacją I2C), aw niektórych przypadkach nie jest (automatycznie odpytywane czujniki).
Możesz dodać własną implementację priorytetu do powyższej pętli, gdy zaczniesz działać, ale tak naprawdę nie jest potrzebna na początku.
Twój komentarz „// zakreśl przeszkodę” opisuje zachowanie balistyczne. Te są nieco trudne do wdrożenia przy użyciu wielozadaniowości. Prosta pętla, którą zastosowałem, sprawia, że jest to znacznie łatwiejsze i lepsze dla początkujących / uczących się.
Inną rzeczą, którą ci zostawiam, jest to, że zaspakajanie, chociaż jest schludne i odpowiednie dla wielu rzeczy, nie jest dobrym sposobem na wdrożenie tego, co lepiej zrobić tradycyjnie. Rzeczywiście część „unikania” może być dobrym kandydatem do subskrypcji, ale szczerze mówiąc, twoje inne zadanie powinno nazywać się „GoOnAboutYourBusiness”. Mówię to, ponieważ prawdopodobnie nie chcesz zmieniać z wyszukiwania na podążanie za subskrypcją. Obsługuj te z tradycyjnymi pętlami programowania. Za pomocą jednego czujnika - czy światło jest ciemniejsze lub jaśniejsze niż w ostatniej pętli? jeśli zrobiło się ciemniej (zakładając czarną linię), kontynuuj skręcanie w tym samym kierunku, jeśli stało się jaśniejsze, obróć w drugą stronę, jeśli pozostało to samo, idź prosto. Prawdopodobnie trzeba dodać PID i użyć krzywej sterowania zamiast po prostu skręcać w lewo i prawo, aby być płynniejszym.
I tak, wiele czujników pomaga. http://www.mindsensors.com/ - tak, to ja w filmie obecnie (11/10/2012)
Aktualizacja: aktualny kod
Wypróbuję to za chwilę, ale kompiluje i ilustruje to, co napisałem powyżej:
źródło