Skocz do zawartości

Pomocna odpowiedź

Dziękuję za odpowiedź.

mog123

1) Mam ok. 10 imp./mm z enkoderów, ale z czujników optycznych sytuacja już nie jest taka liniowa. Zrobię chyba w miarę dokładną tablicę z gotowymi wynikami, gdzie elementami będą różnice wartości ADC (różnica pomiędzy wynikiem z wł. i wył. diodą) a indeksami odległości i wyszukiwanie binary searchem.

2)Wiem o liczbach ze stałym przecinkiem, nawet je wykorzystuję, chodziło mi o to, że Π jest niewymierne, więc gdzieś to zaokrąglenie musi być

4)Ruchy z zatrzymywaniem się co jedną komórkę tak sobie wychodzą mojemu robotowi. Mam aktualnie regulator PD, a pasowałoby dać PID, bo przy zatrzymywaniu może wejść w pętlę nieskończoną, bo nie będzie idealnie na oczekiwanej pozycji, a PID by go poprawiło po pewnym czasie. Jak jednak próbuję wpleść I do kodu, to albo po niewielkim odchyleniu koła zaczyna szarpać po kilka obrotów w jedną stronę, albo powoli niweluje błąd, i jak postawię spokojnie robota, to on cały czas się lekko się kręci, nie mogąc ustawić się w zerowej pozycji. Mam coś źle z kodem, czy muszę dokładniej dobrać współczynniki?

Kod:

void PD(void)
{
static int sE_tr=0, sE_rot=0;
rot();
trans();
enkTr = enkL+enkR;
enkRot = enkL-enkR;
regCurrErrTr = zadSTr - enkTr;
regCurrErrRot = zadSRot - enkRot;
sE_tr+=regCurrErrTr;
sE_rot+=regCurrErrRot;

PWML = REG_P_TR * regCurrErrTr
	 + (sE_tr * REG_I_TR)
	 + REG_D_TR * (regCurrErrTr - regPrevErrTr)

	 + REG_P_ROT * regCurrErrRot
	 + (sE_rot * REG_I_ROT)
	 + REG_D_ROT * (regCurrErrRot - regPrevErrRot);

PWMR = REG_P_TR * regCurrErrTr
	 + (sE_tr * REG_I_TR)
	 + REG_D_TR * (regCurrErrTr - regPrevErrTr)

	 - REG_P_ROT * regCurrErrRot
	 - (sE_rot * REG_I_ROT)
	 - REG_D_ROT * (regCurrErrRot - regPrevErrRot);

regPrevErrTr = regCurrErrTr;
regPrevErrRot = regCurrErrRot;

/*ustawienie PWM*/
}

Macio

1)Czyli jeśli według enkoderów jestem na środku, to mam zmienić wartość, jaką pokazują na taką, żeby dobrze pokazywały mi dalmierze? Np. jeśli według enkoderów jestem na środku, a według dalmierzy brakuje mi jeszcze 1cm, to zmieniam sobie wartość jaką pokazują enkodery, że przejechałem, w moim przypadku o 100 i czekam aż sobie dojadą do tego miejsca? Orientację według bocznych ścianek ogarniam.

2)Tak jak napisał mog123, pobawię się jeszcze tym, co mam, ale zaprojektuję sobie na przyszłość płytkę. Dzięki za propozycję buzzera. Dodam jeszcze czujniki, które będą patrzyły równo na bok, bo teraz mam na skosie i będę musiał robić odczyty trochę wcześniej, niż na środku komórki.

Dziękuję jeszcze raz za odpowiedzi.

Przy sterowaniu pozycją robota, całka nie jest Ci potrzebna - regulator PD wystarczy

Aha i zamiast liczyć podwójnie PWM, najpierw oblicz wartości sygnału sterującego odp za ruch liniowy i obrotowy, a dopiero potem polacz je w calosc, w ten sposob co masz teraz, liczysz wszystko podwójnie.

ss_liniowy= ...

ss_obrotowy = ...

PWML=(abs(ss_liniowy+ss_obrotowy)>4095) ? sgn(ss_liniowy+ss_obrotowy)*4095 : ss_liniowy+ss_obrotowy;

PWMR=(abs(ss_liniowy-ss_obrotowy)>4095) ? sgn(ss_liniowy-ss_obrotowy)*4095 : ss_liniowy-ss_obrotowy;

nie wiem ile masz bitowy PWM, ale ja używałem 12 bitowego - pamiętaj by go ograniczyć do maksymalnego zakresu bo to też generuje kwiatki

  • Pomogłeś! 1

