Spisu treści:

Samouczący się robot chaotyczny: 3 kroki
Samouczący się robot chaotyczny: 3 kroki

Wideo: Samouczący się robot chaotyczny: 3 kroki

Wideo: Samouczący się robot chaotyczny: 3 kroki
Wideo: Cztery etapy życia firmy budowlanej i wykończeniowej 2024, Lipiec
Anonim
Samouczący się robot chaotyczny
Samouczący się robot chaotyczny

Interesujesz się uczeniem maszynowym, sztuczną inteligencją i robotami? Nie musisz pracować na jakimś eleganckim uniwersytecie. To jest opis mojego chaotycznego robota. Jest to bardzo prosty robot, który demonstruje, jak korzystać z samouczącego się kodu i jak zaimplementować go na platformie arduino, w tym przypadku Arduino due. To bardzo tania platforma!

Kod ewoluuje robota tak, że robot uczy się czołgać. Otrzymuje informację zwrotną z myszy, która jest przeciągana z tyłu. Kod jest „genetyczny”. Oznacza to, że wiele osobników jest testowanych, a najlepsze są trzymane i będą miały dzieci. Oznacza to, że kod ewoluuje w sposób ewolucyjny.

Krok 1: Sprzęt AKA Robot

Sprzęt AKA Robot
Sprzęt AKA Robot
Sprzęt AKA Robot
Sprzęt AKA Robot
Sprzęt AKA Robot
Sprzęt AKA Robot

Potrzebujesz:

- 1 Arduino Due

- 8 mikroserwów

- 1 mysz PS/2

- 1 poziomowiec

- jakiś wariant osłony czujnika lub podobnej, zmęczyłem się osłoną czujnika i przyspawałem własną.

-druty

-zewnętrzny zasilacz 5V dla serw

- trochę złomu, trochę kleju i trochę stalowej nici. I taśma!

Więc połóż Due na podłodze. Umieść serwa w pierścieniu wokół niego. Połącz je ze złomu, kleju i nici. To jest część chaosu! Ponieważ jest chaotyczny w swoim projekcie, nieprzewidywalne jest określenie, jak się poruszać, aby się czołgać. Dlatego właśnie kod samouczący się jest drogą do zrobienia!

Wskazówki: użyj dość ciężkich metalowych części, ułatwi to poruszanie się robota.

Podłącz serwa do właściwych, w moim przypadku są podłączone do D39, 41, 43, 45, 47, 49, 51, 53.

Podłącz serwa do zewnętrznego zasilacza 5V. W tym celu zbuduj jakiś rodzaj osłony lub użyj osłony czujnika lub podobnej. Nie podawaj serw z pinu 5V, to nie wystarczy, Due się spali. Użyłem małej płytki prototypowej, aby rozprowadzić napięcie 5 V do wszystkich serw. Na tej płycie znajduje się również przełącznik poziomu zegara myszy PS/2 i linii danych. Płytka zasila również mysz 5V. Pamiętaj o podłączeniu uziemienia z zewnętrznego zasilania do Arduino! schemat pokazuje jak to wszystko połączyć.

Podłącz PS/2 do zasilania (5 V) i uziemienia. Podłącz zegar i linię danych PS/2 do Due za pomocą przełącznika poziomu. (ze względu na 3,3 V, PS/2 na 5 V). Podłącz zegar na D12 i dane na D13.

Aby uzyskać szczegółowe informacje na temat protokołu PS/2, jest to bardzo dobra instrukcja:

www.instructables.com/id/Optical-Mouse-Od…

Biblioteka PS/2 autorstwa jazzycamel, z której korzystałem:

Krok 2: Kodeks

Kod
Kod

Na początek powiem: NIE jestem programistą. Niektóre części są bardzo rozbudowane, wprawny programista mógłby oczywiście je skrócić i tak i tak.

Kod jest samouczący się i to jest sedno projektu. To jest zabawna część tego! Oznacza to, że robot ewoluuje i staje się coraz lepszy, w tym przypadku coraz lepiej się czołga. Niesamowitą rzeczą w tym jest to, że robot będzie ewoluował w zależności od tego, na czym go opuścisz. W tym przypadku przeciąga mysz PS/2 i im dłużej mysz jest przeciągana, tym wyższe punkty otrzymuje.

