Skocz do zawartości

Linefollower - moja implementacja pd


sofnir

Pomocna odpowiedź

Hej, chciałbym prosić o pomoc doświadczonych kolegów z forum o ocenę mojej implementacji kodu do linefollowera i rozwiązanie problem.

Funkcja obliczająca zmianę:

void calculateChange()
{
 error = 0 - currentPosition; // 0 is my wanted position
 derivative = error - prevError;
 prevError = error;
 change = kp * error + derivative * kd;  
}

Warto powiedzieć, że currentPosition może przyjmować wartości -2, -1.5, -1, 0, 1, 1.5, 2 (mam tylko 4 czujniki).

Funkcja ustawiająca prędkość:

void setMotorsSpeed()
{
 leftMotorSpeed = motorSpeed - change;
 rightMotorSpeed = motorSpeed + change;

 if(leftMotorSpeed > motorSpeed) 
   leftMotorSpeed = motorSpeed;
 else if(leftMotorSpeed < 0) 
   leftMotorSpeed = 0;

 if(rightMotorSpeed >= motorSpeed) 
   rightMotorSpeed = motorSpeed;
 else if(rightMotorSpeed <= 0)
   rightMotorSpeed = 0;
}

motorSpeed mam ustawiony na 255 (maksymalna wartość PWM). Z kodu można wywnioskować, że na linii prostej silniki mają po 255 speeda, a na zakrętach jeden z nich zwalnia. Czy taka implementacja kodu jest prawidłowa, czy można to zrobić dużo lepiej, bo ja często widziałem, że ludzie robią np. wartość środkową 125 i do niej dodają i odejmują wartości, ale wtedy na prostej robot będzie jechał z prędkością 125 i 125, a w moim przypadku 255 i 255.

Moje dodatkowe pytanie, jak w moim przypadku ustalić współczynniki kp i kd oraz czy we wzorze change = kp * error + derivative * kd powinna być suma tych wartości, czy różnica: change = kp * error - derivative * kd?

Czytałem, że powinno się podwyższać kp, aż do momentu jak robot zacznie oscylować, a następnie podzielić kp/2 i zacząć zwiększać kd aż do uzyskania zamierzonego efektu, ale ja tak próbowałem i nie daje mi to dobrych rezultatów.

Za wszelką pomoc bardzo dziękuję i pozdrawiam 🙂

PS najlepsze jak dotąd wyniki uzyskałem dla motorSpeed = 255, kp = 127, kd = 0 (więc po co to kd, ona ma niby wygłuszać drgania, i faktycznie dla np. kp = 75, kd = 20 robot jeździ płynniej, ale całą trasę pokonuje wolniej).

Link do komentarza
Share on other sites

Nie mam żadnego doświadczenia w strojeniu PD dla LFów, ale zawsze byłem przekonany, że regulujemy najpierw P, aż robot będzie w miarę dobrze jeździć po linii, a następnie D, żeby lepiej radził sobie na zakrętach. Próbowałeś tak, bez dzielenia P na pół? Co do drugiego pytania - wartości korygujące wychodzące z poszczególnych członów sumujemy 🙂

Link do komentarza
Share on other sites

Warto powiedzieć, że currentPosition może przyjmować wartości -2, -1.5, -1, 0, 1, 1.5, 2 (mam tylko 4 czujniki).

ja bym unikał wartości niecałkowitych 🙂

PS najlepsze jak dotąd wyniki uzyskałem dla motorSpeed = 255, kp = 127, kd = 0 (więc po co to kd, ona ma niby wygłuszać drgania, i faktycznie dla np. kp = 75, kd = 20 robot jeździ płynniej, ale całą trasę pokonuje wolniej).

Dodałeś jakąś stałą czasową dla członu D? Bez tego nie ma on żadnego sensu. W przypadku moich robotów kD było zawsze znacznie większe od kP. Patrząc na Twój kod kP masz podejrzanie wysokie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.