Skocz do zawartości

[Programowanie] Sterowanie robotem mobilnym klasy (2,0)


baton

Pomocna odpowiedź

Bardzo dobrze napisany artykuł! Wyjaśnia wiele kwestii - dziękuję, wiedza zdobyta po przeczytaniu tego artykułu na pewno mi się przyda. Interesuje mnie jeszcze kwestia użycia żyroskopu w MM - w jaki sposób wykorzystać odczyt z żyroskopu do ustalania/kontroli rotacji? Może napiszesz drugą część, opisując właśnie użycie żyroskopu? Podobnie sprawa wygląda z użyciem czujników - żadna z myszy nie jeździ po labiryncie wyłącznie w oparciu o enkodery, tylko koryguje swoją pozycje odczytując błąd poprzez różnicę odległości poszczególnych czujników od ścianek. W jaki sposób prowadzić tego typu korektę do zaprezentowanego przez Ciebie modelu? Na podstawie różnicy odczytów czujników bocznych można zniwelować błąd translacji, a na podstawie różnicy przednich, błąd rotacji (oczywiście w momencie dotarcia do ślepego zaułku), tak? Jak to się ma, do regulatora PD opartego na enkoderach? W jaki sposób zmodyfikować opisane przez Ciebie rozwiązanie, by uwzględnić analogowe odczyty czujników?

Link do komentarza
Share on other sites

Nie obiecuję, że opiszę to w równie dogłębny sposób jak powyższe zagadnienie, szczególnie że aktualnie jeszcze nad tym pracuję. Gdy będę to już miał w miarę ogarnięte i znajdzie się chwila czasu, postaram podzielić się wiedzą 😉

Link do komentarza
Share on other sites

Baton, gratuluję udanego artykułu. Sporo przydatnej wiedzy i praktyczne podejście do tematu. Masz może pod ręką jakieś źródła w których można poczytać więcej o profilerach?

Interesuje mnie jeszcze kwestia użycia żyroskopu w MM - w jaki sposób wykorzystać odczyt z żyroskopu do ustalania/kontroli rotacji? Może napiszesz drugą część, opisując właśnie użycie żyroskopu?

To kiepski pomysł. Osobiście nie znalazłem żyroskopu MEMS, który mierzy położenie kątowe.(jeśli ktoś ma namiary na takie coś - niech da znać) Błędy całkowania prędkości kątowej tylko przysporzą Ci kłopotów. Proponuje pomyśleć o dwuosiowym magnetometrze jako kompasie. Jeśli nie ma dookoła silnych magnesów będziesz miał piękny pomiar kąta w płaszczyźnie XY.

Podobnie sprawa wygląda z użyciem czujników - żadna z myszy nie jeździ po labiryncie wyłącznie w oparciu o enkodery, tylko koryguje swoją pozycje odczytując błąd poprzez różnicę odległości poszczególnych czujników od ścianek. W jaki sposób prowadzić tego typu korektę do zaprezentowanego przez Ciebie modelu?

Dodać je do rotacji. Translacja "przesuwa" robota w kierunku ruchu, rotacja odpowiada za skręt.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Osobiście nie znalazłem żyroskopu MEMS, który mierzy położenie kątowe.(jeśli ktoś ma namiary na takie coś - niech da znać) Błędy całkowania prędkości kątowej tylko przysporzą Ci kłopotów.

Nie znalazłeś, bo takich nie ma, żyroskop to żyroskop - służy do mierzenia prędkości kątowej. Nie ma innej metody niż to scałkować 😉 Przy odpowiednio krótkim okresie całkowania, można uzyskać wystarczające efekty i właśnie tą wartość podaje się wtedy jako błąd w profilerze rotacji.

Proponuje pomyśleć o dwuosiowym magnetometrze jako kompasie. Jeśli nie ma dookoła silnych magnesów będziesz miał piękny pomiar kąta w płaszczyźnie XY.

Silne magnesy są, i to na tej samej płytce, w silnikach 🙂

Link do komentarza
Share on other sites

Silne magnesy są, i to na tej samej płytce, w silnikach

Teraz pytanie czy silniki będą mieć wpływ - bądź co bądź magnesy są obudowane metalem, doatkowo się kręcą z dużąprędkością, co przy czasach reakcji magnetometru nei powinno sprawiać dużych problemów. Natomiast duże problemy sprawią elementy na płytce - ścieżki prądowe mogąpotwornie zakłócać jego pracę.

Link do komentarza
Share on other sites

Nie znalazłeś, bo takich nie ma, żyroskop to żyroskop - służy do mierzenia prędkości kątowej. Nie ma innej metody niż to scałkować 😉 Przy odpowiednio krótkim okresie całkowania, można uzyskać wystarczające efekty i właśnie tą wartość podaje się wtedy jako błąd w profilerze rotacji.

