Skocz do zawartości

[Teoria] Sterowanie robotem humanoidalnym - generacja chodu.


mog123

Pomocna odpowiedź

Po dwóch artykułach taktujących o budowie humanoida, doborze parametrów i jego mechanice, przyszedł czas na omówienie sterowania takim humanoidem. Zagadnienie dla nowicjuszy może wydawać się trudne, ale wcale tak nie jest - zaprezentuję prosty sposób na rozpoczęcie zabawy ze sterowaniem serwami przy minimum wiedzy.

1. Sterowanie serwami.

Jeśli zdecydowaliście się na budowę humanoida, mieliście do wyboru parę możliwych rozwiązań konstrukcyjnych, jednak napęd zazwyczaj jest ten sam - serwa. Wybierając serwa jako napęd kończyn waszego robota – dokonaliście dobrego wyboru. Czas teraz zgłębić się w zagadnienie sterowania serwami. Zacznijmy zatem od początku - samego złącza.

Jak widać – złącze ma tylko 3 przewody. Dwa służą do doprowadzenia zasilania do serwa, trzeci jest wejściem na sygnał sterujący = PWM. PWM (ang. Pulse width modulation), oznacza Modulację szerokości impulsu. Jest to sygnał o stałej amplitudzie i zmiennym wypełnieniu. Więcej na ten temat tutaj: wikipedia. PWM stosowany do sterowania serwami ma stały cykl odświeżania równy 50Hz (1s/50=20ms) oraz przedział możliwości wypełnienia od 2,5% do 12,5% (0,5 - 2,5ms) – gdzie 0,5ms oznacza skrajną pozycję w lewo wału serwa (0'), 1,5ms oznacza neutrum (90') a 2,5ms oznacza skrajną pozycję w prawo(180'). Wartości te są niejednoznaczne – każdy producent stosuje własne, ale zazwyczaj zawierają się w tym samym przedziale.

1.1.Praktyczne rozwiązanie.

W praktyce do każdego serwa należy osobno dostarczyć sygnał PWM. Wystarczy timer i jeden pin mikrokontrolera skonfigurowany jako wyjście. Przy użyciu timera należy generować sygnał PWM, na podstawie którego sterujemy wyjściem mikrokontrolera ustawiając w odpowiednim czasie stan wysoki lub niski na tym pinie. Docelowo będziemy chcieli sterować timerami w przerwaniach, tak by program obsługi serw wykonywał się na tle programu głównego. Dzięki temu kod pozostanie lepiej zorganizowany a procesor mniej obciążony. Tutaj możecie znaleźć całkiem przyzwoity serwokontroler do sterowania 16 serwami z interfejsem RS-232. Jednak to rozwiązanie polecałbym już bardziej zaawansowanym robotykom ze względu na stopień złożenia projektu. Dla mniej zaawansowanych konstruktorów(i nie tylko), którzy wyrażą chęć budowy humanoida, bądź po prostu robota kroczącego opartego o serwa na pewno pomogę z budową serwokontrolera. Jeżeli zainteresowanie na forum będzie duże, to mam nadzieję że wszyscy razem stworzymy OpenSource'owy projekt, który już powoli realizuję specjalnie dla forbot'a.

2. Serwokontroler.

Robot humanoidalny, jak już wyjaśniałem w poprzednich artykułach może posiadać od 14 do ponad 30 serw. Jak nim sterować? Właśnie serwokontrolerem.

2.1 Ilość kanałów

Standardowy serwokontroler posiada od 16 do 32 wyjść sterujących. Są to standardowe wyjścia PWM o częstotliwości 50 Hz z wypełnieniem 2,5% do 12,5%, gdzie wypełnienie 7,5% to pozycja środkowa – neutralna. Co to mniej więcej znaczy? Częstotliwość 50Hz oznacza, że informację o pozycji (wypełnienie) należy wysyłać do serwa co 1/50 → 20ms. Natomiast wypełnienie 2,5% oznacza 2,5% z tego cyklu, czyli 0,5 ms – jest to dolny próg standardowego zakresu ruchu serwa modelarskiego(wychylenie 0'). Analogicznie jest z wartością 7,5 % - 1,5 ms oraz 12,5% - 2,5ms (odpowiednio 90' i 180'). Standardowo realizowany serwokontroler korzystałby z 1 pinu mikrokontrolera i jednego sprzętowego PWM'a. Łatwo policzyć, że potrzebne by było parę „niezłych” mikrokontrolerów do tego przedsięwzięcia. Niestety, jednak sporo by to kosztowało. Rozwiązanie jest jedno – programowe PWM. Dzięki wykorzystaniu przerwań i paru timerów uda się wszystko zrealizować na 1 mikrokontrolerze.

 

Niestety pozostaje nadal problem ilości wyjść – 32 wyjścia to przecież całe I/O albo i więcej przeciętnego AVR`a. Aby zaoszczędzić na ilości wyjść, musimy pomyśleć nad możliwą optymalizacją. Zauważmy, że cały zakres naszego PWM trwa 20ms, a żeby wychylić serwo do maksymalnej pozycji, potrzeba 2,5ms, czyli maksymalnie 1/8 całego cyklu. Jeżeli i tak trzeba będzie generować kolejno impulsy o wartości maksymalnie 2,5ms to możemy zastosowac dekoder 1z8. Przykładowy dekoder 1z8 to 74LS238 . Na jego wejście podajemy 3-bitową liczbę binarną, która aktywuje nam korespondujące wyjście, np. 110 wprowadzi w stan wysoki wyjście nr 6 kodera(licząc od 0). Wysyłając kolejno taki sygnał do serwa w odstępach 2,5ms uzyskamy pełen cykl 20ms, po czym wysyłanie można ponownie powtórzyć. Dzięki tej metodzie można sporo pinów - im więcej serw, tym więcej zaoszczędzamy. Zamiast 24 pinów do wysterowania 24 serw wystarczy tylko 6 - 3 do wyboru serwa(co ósme np serwo[0]; serwo[8]; serwo[16] lub serwo[7]; serwo[15]; serwo[23] itd.) podłączone bezpośrednio do wejść A,B,C dekodera oraz 3 do generacji poszczególnych sygnałów PWM. Można by zadać pytanie – czemu by nie spróbować zastosować dekodera 1z16 albo rejestrów przesuwnych? Rejestry przesuwne – można, ale nie gwarantuję „rozpływania”sygnału wysyłanego do serwa, co skutkuje drganiami wału serwa (ang. jitter) ze względu na czas potrzebny do przesunięcia rejestru - trzeba tu być bardzo dokładnym. Odnośnie dekodera 1z16 – rozważmy to dokładnie. Jeżeli chcemy obsłużyć 16 serw w ciągu 20ms, to należałoby aktywować po 2 wyjścia naraz na jednym dekoderze, by zmieścić się z 16 wyjściami po 2,5ms w okresie 20ms. Dekodery jednak nie mają takiej możliwości aktywować 2 wyjść naraz, więc zastosowanie dekodera 1z16 jest fizycznie niemożliwe bez użycia dodatkowych układów cyfrowych.

 

2.2 Peryferia serwokontrolera (bloki).

Serwokontroler, to swojego rodzaju system wbudowany (ang. embedded system). Jego głównym zadaniem jest sterowanie serwami, ale dla zwiększenia jego możliwości – a tym samym możliwości naszego robota – powinien posiadać parę dodatkowych funkcji. W skrócie na serwokontroler składa się:

 

2.2.1 Jednostka centralna/mikrokontroler.

Jest to najważniejsza część serwokontrolera. Decyduje o jego możliwościach. Można wykorzystać dowolny mikrokontroler posiadający przynajmniej 8-16 linii I/O. Nie należy kierować się ilością sprzętowych kanałów PWM, gdyż najczęściej stosuje się programowe PWM. Im większe wartości pamięci czy mocy obliczeniowej ma jednostka centralna, tym lepiej.

 

2.2.2 Blok zasilania.

Aby nasz mikrokontroler poprawnie pracował, potrzebuje stabilnego napięcia Vcc.Niektóre wymagają 3,3V , inne 5V. Zwykle wystarczy stabilizator napięcia LDO (and. low drop-out) np. z popularnej serii 7805. Jednak przetwornica napięcia zapewnia lepszą wydajność i mniejsze straty energii. Zasilenia (prócz samego mikrokontrolera) oczywiście wymagają też serwa. Mamy kilka opcji do wyboru. Można napiecie z akumulatora podać bezpośrednio na serwa, co często wiąże się z ich przewoltowaniem(podanie większego napięcie na uzwojenia niż znamionowe). Ma to swoje plusy i minusy. Zaletą jest większy moment na wale serwa i większa szybkość jego obrotu. Często dochodzi do skoku obu tych wartości o 1/5!). Niestety powoduje to większe nagrzewanie silnika serwa i większe naprężenia na obudowie. Prowadzi to do skrócenia żywotności serwa (przepalenie zwojów silnika i wyłamanie obudowy serwa) - nie jest to aż tak często spotykane, takie rzeczy to raczej wady fabryczne samego produktu, niż jego nadużycie. Drugim rozwiązaniem jest stosowanie przetwornic lub układów BEC (ang. battery elimination circuit). Prostym sposobem możemy uzyskać dużą wydajność prądową źródła przy zachowaniu nominalnych parametrów zasilania.

 

2.2.3 Blok komunikacji.

Na blok komunikacji składają się 2 interfejsy:

-interfejs wymiany danych z komputerem, czyli interfejs oprogramowania.

Najczęściej jest to USB i ISP. Pozwala na przeprogramowanie serwokontrolera i wymianę danych z komputerem.

-interfejs komunikacji zewnętrznej. Jest stosowany głównie do dwóch celów – komunikacji bezprzewodowej (np. bezprzewodowy joypad) oraz zwiększenie możliwości serwokontrolera (zewnętrzne czujniki z interfejsem szeregowym; synchronizacja dwóch serwokontrolerów; zewnętrzna pamięć – karta SD z listą zaprogramowanych pozycji.

 

2.2.4 Blok wejść/wyjść

Oprócz standardowych złąćż 1x3 na serwa powinny się znaleźć złącza czujników – wspomniane wcześniej kanały ADC i ew wejścia/wyjścia cyfrowe. Należy pamiętać, by pomiary były odfiltrowane, a złącza zasilania serw miały kondensatory odsprzęgające.

 

2.2.5 Rozmiary płytki - dobra praktyka projektowania.

Uważam, że płytka powinna być minimalnych rozmiarów. Gabaryty powyżej 7cmx7cm są za duże do zastosowania w humanoidzie. Czemu? Waga i jeszcze raz waga. Laminat trochę waży,a rozsądne „upchnięcie” na płytce pozwoli zaoszczędzić parę gramów. Montaż płytki lepiej wykonać na tulejach plastikowych, przykręcając ją plastikowymi śrubami np. z nylonu. Zamiast nakrętki, lepiej zastosować gwintownik. Projekt powinien być minimalistyczny, zarazem powinien zawierać wszystkie niezbędne komponenty tj. kondensatory odsprzęgające zasilanie mikrokontrolera, dławiki ściągające zakłócenia z czujników itd. Istotna jest grubość ścieżek. Serwa pobierają ogromny prąd, zatem musi on swobodnie płynąć. Ścieżki zasilania robimy możliwie jak najgrubsze – jeżeli płytka jest dwustronna, to ścieżki zasilania ciągniemy na obu warstwach. I tak np. dla standardowych parametrów laminatu(grubość miedzi 35um, szerokość ścieżki 2,54mm) uzyskujemy maksymalny prąd 4,7A. Do obliczenia maksymalnego prądu przy projektowaniu płytki, polecam: The Circuit Calculator. Podwojenie grubości warstwy miedzi, lub poprowadzenie ścieżek zasilania z obu stron płytki, efektywnie podwaja możliwy do uzyskania prąd!

3. Jak chodzić?

Jeżeli potrafimy już sterować serwami, należy określić pozycję startową robota - preferowane jest by robot był w pozycji stojącej i serwa były w neutrum (90') - tak, by można było operować nimi w obie strony - nie jest to jednak zasada. Jeżeli to już jest także za nami to musimy wziąć się za chód. A jak to zrobić? Podnosząc w odpowiedni sposób nogi i manewrować środkiem ciężkości. Najpierw trzeba przenieść CoG (środek ciężkości) na jedną nogę, podnieść drugą i wykonać nią krok. Dla człowieka jest to proste zadanie, ale dla robota jest dość trudne. Wynika to z faktu, że musimy użyć skomplikowanych obliczeń kinematyki, wyliczyć środek ciężkości robota a potem nim sterować. W prostszym przypadku możemy po prostu wysyłać pozycje serw, według których mają się poruszać i metodą "prób i błędów" dojdziemy do optymalnej (w pewnym stopniu) sekwencji ruchu - czyli po prostu musimy od nowa nauczyć się chodzić(a raczej robota). Dodatkowym utrudnieniem są same serwa - ich układ sterujący (zazwyczaj podwójna pętla PID) pozwala na kontrolę pozycji wału ale przy zerowym obciążeniu i przy jednej, zdefiniowanej, maksymalnej prędkości (ze względu na fakt, że serwa przeznaczone są do modeli R/C). Gdy zbudujemy naszego humanoida to waga całej konstrukcji jest dużym obciążeniem dla serw, co może powodować pewien uchyb pomiędzy wartością zadaną a aktualną pozycją wału. Wniosek prosty - należy mieć prostą, lekką mechanikę przy jak najmocniejszych serwach. Dodatkowo dla płynności ruchu będziemy chcieli sterować wałem serwa z zadaną przez nas prędkością i synchronizować ruchy wszystkich serw. Wszystko to zależy od naszego serwokontrolera. Gdy zaczniecie pisać ulepszenia do sterowania pozycją serw, warto pomyśleć o dodaniu zadawania nieliniowej trajektorii ruchu dla naszego serwa. Co to oznacza? Serwo ze względu na swój inercyjny charakter poruszać się będzie liniowo z drobnymi skokami na początku i końcu ruchu, czyli przez cały czas będzie poruszać się z jednakową prędkością, pokonując stałą odległość. Możemy jednak programowo to korygować i co odświeżenie serwa (20ms) zamiast wykonywać drastyczny ruch z pozycji -180' do +180' (za którym serwo i tak nie nadąży w tak krótkim czasie) możemy rozbić ten ruch na np. 10 kroków i w pierwszym wykonać gwałtowny ruch o 90' a potem powolniejsze by spokojnie wyregulować do 180' bez przestrzelenia pozycji zadanej.

 

3.1. Jak chodzić szybko?

Jeżeli udało nam się w miarę opanować chód, ale nie jesteśmy z niego zadowoleni, to pozostaje optymalizacja. W optymalizowaniu chodu, kluczem jest minimalizowanie przeniesienia środka ciężkości. Im mniej robot będzie „rzucał” środkiem ciężkości na lewo i prawo, tym jego bezwładność będzie mniejsza, a to zmniejszy jego drgania i chód będzie stabilniejszy. Trzeba przenosić środek ciężkości z nogi na nogę przy zachowaniu stałej orientacji torsu w stosunku do podłoża i używać głównie dolnej części ciała/nóg do korygowania położenia. W przypadku struktury mechanicznej „Serial Link” należy uwzględnić by stopa była równoległa do podłoża, jeżeli nasz robot zbudowany jest w oparciu o strukturę „Parallel Link” to nie musimy się o nic martwić – ona robi to za nas. Musimy zachować środek ciężkości w polu pozwalającym zachować równowagę, którego krawędzie wyznaczają stopy. Na filmie poniżej doskonale widać jak przenoszony z nogi na nogę jest środek ciężkości. Widać też że robot nie wykonuje „półkroków” – nie wraca do pozycji stojącej po każdym kroku, tylko kontynuuje ruch z aktualnej pozycji.

 

 

Jako gratis, dorzucam małą aplikację dzięki której można podpatrzeć dokładne pozycje jakich używał Pan Takeshi Maeda - o którym wspominałem w artykule o mechanice humanoida. Tutaj zrzut przykładowych pozycji końcowych(tak byście nie musieli się męczyć):

 

 

4. Sterowanie bezprzewodowe.

 

 

Dzięki sterowaniu bezprzewodowemu możemy uniezależnić całkowicie naszego robota od przewodów - bateria i odbiornik na pokładzie powodują że robot nie ciągnie za sobą kabli. Sterowanie bezprzewodowe sprowadza się tak naprawdę do wyboru preferencji. Najpopularniejsze są kontrolery Playstation, które opierają się o SPI - opisane w poprzedniej edycji konkursu wakacyjnego przez użytkownika Elektryk0 (tutaj). Wystarczy więc zakupić bezprzewodowy kontroler (w cenie ~40zł) i poczytać jedynie o komunikacji z nim przy pomocy SPI. Powstało wiele projektów wykorzystujących te kontrolery, również polskie. Dobry, kompletny projekt w oparciu o znane wszystkim AVR'y można ujrzeć tutaj.

 

5. Podsumowanie.

To by było na tyle - po więcej informacji zapraszam do mojego tematu , lub na PW. Z chęcią pomogę - czas zacząć wojny mechów 🙂

 

Bibliografia:

[1] http://www.robots-dreams.com/2006/05/building_one_of_1-3.html

[2] http://letsmakerobots.com/node/2423

 

walk.zip

miniaturka.thumb.jpg.a214f1656db20ba0ee6e637b955ec6fd.jpg

Link do komentarza
Share on other sites

(ang. Pulse with modulation), oznacza Modulację szerokości impulsu.

To jak w końcu? Impuls z modulacją czy modulacja szerokości impulsu? 🙂

programowanie PWM.

Chyba chodziło o programowy PWM.

Niektóre wymagają 3,3V , inne 5V. Zwykle wystarczy stabilizator napięcia LDO (and. low drop-out) np. z popularnej serii 7805.

Nie widziałem jeszcze żadnego 7805 w wersji 3,3V 🙂

2.1 Ilość kanałów

Chyba można jeszcze trochę oszczedniej-1szt 4017 zajmie jedno lub dwa wyprowadzenia a obsłuży 10 serw przy standardowej szerokości impulsu(1-2ms).

Drugim rozwiązaniem jest stosownie przetwornic lub układów BEC

Masło maślane

Poza tym chyba wszystko ok 🙂

Link do komentarza
Share on other sites

(ang. Pulse with modulation), oznacza Modulację szerokości impulsu.

To jak w końcu? Impuls z modulacją czy modulacja szerokości impulsu? 🙂

programowanie PWM.

Chyba chodziło o programowy PWM.

Niektóre wymagają 3,3V , inne 5V. Zwykle wystarczy stabilizator napięcia LDO (and. low drop-out) np. z popularnej serii 7805.

Nie widziałem jeszcze żadnego 7805 w wersji 3,3V 🙂

2.1 Ilość kanałów

Chyba można jeszcze trochę oszczedniej-1szt 4017 zajmie jedno lub dwa wyprowadzenia a obsłuży 10 serw przy standardowej szerokości impulsu(1-2ms).

Drugim rozwiązaniem jest stosownie przetwornic lub układów BEC

Masło maślane

Poza tym chyba wszystko ok 🙂

Dziewczyna to za mnie przepisywała i nie dałem rady wychwycić wszystkich błędów 🙂 dzięki za wychwycenie literówek 🙂

7805 wiadomo odnosił się do 5V 😉

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

Nie rozumiem tego zdania

" Zamiast 24 pinów do wysterowania 24 serw wystarczy tylko 6 - 3 do wyboru serwa(co ósme np serwo[0]; serwo[8]; serwo[16] lub serwo[7]; serwo[15]; serwo[23] itd.) podłączone bezpośrednio do wejść A,B,C dekodera oraz 3 do generacji poszczególnych sygnałów PWM."

Dlaczego nie potrzebujemy 4 pinów do obsługi 8 serv? Przecież dekoder ma 8 wyjść , a na wejściu musza byc 3 bity do wyboru wyjscia i pwm. Nie rozumiem jak 3 pinami chcesz wybierać miedzy 24 wyjsciami.

Proszę o wyjaśnienie:)

Link do komentarza
Share on other sites

Przypuszczam, że chodzi o to, żeby zastosować 3 dekodery. Wejścia adresowe dekoderów połączone razem, ale na każdy podawany inny sygnał. No i oczywiście, do każdego podłączone 8 innych serw.

Link do komentarza
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.