Dzisiaj opiszę problem orientacji mapy labiryntu, czyli odniesienie mapy do kierunków w przestrzeni i do numeracji pól. Co ciekawe, z początku w ogóle nie zdawałem sobie sprawy, że jest to ważna decyzja projektowa, która może ułatwić lub utrudnić dalsze prace. Po prostu myślałem, że numeracja jest prowadzona w jedyny słuszny sposób wykorzystywany we wszystkich innych dziedzinach. Dopiero później zdałem sobie sprawę, że moja mapa nie jest kompatybilna z narzędziami udostępnianymi w internecie. Dalej również okazało się, że nie jest ona optymalna nawet do moich zastosowań.

Podejście intuicyjne

Labirynt ma 255 komórek, po 16 na każdy rząd i kolumnę. Wybierając sposób numeracji komórek w labiryncie zastosowałem moim zdaniem najbardziej intuicyjną konwencję. Komórka o indeksie 0 znajduje się w lewym górnym rogu. Jest ona ograniczona ścianami z trzech stron, a jedyne wyjście z tej komórki na prawo i tam też znajduje się komórka o indeksie 1. Indeksy rosną w prawo, a następnie w dół.

01...15
1617...
...
240241...255

Jest to sposób numeracji, który używamy domyślnie we wszystkich innych zastosowaniach zgodny z kierunkiem czytania tekstu na kartce. Niestety szybko okazało się, że nie jest on zgodny z ogólnie przyjętą konwencją w micromouse.

Podejście ogólnie przyjęte

Po pierwsze w micromouse zamiast kierunków lewo, prawo, góra, dół używa się kierunków geograficznych – z angielskiego North, South, East, West. Ogólnie przyjęta konwencja mówi, że komórka o indeksie 0 powinna znajdować się w lewym dolnym rogu. Jest ona ograniczona ścianami z trzech stron, a jedyne wyjście jest skierowane w górę – w kierunku North. To pole posiada indeks 1. Czyli kolejne indeksy rosną do góry, a po dojściu do końca – w prawo. Taka konwencja jest wykorzystywana na przykład w labiryntach z mazetoola, czy w różnych opracowaniach w internecie.

15255
......
1...241
016...240

Taka numeracja była dla mnie nieintuicyjna, a poza tym miałem już zrobioną część implementacji po swojemu. Postanowiłem więc zostać przy swoim sposobie i zrobić konwerter do mazetoola, który zamieni mapę na mój format. Po jakimś czasie jednak okazało się, że muszę zmienić po raz kolejny numerację.

Podejście ostateczne

Tym razem przyczyna była dużo bardziej praktyczna. Kierunek przyrostu indeksów w labiryncie powinien odpowiadać układowi współrzędnych wybranemu do określania pozycji robota. Ten układ współrzędnych jest wymuszony przez kierunek przyrostu kąta na żyroskopie.

Komórka o indeksie 0 jest najbliżej początku układu, jest ona w lewym dolnym rogu. Indeksy rosną w prawo zgodnie z osią x układu, a następnie do góry zgodnie z osią y.

240241...255
...
16...
01...15

Mógłbym tutaj przejść na układ zgodny z konwencją micromouse, tylko najpierw indeksy musiałyby przyrastać w osi y, a dopiero potem w x. Jest to dla mnie nieintuicyjne, dlatego zostałem przy swoim.

Wnioski

Ostatecznie uzyskałem numerację, które jest dla mnie intuicyjna, a jednocześnie upraszcza obliczenia przy przejściu z układu współrzędnych na indeksy komórek. Intuicyjność rozwiązania jest tutaj bardzo ważna. Będę robił różne testy oraz debugował działanie robota. Jeżeli obliczenia będą proste, zmniejszam szansę popełnienia głupiego błędu, a tym samym oszczędzam czas.

 

Podobał się artykuł? Zapisz się na newsletter

Zapisz się, aby otrzymywać informacje o nowościach na blogu,
ciekawe materiały oraz informacje marketingowe. W prezencie otrzymasz również
dokument “Jak zwiększyć jakość kodu w projektach embedded? – darmowe narzędzia”.