LineFollower v2

Ta konstrukcja jest kontynuacją mojego pierwszego linefollowera, który podążał za trójkolorową linią. Tym razem linia jest tylko czarna i ze skrzyżowaniami pod kątem prostym. Aby robot znał swoje położenie względem środka, dopuściłem się pewnego oszustwa. W rzeczywistości śledzę tylko lewą krawędź i na podstawie zmian natężenia światła odbitego od powierzchni określam dokładne położenie.

Śledzona linia jest dość cienka - ma około 1.5 cm, z czego użyteczna jest tylko połowa (po przejechaniu za środek robot całkowicie się gubi). Aby robot jeździł relatywnie gładko musiałem użyć algorytmu PID do sterowania. Algorytm ten bierze pod uwagę nie tylko jak bardzo robot zbacza z ustalonej trasy, ale także jak szybko się to dzieje, oraz jak jechał w przeszłości. Szczegółowe informacje na ten temat można znaleźć w Internecie.

Ze względu na to, że byłem w posiadaniu jedynie jednego czujnika światła (profesjonalne linefollowery mają kilkadziesiąt), robot musiał bardzo szybko reagować na otrzymywane sygnały. Konsekwencją tego jest dość nietypowa budowa, gdzie sam czujnik umieszczony jest bardzo blisko kół. Dzięki temu szybka korekcja toru jazdy nie powoduje nadmiernego przesunięcia sensora. Ze względu na zwrotność zdecydowałem się na dwa koła zamiast gąsienic oraz jedno koło tylne obracające się swobodnie.

Na filmie widać efekt końcowy. Robot jeździ dość niespokojnie, ale nie waha się od lewej do prawej. W 10 próbnych przejazdach ani razu nie zgubił drogi, nawet na skrzyżowaniu. Trasa testowa była niejednorodna, tzn. występowały zarówno ostre jak i gładkie zakręty. Program można zmodyfikować, aby robot jeżdził płynniej, jednak wtedy nie będzie pokonywał tak ostrych zakrętów.

Udoskonalanie programu, a zwłaszcza wyszukiwanie najlepszych parametrów działania zajęło mi kilka dni. Robot jeździ najszybciej jak się da. Po dalszym zwiększaniu prędkości przejechanie trasy zajmuje dłużej, bo ruch jest bardziej niespokojny. Z efektu końcowego jestem zadowolony. Polecam każdemu, kto ma kilka dni wolnego czasu na budowę i testy. Ja już planuję budowę jeszcze szybszego Linefollowera v3 używającego dwóch czujników!

Wideo


Galeria

Galeria 3D

Obrazy w tej galerii możesz oglądać jedynie przy użyciu specjalnych czerwono-niebieskich okularów. Można je nabyć w wielu sklepach internetowych za bardzo małe pieniądze.


Kod programu

//author: Krzysztof Kapusta, All rights reserved #define MOTORS OUT_BC #define SENSOR S1 unsigned int _MIN; unsigned int _MAX; unsigned int _MED; void init() { SetSensorType(SENSOR, SENSOR_TYPE_COLORRED); SetSensorMode(SENSOR, SENSOR_MODE_RAW); ResetSensor(SENSOR); int max = 0; int min = INT_MAX; unsigned long ctick = CurrentTick(); OnFwdSync(MOTORS, 30, -100); while(CurrentTick()-ctick < 700) { int read = Sensor(SENSOR); if (read < min) min = read; if (read > max) max = read; } Off(MOTORS); _MIN = min; _MAX = max; _MED = (max+min)*0.5; OnFwdSync(MOTORS, 30, 100); while(1.0*abs(Sensor(SENSOR) - _MED)/_MED > 0.05) {} Off(MOTORS); } #define Kp 0.17 // proportional value for PID controller #define Ki 0.000002 // integral value #define Kd 0.475 // derrivative value #define MAXTURNPCT 80 float _integral = 0; float _prevError = 0; int sideInd = 1; float computeTurnPct(int senRead) { int error = senRead - _MED; _integral += error; float turnPct = (Kp)*error + (Kd)*(error-_prevError) + (Ki)*(_integral); _prevError = error; ClearLine(LCD_LINE8); NumOut(0, LCD_LINE8, turnPct); if (abs(turnPct) > MAXTURNPCT) return sideInd*sign(turnPct)*MAXTURNPCT; else return sideInd*turnPct; } #define MAX_SPEED 60 task main() { init(); TextOut(0, LCD_LINE1, FormatNum("MIN (Black): %d", _MIN)); TextOut(0, LCD_LINE2, FormatNum("MAX (White): %d", _MAX)); int turn = 0; while(true) { turn = computeTurnPct(Sensor(SENSOR)); OnFwdSync(MOTORS, MAX_SPEED, turn); Wait(50); } }

Pokaż/ukryj cały kod

Komentarze

Nie korzystasz z programu (graficzne programowanie) który został dodany do robota?Ja zestaw N.X.T kupiłem 2 tygodnie temu i chciałbym zrobić Linefollower'a tylko nie radze sobie z programowaniem go .Może masz jakąś prostą instrukcje programowania albo link do programu z którego korzystasz.Będę bardzo wdzięczny za pomoc.

Dodane przez: Bl00man | 2012-02-03

Tragicznie dobrany sterownik PID. Z tego robota można wycisnąć sporo więcej przy odpowiedniej optymalizacji sterownika. Pozdrawiam.

Dodane przez: Poszu | 2012-01-22

Dodaj swój komentarz