Wojcik98, dokładanie I działało tak jak powinno. Błąd nigdy nie zmaleje do 0. Człon I powoduje narastanie sygnału PWM. Gdy PWM osiągnie odpowiednio dużą wartość silniki ruszają i niestety powodują, że robot przesunie się o zbyt duży dystans. Wtedy człon I powoduje narastanie sygnału PWM, ale z ujemnym znakiem. Robot znowu rusza, tym razem w przeciwną stronę i ponownie o zbyt duży dystans. Ta sytuacja powtarza się w nieskończoność. Regulator PD powinien wystarczać do prędkości liniowej. Jeśli błąd jest zbyt duży to próbuj zwiększyć parametr P.

W przypadku stablicowania wartości ADC czujników odległości pozostaje problem kalibracji. Mysz nie zawsze będzie poruszać się w tym samym labiryncie i tym samym oświetleniu. Do kalibracji czujników polecam artykuł http://www.micromouseonline.com/2010/07/07/calibrating-reflective-sensors/. Z drugiej strony widziałem myszy które nie konwertowały wartości z przetwornika ADC na dystans tylko używały ich bezpośrednio. Działało to całkiem nieźle. W takim przypadku ustala się tylko wartość ADC z danego czujnika która mówi nam o tym, że robot znajduje się w środku pola. Różnica między wartością idealną (na środku pola) a wartością aktualną wchodzi jako błąd do regulatora P lub PD. Oczywiście jest to inny regulator niż ten który steruje silnikami, z innymi nastawami.

1)Czyli jeśli według enkoderów jestem na środku, to mam zmienić wartość, jaką pokazują na taką, żeby dobrze pokazywały mi dalmierze? Np. jeśli według enkoderów jestem na środku, a według dalmierzy brakuje mi jeszcze 1cm, to zmieniam sobie wartość jaką pokazują enkodery, że przejechałem, w moim przypadku o 100 i czekam aż sobie dojadą do tego miejsca? Orientację według bocznych ścianek ogarniam.
Możesz zrobić tak lub tak. Zobacz co lepiej zadziała, albo co jest wygodniejsze w implementacji.
  • Pomogłeś! 1
Poczytaj o liczbach ze stałym przecinkiem. W skrócie: liczba 8 bitowa pozwala Ci dojechac do 255, liczba 16 bitowa pozwala Ci dojechac do 65535. A wyobraz sobie ze pierwsze 8 bitów z liczby 16 bitowej to czesc calkowita, a nastepne 8 bitow to czesc ulamkowa. W ten sposob masz precyzje co do 1/256, czyli maksymalny zakres liczby 16 bitowej do 255,996

Takie podejście jest opisane w artykule batona: https://www.forbot.pl/forum/topics20/programowanie-sterowanie-robotem-mobilnym-klasy-20-vt7787.htm

  • 3 tygodnie później...

Dziękuję za odpowiedzi.

Nie odpisywałem dosyć długo, bo najpierw czytam odpowiedzi, potem modyfikuję program i jak mam się z czym pokazać to dopiero wtedy piszę. A z racji tego, że jutro piszę test gimnazjalny postanowiłem popracować nad robotem 😃 . Działa mu teraz kalibracja, jednak zamiast obliczać odległość od ścianek biorę wartość bezpośrednio z czujników. Ze względu na jakość labiryntu kalibracja działa tak sobie i dopiero na zawodach będę musiał ją doszlifować. Działa również mapowanie i fast run, jednak właśnie przez labirynt nie zawsze kończy się to sukcesem, bo wystarczy przesunąć trochę jedną ścianę i robot już inaczej jedzie. Będę musiał chyba zainwestować w jakiś porządny labirynt. Robot jest już zdatny do zawodów i jadę z nim do Rzeszowa. Potem spróbuję dodać mapowanie bez zatrzymywania (na prostych) a później płynne zakręcanie. I jeszcze filmik:

  • 2 tygodnie później...

Nie jest źle! 🙂 Robot zapamiętał labirynt, pojechał najkrótszą ścieżką i ładnie (przynajmniej dla mnie 😉 ) trzymał się ścian, co w porównaniu do tego, co miałem rok temu jest dużym postępem. Na początku przy mapowaniu coś się gubił, ale wystarczyło wyprostować diody i pojechał dobrze. Przy następnej konstrukcji położę diodę obok fototranzystora i będzie OK. Patrząc na inne konstrukcje będę musiał też dać mniejszy akumulator i trochę zwęzić robota. Gdybym troszkę wcześniej wznowił prace, to może bym również dorobił jakieś płynne skręcanie, przynajmniej w fast/speed runie. No ale cóż, może na następne zawody (które jeszcze nie wiem kiedy będą) zrobię 😉 . Jeszcze co do zawodów, to były bardzo fajnie zorganizowane. Labirynt w strefie serwisowej do świetny pomysł, dzięki niemu mogłem sobie idealnie skalibrować robota, choć wydaje mi się, że labirynt konkursowy miał nieco ciemniejsze ścianki. Labirynt mógłby mieć również kilka możliwych dróg do środka, żeby robot wybrał optymalną dla siebie.

Filmik z zawodów:

I dla porównania z Robocomp 2013 z robotem Speedy:

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...