Mylisz się, żyroskop - w zależności od typu mierzy prędkość kątową bądź kat. Ten drugi typ często spotykany jest w awionice (jako żyrokompas lub/i sztuczny horyzont - będąc precyzyjnym). Fakt, iż nie można znaleźć go w amatorskich konstrukcjach jako pojedynczy chip nie znaczy że takie rozwiązane nie istnieje. Powiedzenie "szukałem i nie znalazłem" też niestety niczego nie dowodzi.

Masz rację iż ze zwykłego żyroskopu MEMS można uzyskać w miarę przybliżone wyniki, musisz jednak kompensować jego bias. Nie zdziw się jeśli robot będzie "obracał się" mimo stania w miejscu po scałkowaniu prędkości kątowej.

Silne magnesy są, i to na tej samej płytce, w silnikach 🙂

Wydaje mi się, iż silniki BLDC bardziej "sieją" magnetycznie(wirujące neodymowe magnesy) niż DC. Jakoś nie widziałem nigdy coptera który by spadł z tego powodu. Myślę iż OldSkull ma rację, problemem mogą być ścieżki prądowe. Nikt jednak nie mówi o tym, aby umieszczać go w robocie między silnikami lub w głównej sekcji zasilania - niech sobie siedzi koło uC podpięty do zasilania ADC z "przodu" robota. - to powinno załatwić sprawę.

Z praktyki wiem na pewno, iż spore zakłócenia powodował monitor CRT w niewielkiej odległości(kilkadziesiąt cm) od magnetometru. Gdy będę miał dostęp do płytki IMU sprawdzę jak wpływają na niego silniki Pololu - to powinno być dość miarodajne.

Link do komentarza
Share on other sites

Sam uściśliłeś, że chodzi o elementy MEMS, a tutaj wszystkie żyroskopy działają tak samo. Do uzyskania sztucznego horyzontu na elementach MEMS konieczna jest fuzja kilku czujników (np. żyroskop + akcelerometr).

Zacytuję tutaj znajomego: "w teorii, praktyka pokrywa się z teorią, ale w praktyce już nie", więc zanim stanowczo stwierdzisz że coś się nadaje a coś nie, proszę poprzyj to praktycznym doświadczeniem 🙂

Rozwiązanie z żyroskopem jest sprawdzone w wielu konstrukcjach myszy na całym świecie, a właśnie w kontekście micromouse padło pytanie ze strony MatManiaka. Magnetometr jest zdecydowanie za wolny... Co innego fuzja żyroskopu i magnetometru, ale równie dobrze można sobie skorygować kierunek czujnikami optycznymi.

Co innego jeśli chodzi o platformę z nawigacją, czy to latającą, czy jeżdżącą. Tam użycie magnetometru ma jak najbardziej sens.

Link do komentarza
Share on other sites

A nie większa - rotacja i mniejsza + rotacja?

Zakładając, że L - odczyt lewego koła, P - odczyt prawego koła, R - rotacja, oraz L > P:

R = L-P

T = L-R + P+R = L-(L-P) + P+(L-P) = L-L+P+P+L-P = L+P

To samo 😉

Link do komentarza
Share on other sites

reg_newPWML = regV_P * regV_aktE + regV_D * (regV_aktE - regV_prevE) 
               + regT_P * regT_aktE + regT_D * (regT_aktE - regT_prevE); 
reg_newPWMP = regV_P * regV_aktE + regV_D * (regV_aktE - regV_prevE) 
               - regT_P * regT_aktE + regT_D * (regT_aktE - regT_prevE); 

Czym są te zmienne "regV_P, regV_D, regT_P, regT_D", bo do końca nie mogę załapać ?

Jak sądzę jest do związane z liczeniem odchyłek, ale skąd ma to dostać wartość ?

Link do komentarza
Share on other sites

Witam.

Mam pytanie odnośnie linii obliczania w powyższym algorytmie:

if(((aktualna_V_8 - next_V_8)*((aktualna_V_8 + next_V_8 + 128) >> 8))/(2*przysp_8) >= target_S - zad_S)

Odnosi się ona do liczb stałoprzecinkowych 8.8. 

Cytuję za artykułem:

Cytat

Ta pojedyncza linijka wymaga chwili uwagi. Ponieważ w liczniku ułamka pomnożone zostają dwie zmienne stałoprzecinkowe X.8 (a więc będące zapisane jako liczby całkowite 256 razy większe od ich wartości w naszej interpretacji), a w mianowniku znajduje się jedna taka zmienna, aby otrzymać w wyniku zmienną całkowitą, musimy ten pierwszy podzielić przez 256. Nie robimy tego jednak z całym licznikiem, a tylko jednym mnożnikiem.

W przypadku użycia zwykłych liczb zmiennoprzecinkowych. Rozumiem to dzielenie jest niepotrzebne?

Druga sprawa tyczy się tej linii:

if(set_S >= target_S || (stan == HAMOWANIE && MYSZ.prof_mV == 0))

Co sprawdza Część warunku: MYSZ.prof_mV == 0

Co przechowuje ta wartość?

Edytowano przez MarCiu
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.