Skocz do zawartości
lubniewicz

Autonomiczy robot balansujący

Pomocna odpowiedź

Witam lubniewicz,

Ta para ochraniaczy zbytnio się nie przydała bo konstrukcja jest (moim zdaniem świetna) hehe, ale rozumiem 🙂. Za drugim razem widziałem że miał problem z podjazem, ale poradziłeś sobie, czujniki mogą gubić sygnał może z powodów jakości komponentów?

Tak czy siak, czekam na dalsze filmiki 🙂 i raporty, pozdro

Udostępnij ten post


Link to post
Share on other sites

Bardzo fajnie to wygląda, ochraniacze jak widać niepotrzebne 🙂 Chociaż był moment, w którym myślałem, że segregator się załamie i będzie mały wypadek.

Udostępnij ten post


Link to post
Share on other sites

Segregator strasznie się uginał, też myślałem, że zaraz nie wytrzyma i będzie gleba 😃.Gorąco mi się zrobiło kiedy robot z pochylni jechał na aparat 😉 to były milimetry, wątpię aby aparat to konfrontację wytrzymał. Cała konstrukcja jest ciężka, waży chyba około 1,5 kg 😉. W czasie przejazdów za mocno nie deptałem "gazu" 😉, bez problemu mogłem go w każdej chwili wywalić. Czujniki odległości nie były drogie, około 7 zł za sztukę. Najlepiej mierzą odległość jak są skierowane prostopadle do przeszkody, kiedy tak nie jest ultradźwięki są po porostu rozpraszane i nie powracają do czujnika w formie echa. Jestem ciekawy jakby się spisywały optyczne czujniki odległości np Sharp. Wstawiam kolejny film, był nakręcony około 1 roku temu 😉. Były to jedne z pierwszych testów. Robot nie miał jeszcze zaimplementowanych w kodzie enkoderów, a nastawy regulatorów były bardzo "ostre", agresywne i nieprzewidywalne, w każdej chwili mógł wystartować w jakaś stronę, aby kogoś trafić 😉. Aha wtedy nawet nie napisałem sterowania, zresztą brakowało też aplikacji na adnka.

Udostępnij ten post


Link to post
Share on other sites

Mam takie pytanko: jakie ustawiłeś zakresy gyro i akcelerometru i z jaką częstotliwością odczytujesz z nich wartości? Mi już się skończyły pomysły, co zrobić, bo przy przewróceniu robota wyświetla mi na ułamek sekundy kąt do 110 stopni, po czym szybko wraca do 92. Nie przeszkadzałoby mi to, jednak przy wpadnięciu w oscylacje, przy szybkim wychylaniu do +/-10 stopni, wyświetla mi kąt nawet 40st, przez co bardzo szaleje regulator. Wydaje mi się, że to przez gyro, jednak w żaden sposób nie mogę tego opanować. Miałeś może podobny problem? Używam filtru komplementarnego.

Udostępnij ten post


Link to post
Share on other sites

Jasne że miałem taki problem ;D. Odczyt akcelerometru i żyroskopu odbywa się co 10 ms. Pobieram przyspieszenia, prędkość kątową i wrzucam do komplementarnego. Wartość współczynnika "x" - który określa czy pomiar jest bardziej wrażliwy na accel czy też żyro mam ustawione na x=0.03. UWAGA: Pamiętaj że pomiar przyspieszenia mamy w stopniach na sekundę. Jeżeli pomiar masz co 10ms to musisz pomnożyć odczytaną wartość z 0.01. Wtedy otrzymasz prędkość kątową stopnie na 10 ms.

[ Dodano: 06-11-2016, 20:18 ]

EDIT: Ja musiałem jeszcze zmienić znak prędkości kątowej. Uważaj na to!

Udostępnij ten post


Link to post
Share on other sites

Zrobiłem dokładnie tak, jak napisałeś i kąty mi wywalało nawet do 140 stropni 🤯 ostatnio miałem na 800Hz i pokazywało mi ok 110stopni. Dalej, jak zwiększałem częstotliwość, to już nie było żadnych zmian. Znak z gyro mam ok, tylko myślę, że to coś nie gra z przeliczaniem sygnału w zależności od zakresu.. ustawiałem już wszystkie zakresy, po czym przeliczałem "g=sygnał_gyro * zakres/32768.0". Tak samo z akcelerometrem. Też tak robiłeś?

