Skocz do zawartości

Linefollower - moja implementacja pd


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 to post
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 to post
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 to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.