Skocz do zawartości
lubniewicz

Autonomiczy robot balansujący

Pomocna odpowiedź

Dt ma wynikać z częstotliwości wywolania funkcji w której wykorzystujesz do obliczeń dt. Hmmm rozumiesz? Obliczaj kat co 100hz (na razie tyle) i od razu wykonuj regulator stabilności. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Tak rozumiem i wiem, że dt ma wynikać z częstotliwości wywoływania funkcji, poprostu chciałem się dowiedzieć jaka częstotliwość wg Ciebie będzie dobra i chyba dobrze że się spytałem, bo myślałem ustawić wywoływanie funkcji co 200Hz.

Zrobiłem tak jak mówiłeś i już widze poprawę. Wydaje mi się, że zbyt często wywoływana była funkcja regulatora PID. Narazie sprawdzałem to dla starych nastaw i dla regulatora stabilności. Teraz na nowo dobiorę nastawy regulatora.

Poniżej wstawiam reakcję regulatora stabilności na kąt wychylenia robota. Tak to wyglądało przed zmianami (ustawieniem stałego dt). Jak dostroję regulator, to wrzucę nowy przebieg...

 

Test4_Działanie regulatora PID.jpg

Edytowano przez Borroq

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Rzeczywiście odpalasz funkcje co 200hz? Jak to zrobiłeś? Na timerach? Wywoływanie pid czy obliczanie kata w pętli glownej to absurd! Wywoluj funkcje co pewien czas 100 czy tam 200 hz. Tylko bez delay. 

Edytowano przez lubniewicz
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dla sprostowania. W programie nie używam delay wcale i nie wykonuję obliczeń w pętli głównej tylko w utworzonych do tego funkcjach, które wywoływane są w pętli głównej.  

Jak wspomniałem powyżej, zgodnie z twoimi zaleceniami odpalam funkcję co 100Hz. Na razie na szybko dodałem warunek który sprawdza mi upływ czasu za pomocy funkcji micros(), żeby sprawdzić czy będzie poprawa. Jak wspomniałem powyżej poprawa jest i to znacząca mimo że nie ruszałem jeszcze nastaw. Docelowo raczej zrobię to na przerwaniach z wykorzystaniem timera sprzętowego  8-bitowego.

Wykres, który dodałem dotyczy działania regulatora przed dzisiejszymi zmianami, czyli przed ustawieniem stałego dt.

Edytowano przez Borroq

Udostępnij ten post


Link to post
Share on other sites

Dokładnie, wykorzystaj timer. Ustaw aby dawał przerwanie co pewien czas. W przerwaniu wystaw flage, a w pętli glownej sprawdzaj ta flage. Jak bedzie wystawiona to wykonaj funkcje. Chodzi mi abys do samego przerwania nie wrzucał obliczen. Wystaw tylko flagę. Ok działaj. Nagraj jakiś filmik później. 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Dnia 19.08.2019 o 18:52, lubniewicz napisał:

Jestem już, nie mogłem wcześniej odpisać - obowiązki zawodowe. Robot będzie już stał na ... kołach. Robot będzie trzymał około 0 st. lecz będzie uciekał na boki bo jeszcze nie będzie miał PID prędkości, który będzie zadawał kąt. Pamiętaj, że te nastawy które teraz zrobimy mogę ulec delikatnie zmianie, ponieważ dopiero finalną regulacje zrobi się mając w sumie 3 PID. Więc nie zdziw się jak będziemy musieli jeszcze te nastawy zmienić. Będę mówił w skrócie o poszczególnych członach jako P, I, D. Jak powiem że masz zwiększyć np D to będę miał na myśli zwiększenie "ram_rejestr.p_kd". Proponuje na razie nie zakładać blokady WINDUP. Proponuje jednak aby kontrolować, aby suma błędów nie była za duża. To wyjdzie w regulacji. Ok zaczynamy:

  1. Ustaw kąt zadany na 0st.
  2. Zlikwiduj ograniczenie windup i wyświetlaj po UART jaki masz wynik na całym członie P, I, D oraz suma błędów (osobna dla każdego). Kąta już nie musisz wyświetlać po UART.
  3. Robota postaw pionowo. 
  4. Zwiększaj P aby robot zaczął oscylować w pobliży 0st, mam tutaj na myśli np w granicy od -5st do 5st. Ważne aby oscylował. Trzymaj robota w pionie, dłońmi trzymaj go z tyły i z przodu aby nie pojechał. Robot ma oscylować. Jak będzie oscylował to zmniejsz P tak aby już nie oscylował. To ma być tak na styk. Wiem, że mój opis jest mało dokładny ale lepiej nie umiem tego opisać. Resztę roboty przejmie człon I.
  5. Zwiększaj I aby robot znowu zaczął balansować. Jednocześnie sprawdzaj jaką masz sumę błędu. Nie może być ta wartość za duża. Szczegółowo o tym później napiszę.
  6. Teraz zwiększaj D, aż oscylacje będą mniejsze, krótsze. D można porównać do amortyzatora samochodowego. 
  7. Jak dobrze to ustawisz to robot powinien trzymać około 0 stopni i powoli odjeżdżać w tył lub przód. Mam tutaj na myśli, że może i musi przyspieszać w dany kierunek i ma trzymać około 0st. Nie może oscylować w miejscu ma delikatnie odjeżdżać w tył lub przód.

Jak to zrobisz przejdziemy dalej.   

PS. W żadnym wypadku dane wysłane po UART nie mogą blokować częstotliwości wywołania procesu 10ms. Ja to sprawdzałem na analizatorze stanów logicznych. To jest bardzo ważne. 

Proszę wytłumacz jeszcze blokadę WINDUP ? kiedy suma błędów jest za duża ?. Robot stanął na koła na ten czas na samym regulatorze P, i nie odpływał mi w jedną stronę tak jak piszesz, tylko trochę do przodu potem trochę do tyłu, ale ogólnie był prawie w miejscu, czy to źle ?

 

Edytowano przez Zbielu

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Tak bo masz regulator hmm.... "przeregulowany". Ta wiedza jest cenna 😁 ale podzielę się nią 😂. Słuchaj regulator musi dążyć do tego aby obiekt regulowany miał jak najmniejszy uchyb. Uchyb to różnica pomiędzy wartością zadaną a rzeczywistą, tak w mega skrócie. Załóżmy, że robot ma mieć kąt 90 stopni, a obecny kąt wynosi 88 stopni, więc uchyb to -2 stopnie (co do znaku to kwestia umowna). Jeżeli przeregulujesz nastaw na P to robot będzie tak jakby przeskakiwał np zamiast 90 stopni będzie regulowany na 88 -->> 93 -->> 88 -->> 93 wpada w oscylacje mniejsze i większe. Wysoka wartość współczynnika przy członie proporcjonalnym nie pozwoli osiągnąć zadanego kąta w tym przypadku 90 stopni. Założenie jest takie, że człon "P" robi około 70-80% całej regulacji (różnie zależy od regulowanego obiektu) a resztę roboty 30-20% już robi dużo dokładniejszy człon całkujący "I". I tutaj jest Twoje pytanie a jaki ba być Windup no własnie taki aby człon całkujący ograniczyć do tych powiedzmy 40% (czyli tak aby zapewnił 100% plus mały zapas). Czyli już w mega skrócie Człon "P" zgrubnie ustawia obiekt prawie do wartości zadanej, człon "I" uzupełnia braki do wartości zadanej bo jak wiesz mamy wzór P+I+D. Człon "D" jest tak jakby amortyzatorem tłumi drgania (jak w zawieszeniu samochodu). W członie D można przez przypadek pomylić znaki i zamiast pomagać to bardziej przeszkadza ale to już temat na inną rozmowę. Podsumowując ten wywód P prawie na 100%, a resztę robi I. Jak dasz za duży współczynnik na P to będzie bardzo nerwowy i może wpaść w duże oscylacje, tak jak tłumaczyłem będzie przestrzeliwał na lewo i prawo. P ma być zgrubny, a I na uzupełnienie. Rozumiesz? 

Edytowano przez lubniewicz
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Poniżej wykres przedstawiający pracę robota balansującego, gdzie: niebieski to kąt, a pozostałe to człony układu regulacji P, I, D, oraz PWM (wartość maksymalna PWM 12000)
Nastawy :
Kp-8000
Ki-25
Kd-50000

Poniżej filmik ok. 60s nagrywany podczas wykonywania pomiarów, czego wynikiem jest poniższy wykres.

image.thumb.png.998aa3de8bfae01b6c3f39a6fdfe4425.png

1 popr.rar

Edytowano przez Zbielu
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wrzuć logi do analizy. Rozumiem ze te dane masz przez uart? Dane wyrzycasz co 10 ms? 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Poniżej wykres przedstawiający pracę robota balansującego, gdzie: niebieski to kąt, a pozostałe to człony układu regulacji P, I, D, oraz PWM (wartość maksymalna PWM 12000)
Nastawy :
Kp-4500
Ki-14
Kd-25000

Poniżej filmik ok. 60s nagrywany podczas wykonywania pomiarów, czego wynikiem jest poniższy wykres.

 

image.png

2 popr.rar

5 minut temu, lubniewicz napisał:

Wrzuć logi do analizy. Rozumiem ze te dane masz przez uart? Dane wyrzycasz co 10 ms? 

Tak dane przez UART co 10ms

Edytowano przez Zbielu

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zbielu ładnie ale mi cos dalej nie pasuje. Zobaczyłem te logi, jak Ty obliczyłeś pwm? To powinna byc suma członów pid. 

Ps. W kolumnie I jest suma uchybow? 

Edytowano przez lubniewicz
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, lubniewicz napisał:

Zbielu ładnie ale mi cos dalej nie pasuje. Zobaczyłem te logi, jak Ty obliczyłeś pwm? To powinna byc suma członów pid. 

Sprawdzę to rano bo dziś już nie dam rady 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

w kolumnie I jest suma uchybów podzielona przez 10, bo tak akurat w programie chwyciłem zmienną do wyświetlania 

Udostępnij ten post


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!

Gość
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...