Udostępnij ten post


Link to post
Share on other sites

Tak robiłem.... dziwne. Napisz jaki masz wzór komplementarnego.

[ Dodano: 06-11-2016, 22:50 ]

Ty odczytujesz accela i gyro z 800Hz? A jakie masz "data rate configuration"? PS. Stała x mam na 0.01.

Udostępnij ten post


Link to post
Share on other sites

Ja akurat przyjąłem sobie odwrotnie: x=0.98 i mam taki wzór:

pitch = x * (pitch + gx *0.00125) + (1 - x) * kat_acc

ale to na jedno wychodzi. Przy x = 0.99 już mam dryf. "Data rate configuration" - chodzi o UART? ustawiłem 250000 baud - najwyższą, bo jak miałem niższą, to urządzenie na kablu jeździło ładnie, a po odpięciu wpadało w "szał" 😋 oscylując z ogromną częstotliwością. Stąd nie mogłem go po prostu włączyć bez komputera.

Jednak teraz sprawdziłem i na kablu nadal jeździ dużo lepiej, niż bez 😕

Udostępnij ten post


Link to post
Share on other sites

Ok. No to jedziemy. "Data rate configuration" - ustawiamy w czujniku z jaką częstotliwością ma dokonywać pomiarów i odkładać wyniki do swojej pamięci, abyśmy my mogli potem do niej sięgnąć. Jeżeli on dokonuje odczytów co 50Hz to nie ma sensu pobierać z jego pamięci z większą częstotliwością. Ja mam tak ustawione że odczytuje 100 razy na sekundę z czujnika, a czujnik dokonuje pomiaru 200 razy na sekundę, mogę się trochę mylić bo mówię z pamięci ale bynajmniej taka jest zasada. Więc nie ma sensu odczytywać z niego z częstotliwością 800Hz skoro on może dokonywać tylko pomiarów z częstotliwością 20Hz. Druga sprawa mówiłeś coś o prędkości UART. Ja mam komunikację po i2c. Odczytujesz położenie po UART? Wytłumacz mi to będę mógł Tobie więcej powiedzieć. Wspominałeś, ze jak masz podłączony kabel to lepiej działa, ale co to za kabel właśnie do UART czy jakiś zasilający. Jeżeli Uart to coś z tego kabla odczytujesz? Może stabilność jest lepsza ograniczasz w ten sposób przepustowość. Zgaduje, musisz mi więcej powiedzieć o budowie robota, podzespołach, komunikacji itp. Wzór wydaje się na pierwszy rzut oka ok, ale jak zwykle problem tkwi w szczegółach. Rozumiem, że wartość 0.00125 to inaczej pomniejszenie prędkości kątowej o DELTA_t? Aż z tak dużą częstotliwością wykonujesz pomiary? wystarczy na początek 100 hz czyli 0.01. Potem pytanie jak rozwiązałeś kat_acc. Ja zrobiłem to tak że biorę aktualny i 3 poprzednie wartości kąta z akcelerometru (nie już obliczoną wartość po komplementarnym) i dziele to przez 4 tak aby uzyskać wartość średnią.

Udostępnij ten post


Link to post
Share on other sites

Robię robota na genuino101, jest on z wbudowanym akcelerometrem i żyroskopem. Zamontowany układ to BMI160. Generalnie nie do końca byłem świadomy, że występują dwa odczyty: odczyt czujnika z pozycji i odczyt Z czujnika. Mam w bibliotece CurieIMU coś takiego, jak "setGyroRate(wartość)" i tutaj wklepałem 800, zadowolony, że będę czytał wartości z czujników 800 razy/s, jednak domyślam się, że byłem w błędzie? 😋 Jeśli tak, to teraz mam takie pytanko: do filtra komplementarnego. dt, to jest okres czytania przez czujniki czy okres sczytywania z czujników? Wracając do tego, co pisałem wcześniej: tak, odczytuję pozycję przez UART po kablu. Stąd, kiedy miałem aktywny monitor szeregowy, wszystko było ok. Dziś problem się rozwiązał. Po wpisaniu na koniec loop delay 5ms, wszystko ładnie się wyciszyło. Docelowo zrobię to timerem. Tylko właśnie mam pytanie odnośnie "dt" w filtrze komplementarnym, jak pytałem wyżej. A co do sygnału z akcelerometru - też liczyłem średnią z 4 ostatnich pomiarów, jednak chyba od tego odejdę, żeby nie było opóźnień.

Udostępnij ten post


Link to post
Share on other sites

Super, że mogłem trochę pomóc. Dt jest to częstotliwość odczytu z czujnika, a w zasadzie częstotliwość wykonywania f. Komplementarnego. Ja w jednym wątku który jest wykonywany z częstotliwością 100Hz odczytuje dane i od razy wrzucam do f. Komplementarnego. Jak mogę coś poradzić wywal wszystkie delay. Zrób to na timerach.

Udostępnij ten post


Link to post
Share on other sites

Delay muszę dać na końcu loop, bo inaczej mi nie działają przerwania 🙁 a do instrukcji wywoływanej przy przerwaniu chcę wrzucić odczyty z czujników i PID. W loop tylko będę wyświetlał serialem, taki jest plan. BARDZO dziękuję za oświecenie, trzymaj się!

Udostępnij ten post


Link to post
Share on other sites

Polecam się, napiszę potem jak poszło. Doradze Tobie w kwestii oprogramowania. W przerwaniu nie rób tych odczytów i obliczeń. Powołaj sobie zmienna globalna uint8_t. W przerwaniu zmieniaj ta zmiena na 1 to będzie Twoja flaga. W pętli główne daj warunek if sprawdzający flagę. Jak będzie jeden to wykonaj odczyt i obliczenia i ustaw flagę na 0. Zrób drugi warunek if w pętli głównej już z inną częstotliwością aby wysyłać po Uart. Nie wysyłaj za dużo danych bo bedzie Tobie blokowac ten krytyczny wątek z pierwszego if. Ten pierwszy if ma się wykonywać jak w szwajcarskim zegarku. Wywal delay.

Udostępnij ten post


Link to post
Share on other sites

Tylko właśnie nie wiem, jak zrobić, żeby timer mi przerywał co odpowiedni czas i zmieniał choćby tą zmienną, jeśli nie ma delay. Wczoraj bawiłem się sporo i bez delay ani rusz. A czemu myślisz, że to będzie źle wpływać, jak zrobię tak, jak piszę?

Udostępnij ten post


Link to post
Share on other sites

Obsługa przerwania musi być bardzo krótka. Jeżeli w przerwaniu będzie robił jeszcze obliczenia to drugie się nie wykona, tzn normalnie nie możesz wywoływać przerwania w przerwaniu. Ponadto delay 5 ms blokuje Tobie wykonywanie programu, tak że zamiast 8 MHz masz rzeczywiste taktowanie 200 Hz!! Rozumiesz! Unikaj delaya jak ognia dosłownie. Tak jak nie stosujesz goto tak nie stosuj delay. Są inne metody programistyczne na uzyskanie opóźnienia a co najważniejsze nie blokują procka. U siebie mam 20MHz i ani jednego delaya. W tym czasie "jednocześnie" robię pomiary i obl kąta, obróbka czujnika IR do pilota, obróbka Bt, sterowanie mostakami, obsługa wyświetlacza, obsługa buzzera, onsluga 3 czujników odległości, obsługa autodiagnozy z kodami błędów, odczyt 2 enkoderow z kół. Wybraz sobie ze wale delaya 5 ms. W tym czasie robot jest ślepy i głuchy, dosłownie nic mie robi. Zamiast 20 MHz mamy 200Hz. Ponadto rozjezdza się krytyczny wątek f. Komplementarnego który musi się wykonywać o czas dt. W swojej konstrukcji mam nawet odpowiedni mechanizm który sprawdza czy ten wątek f. Komplementarnego wykonuje się co 10 ms, jak będzie 11 i więcej od razu mam komunikat przeciążenie 😉. Ps. Sorry za literówki pisze z telefonu.

Udostępnij ten post


Link to post
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ę »

×