Skocz do zawartości

Line Follower na Fuzzy logic


droite

Pomocna odpowiedź

Witam, jako zadanie projektowe na studia tworzę line followera koniecznie za pomocą fuzzy logic, pojazd już zbudowałem. Użyłem Arduino i sterownika silników na l298n. Do odczytu najazdu na czarną linie czujnik odbiciowy tcrt5000, wygląda to tak.

Poniżej program który działa poprawnie ale teraz muszę przejść na fuzzy logic ale nie wiem jak się za to zabrać. Za każda podpowiedź byłbym bardzo wdzięczny.

 int mocno_lewo,lewo,lekko_lewo,srodek,lekko_prawo,prawo,mocno_prawo;
int prawy;
int lewy;
void setup() {

 Serial.begin(9600);
 pinMode(3, OUTPUT);// sygnał PWM silnika 1 - Prawy
 pinMode(5, OUTPUT);// syngał PWM silnika 2 - Lewy

 pinMode(11, OUTPUT); // Prawy P       Sygnały sterujące kierunkiem obrotów silnika nr 1 
 pinMode(12, OUTPUT);  //Lewy T  
}

void loop() {
mocno_lewo=digitalRead(2);
lewo=digitalRead(19);
lekko_lewo=digitalRead(18);
srodek=digitalRead(17);
lekko_prawo=digitalRead(16);
prawo=digitalRead(15);
mocno_prawo=digitalRead(14);
Serial.print(mocno_lewo);
Serial.print(lewo);
Serial.print(lekko_lewo);
Serial.print(srodek);
Serial.print(lekko_prawo);
Serial.print(prawo);
Serial.print(mocno_prawo);
Serial.println();
delay(50);


if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==0)){
 digitalWrite(11,LOW);digitalWrite(12,LOW);
 analogWrite(3, 0);
  analogWrite(5, 0);
}
if((mocno_lewo==1)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==0)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
   analogWrite(3, 0); //Prawy
   analogWrite(5, 125);}
if((mocno_lewo==0)&&(lewo==1)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==0)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
  analogWrite(3, 75);
   analogWrite(5, 125);}
if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==1)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==0)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
  analogWrite(3, 100 );
   analogWrite(5, 125);}
if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==1)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==0)){
     digitalWrite(11,HIGH);digitalWrite(12,HIGH);
   analogWrite(3, 125); //prawy jechał za szybko
   analogWrite(5, 160);}
if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==1)&&(prawo==0)&&(mocno_prawo==0)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
  analogWrite(3, 160);
   analogWrite(5, 130);}
if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==1)&&(mocno_prawo==0)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
  analogWrite(3, 160);
   analogWrite(5, 100);}
if((mocno_lewo==0)&&(lewo==0)&&(lekko_lewo==0)&&(srodek==0)&&(lekko_prawo==0)&&(prawo==0)&&(mocno_prawo==1)){
 digitalWrite(11,HIGH);digitalWrite(12,HIGH);
   analogWrite(3, 160); //prawy
  analogWrite(5, 0);}
}

Dane z czujników jakie odczytuje to 0 lub 1 w zależności od koloru biały lub czarny - najazd na linie.

wzoruję się tym linkiem eFLL - A Fuzzy Library for Arduino i nie mam pojęcia przełożyć 7 pomiarów 0 lub 1 na fuzzy i zbudować funkcje przynależności ?

Link do komentarza
Share on other sites

Witam.

W sumie, moja pierwsza myśl była taka - to już jest logika rozmyta 😋 No bo np. reguły już są:

jeśli mocnoLewo THEN załącz silniki w takim kierunku z taką prędkością. Mam pewne trywialne pytanie- jak robot ma pewne ustawienie, to ile równocześnie czujników wykrywa linię? Tzn, ile czujników wysyła w tym ustawieniu 1? Jeśli 1, to sprowadza się to do reguł, procedur, i nawet chyba moim zdaniem biblioteka nie potrzebna 😋 Jeśli więcej, to w takim wypadku już miała by zastosowanie rasowa logika rozmyta. Ale wtedy wyglądło by to tak:

czujniki miałbyś ponumerowane, np. od 1-7. Stan mocnoLewo, słaboLewo, itp. nie byłby na sztywno przypisany do czujników. Przypisanie rozmytych wartości położenia wyglądało by na zasadzie:

FuzzySet* mocnoLewo= new FuzzySet(czuj1,czuj1,czuj2);

FuzzySet* slaboLewo= new FuzzySet(czuj2,czuj3,czuj4);

FuzzySet* srodkiem= new FuzzySet(czuj3,czuj4,czuj5); itd...

zakładam, że pierwszy parametr funckji FuzzySet to początek "stanu", środek to najwyższa wartość stanu (np. mocnoLewo =100), a ostani, to koniec, czyli mocnoLewo osiąga znowu 0.

Pozostało by jescze określenie stanów wyjscia:

FuzzySet* skręćMocnoLewo= new FuzzySet(-10,-5,0); itd. (argumentami są wartości, jak mocno w danym kierunku należy skręcić, - dla lewo, + dla prawo)

a potem wyostrzenie - w sumie wysotrzy się samo, zrobi to za nas biblioteka, do nas należy tylko określenie przedziałów dla określeń słownych i reguł.

Jednak wartość jaką "wypluje" float output = fuzzy->defuzzify(1); setRobotSpeed(output);

to nie to czego oczekujemy, poda dokładnie wartość o jaką trzeba skręcić robota. I tutaj trzeba "przetłumaczyć" tą wartość na wartości które umożliwią wysterowanie silników przez mostek H, przykładowo:

if(output <0) THEN

input1 = 1 AND input2 = 0

enable = -output (silnik 1 skręci robota z proporcjonalną do wartości output mocą w lewo)

if(output >= 0) THEN

input1 = 0 AND input2 = 1

enable = output (silnik 2 skręci robota z proporcjonalną do wartości output mocą w prawo)

Link do komentarza
Share on other sites

Ruszanie linią grubości jakieś 2cm nawet dosyć szybko powodowało zapalenie się max jednej 1. Niestety muszę zaimplementować na fuzzy logic 🙂

Dzieki za odpowiedź, coś mi to rozjaśniło, jutro postaram się to jeszcze raz rozczytać i ruszyć do przodu 🙂

no własnie to float output = fuzzy->defuzzify(1); setRobotSpeed(output); mnie najbardziej interesuje bo muszę krecić dwoma silnikami w jednym kierunku z różnym wypełnieniem PWM.

Dzięki jeszcze raz.

A jeszcze jedno, dlaczego tutaj FuzzySet* mocnoLewo= new FuzzySet(czuj1,czuj1,czuj2); są 3 wartości w nawiasie?

Link do komentarza
Share on other sites

Te trzy parametry podałem przykładowo, bo nie chciało mi się pisać 4 tak jak na stronie było 😉 Szczerze, nigdy nie miałem do czynienia z linefollowerami, więc niech się inni wypowiedzą co do czujników, ale jeśli uaktywniał się max. jeden czujnik to ułatwiało by mocno sprawę 😋

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

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