Oznacza to również, że możesz użyć tego kodu, aby nauczyć robota robienia czegoś innego, o ile jest on mierzony i przesyłany z powrotem do robota!

Jak widać na zdjęciach, myszkę przeciągamy na cienkim sznurku. Na początku został wciągnięty w kabel myszy. Kabel jest jednak dość sztywny, więc robot nauczył się potrząsać myszą, zamiast ją ciągnąć. Potrząsanie powodowało wysokie punkty…

Kod wykorzystuje 50 jednostek. Rdzeniem tego jest tablica 50x50 bajtów.

Individ to tablica bajtów. Kiedy individ jest używany do uruchomienia robota, individ jest wysyłany do funkcji w kodzie o nazwie „tolken”.

Na początku przebiegu jest 8 zmiennych m1, m2, m3, m4, m5, m6, m7 i m8 (po jednej na każdy serwo). W tym robocie wszystkie mają stałe wartości początkowe. W "tolken" mś są przekształcane w pętli przypadku/przełącznika w zależności od wartości jednostki. na przykład wartość „1” wykonuje następujące czynności: m1 = m1 + m2.

Jeżeli indywiduum to: 1, 2, 3, 0, 0, 0, 0….. to mś zostanie przekształcony w następujący sposób:

m1 = m1 + m2;

m1 = m1 + m3;

m1 = m1 + m4;

Tolken to lista 256 różnych operacji matematycznych, więc każda możliwa wartość tablicy individs reprezentuje matematyczną zmianę wartości m.

Proces tolken jest wykonywany 4 razy, z odczytem między każdym okrążeniem, generując cztery różne kody silnika dla każdego „m”. Kody silnika to wartości, które później są wysyłane do serw.

Na każdym etapie ewolucji w pełzaniu rywalizują 4 osobniki. Dwie najlepsze osobniki będą rodzicami dwojga dzieci, dzieci zastąpią dwie najgorsze osobniki. Kiedy powstają dzieci, splot „kodu genetycznego” od jednego rodzica jest wymieniany na kawałek od drugiego rodzica, co tworzy dwie nowe osobniki.

Jeśli żadna jednostka w ogóle nie działa, nastąpi mutacja osobników w celu wygenerowania nowych.

Kod znajdziesz na GitHub:

Krok 3: Jak to wytrenować?

To jest trudna część. Aby prawidłowo trenować, trzeba go „zresetować” po każdym biegu. Oznacza to, że za każdym razem musisz umieszczać go w tej samej pozycji.

W kodzie umieściłem kilka punktów kontrolnych, aby upewnić się, że robot znajduje się w pozycji wyjściowej.

Wyrównaj więc robota i pozwól mu działać.

Testuje 4 osobniki, a następnie wybiera 2 najlepsze na rodziców. Po zamienieniu najgorszego na dzieci, drukuje pewne dane na temat wyników poszczególnych osobników. Drukuje również tablicę 50x50. Dobrze jest skopiować to do arkusza Excela lub podobnego. (lub napisz kod potrzebny do przetwarzania) Jeśli Due zostanie zresetowany (dzieje się to z różnych powodów), nie stracisz swojej pracy szkoleniowej. Możesz skopiować/wkleić tablicę do kodu i kontynuować trening tam, gdzie cię zostawiłeś.

Mój robot nauczył się raczkować po kilku godzinach. Pobierz film, aby zobaczyć, jak się indeksuje. Nie poszło w kierunku, w którym myślałem, że pójdzie!

Wypróbuj także różne podłogi! Mój robot najlepiej radził sobie na nylonowym dywanie.

Możliwe ulepszenia:

1. Lepiej byłoby mieć osobne nano do odczytu myszy PS/2 i wysyłania przetworzonej odległości przesuniętej przez serial do nano. Czytanie mojej myszy PS/2 jest nieco chwiejne. To jest powód, dla którego mysz czyta/czyści fragmenty kodu.

2. jakiś rodzaj testera, który przeciągnął robota z powrotem do pozycji wyjściowej, przyspieszyłby trening.

3. Myślę, że rozsądnie jest trenować trochę wolniej niż ja. Wolniejszy trening zapewnia, że jest trenowany „we właściwym kierunku”. Możliwym sposobem może być średnia wydajność kilku przebiegów testowych.

Zalecana: