Skocz do zawartości

Robot z PixyCam


desfaq

Pomocna odpowiedź

Hej,

Kiedyś zakupiłem podwozie robota wraz z czujnikami z kursu Kurs budowy robotów. Postanowiłem, że stworzę go nieco bardziej inteligentnym i dodam kamerę PixyCam, ponieważ chcę aby to był robot śledzący. Założenia póki co są dobre, kamera podłączona, kilka testów na reakcje z różnymi kolorami, no i test z silnikami. Teraz zaczęło się, ponieważ wiadomo, programowanie w robotyce to jest w kółko robienie testów i patrzenie jak się zachowuje nasz drogi robocik. Moim problemem jest to, że robot reaguje bardzo chaotycznie i pomimo względnej poprawności kodu (który wkleję poniżej), niestety robot albo ucieka od obiektu, który powinien śledzić, albo kompletnie ignoruje. Sprawdzałem otoczenie i kamera nie wykrywa innego źródła sygnału, niż od obiektu, który zadałem (s1). Moją prośbą jest to, żeby ktoś mógł zasugerować co mogę sprawdzić, żeby robot zaczął działać w pożądanym kierunku. Co mogę robić źle albo czego mi zabrakło?

Swoją drogą czytałem, że podobny program jest lepiej wykonywany przez Arduino Leonardo, czy to prawda czy raczej mit?

Użyte komponenty:

- Mechanika z kursu o robotach

- PixyCam

- Arduino Uno

- L298P Shield v1.2


#include <SPI.h>  
#include <Pixy.h>

Pixy pixy;

int signature = 0;
int x = 0;                      //positon x axis
int y = 0;                      //position y axis
unsigned int width = 0;         //object's width
unsigned int height = 0;        //object's height
unsigned int area = 0;
unsigned int newarea = 0;
int Xmin = 70;                  //min x position
int Xmax = 200;                 //max x position
int maxArea = 0;
int minArea = 0;
int motor1 = 4;                 //motor1 on Pin D4
int enable1 = 5;                //enable1 on Pin D5
int motor2 = 7;                 //motor2 on Pin D7
int enable2 = 6;                //enable2 on Pin D6
int Speed = 80;                 //speed for motor
static int i = 0;

void setup()
{ 
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode(enable1, OUTPUT);
  pinMode(enable2, OUTPUT);
  Serial.begin(9600);
  Stop();
  pixy.init();
}

void loop()
{ 
  while(millis()<5000)
  {
    scan();
    area = width * height; //calculate the object area 
    maxArea = area + 1000;
    minArea = area - 1000;
  }

    scan(); 

  if(signature == 1)//looking for signature 1
  {
    newarea = width * height; //calculate the object area
    
      if (x < Xmin)//turn left if x position < max x position
      {     
       left();
      }
      else if (x > Xmax) //turn right if x position > max x position
      {
       right();
      }
      else if(newarea < minArea)//go forward if object too small
      {
       forward(); 
      }
      else if(newarea > maxArea)//go backward if object too big
      {
       backward(); 
      }
      
      //else stop
      else
      {
        Stop(); 
      } 
   }
   else
   {
    Stop();
     }
}

void backward()//backward
  {
  digitalWrite(motor1, LOW);
  digitalWrite(motor2, LOW);
  analogWrite(enable1, Speed);
  analogWrite(enable2, Speed);
  }

void forward()//forward
  {
  digitalWrite(motor1, HIGH);
  digitalWrite(motor2, HIGH);
  analogWrite(enable1, Speed);
  analogWrite(enable2, Speed);
  }

void right()//turn right
  {
  digitalWrite(motor1, HIGH);
  digitalWrite(motor2, LOW);
  analogWrite(enable1, Speed);
  analogWrite(enable2, Speed); 
  }

void left()//turn left
  {
  digitalWrite(motor1, LOW);
  digitalWrite(motor2, HIGH);
  analogWrite(enable1, Speed);
  analogWrite(enable2, Speed); 
  }

void Stop()//stop
  {
  digitalWrite(enable1, LOW);
  digitalWrite(enable2, LOW);  
  }
void scan()
  {
  uint16_t blocks;
  blocks = pixy.getBlocks();  //receive data from pixy 
  signature = pixy.blocks[i].signature;    //get object's signature
  x = pixy.blocks[i].x;                    //get x position
  y = pixy.blocks[i].y;                    //get y position
  width = pixy.blocks[i].width;            //get width
  height = pixy.blocks[i].height;          //get height
} 

W załączonych grafikach jest chaos w kablach, ale wszystko jest podłączone poprawnie, M1 to prawy motor, M2 to lewy.

40138834_656771538036186_1129467066160513024_n.jpg 40187740_2179768098938201_3710022454278619136_n.jpg

  • Lubię! 1
Link do komentarza
Share on other sites

@desfaq, witam na forum!

Cieszę się, że robot z kursu będzie miał drugie, inteligentniejsze życie 😉 Programu jeszcze nie analizował, powiedz proszę najpierw czy testowałeś robota w takiej nowej konfiguracji. Czy jeździ on poprawnie z nowym sterownikiem? Pytam, aby uniknąć problemów typu: błędne sygnały wysyłane do mostka (bo jest inny niż w kursie) lub błędne zasilanie silników. Mostek, który teraz używasz jest dość stary, ma on duży spadek napięcia i takie samo sterowani silnikami (jak w kursie) może dawać inne efekty.

Link do komentarza
Share on other sites

Rzeczywiście, mostek użyłem tylko dlatego, że ten dołączony w kursie nie chciał współpracować z programem i nie reagował na pixy. Proste programy działały na L298, zresztą tego samego shielda użyłem do sterowania o wiele cięższym robotem, więc ten nie był problemem w sterowaniu. Spróbuję jeszcze pokombinować z hardwarem, może jeszcze raz spróbuję dogadać się z mostkiem z kursu. Być może tym razem będzie pozytywny wynik. W razie czego napiszę jak to wszystko się skończyło.

Link do komentarza
Share on other sites

Upewnij się czy mostek i napędy działają razem z kamerą. Możesz nie używać danych z kamery, ale spróbuj jechać zgodnie z jakimś schematem (prawo/lewo/prosto). Może się okazać, że kamer pobiera zbyt duży prąd i brakuje go dla silników lub np. zwyczajnie źle sterujesz silnikami i jazda prosto w programie wcale nie oznacza jazdy prosto w praktyce.

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

UPDATE:

Problemów jest kilka, ponieważ w kodzie zaznaczyłem zbyt duży obiekt pod względem osi axis-y, kiedy zmniejszyłem wartość pola na:

maxArea = area + 500;
minArea = area - 500;

to wtedy robot zaczął bardziej sensownie reagować.

Problem numer dwa polega na różnorodności otoczenia, zbyt dużo kolorów mam w mieszkaniu i stąd jest duży szum i ATMega328 troszkę szaleje, zresztą nie tylko ona, bo pixy zbyt często zmienia obiekty i sterowanie silnikami wygląda pokracznie. Podobno Arduino Leonardo lub MBot lepiej sobie radzą z takimi problemami. Pod warunkiem, że laboratorium ma jednolite tło, a moje nie ma.

Trzeci problem polegał na mostku, wróciłem do płytki, która przyszła z robotem i ponownie spróbowałem testów z kalibracją Pixy i delikatną zmianą kodu, to wtedy zaczęło nawet działać. Powiedzmy.

Efekt końcowy jest taki, że robot jedyny przedmiot, który chce śledzić to książka Stanisława Lema "Eden", a raczej jej okładkę o zielonym kolorze. Ale wtedy wkradają się cienie i często gubi sygnał. Więc albo otoczenie jest głównym winowajcą w tym momencie, albo procesor, który nie radzi sobie z szumem informacyjnym od Pixy.

W każdym razie, ktoś jeszcze bawił się kamerami PixyCam? Miałby może jakieś rady odnośnie parowania ich z robotami?
Kolejnym moim krokiem jest umieszczenie kamery na servie i usprawnić śledzenie przedmiotów i myślałem nad doświetlaniem obiektów przez pasek LEDów. To może się udać czy dać sobie siana?

Link do komentarza
Share on other sites

1 godzinę temu, desfaq napisał:

UPDATE:

Problemów jest kilka, ponieważ w kodzie zaznaczyłem zbyt duży obiekt pod względem osi axis-y, kiedy zmniejszyłem wartość pola na:


maxArea = area + 500;
minArea = area - 500;

to wtedy robot zaczął bardziej sensownie reagować.

Problem numer dwa polega na różnorodności otoczenia, zbyt dużo kolorów mam w mieszkaniu i stąd jest duży szum i ATMega328 troszkę szaleje, zresztą nie tylko ona, bo pixy zbyt często zmienia obiekty i sterowanie silnikami wygląda pokracznie. Podobno Arduino Leonardo lub MBot lepiej sobie radzą z takimi problemami. Pod warunkiem, że laboratorium ma jednolite tło, a moje nie ma.

Trzeci problem polegał na mostku, wróciłem do płytki, która przyszła z robotem i ponownie spróbowałem testów z kalibracją Pixy i delikatną zmianą kodu, to wtedy zaczęło nawet działać. Powiedzmy.

Efekt końcowy jest taki, że robot jedyny przedmiot, który chce śledzić to książka Stanisława Lema "Eden", a raczej jej okładkę o zielonym kolorze. Ale wtedy wkradają się cienie i często gubi sygnał. Więc albo otoczenie jest głównym winowajcą w tym momencie, albo procesor, który nie radzi sobie z szumem informacyjnym od Pixy.

W każdym razie, ktoś jeszcze bawił się kamerami PixyCam? Miałby może jakieś rady odnośnie parowania ich z robotami?
Kolejnym moim krokiem jest umieszczenie kamery na servie i usprawnić śledzenie przedmiotów i myślałem nad doświetlaniem obiektów przez pasek LEDów. To może się udać czy dać sobie siana?

Cześć,

i wydałeś na to "Pixy Cam" prawie 400 PLN? Weź sobie standardowe RPI3 i bibliotekę "OpenCV" (jest też jej port na Pythona) oraz standardową kamerę do RPI. Przeczytaj artykuł Elvisa na temat "OpenCV" na RPI  (poza tym jest mnóstwo tutoriali w sieci do OpenCV) i ogarniesz temat dużo szybciej niż z tym wynalazkiem zwanym "Pixy Cam".

Pozdrawiam

 

Edytowano przez FlyingDutch
  • Lubię! 1
Link do komentarza
Share on other sites

Akurat to jest projekt przy współpracy z uczelnią. Tworzę robota, który byłby w stanie śledzić człowieka. Taki robot, który woziłby za sobą wagonik, cargobot. I teraz moim celem jest zrobienie optycznej smyczy czy czegokolwiek co pozwoli śledzić konkretną osobę.

Jeśli ktoś chciałby zaproponować rozwiązanie, to z chęcią bym się dowiedział czegoś od bardziej doświadczonych osób.

  • Lubię! 1
Link do komentarza
Share on other sites

Problem, który sobie wybrałeś jest z gatunku "trudnych". To jest jedna z tych rzeczy, które się *wydają* takie proste, bo przecież we wszystkich książkach i filmach science fiction występuje, a które mimo to jest nadal nierozwiązana.

Z drugiej strony, pomału komputery są już wystarczająco szybkie, żeby robić namiastkę tej analizy wizualnej, którą nasz mózg robi cały czas naturalnie. Ale to dotyczy w miarę współczesnych komputerów, a nie biednej 8-bitowej 20-letniej atmegi. Kolega polecił ci RaspberryPi, ja ci mogę do tego jeszcze dorzucić OpenMV, która ma specjalnie zoptymalizowane algorytmy pod mikrokontroler (który i tak jest o trzy rzędy wielkości mocniejszy od atmegi). Zastanów się też nad uproszczeniem zadania, na przykład przez użycie fiduciali. W OpenMV masz wbudowaną obsługę AprilTagów — to mogłoby dla ciebie działać dość dobrze.

Link do komentarza
Share on other sites

Akurat zastępowanie PixyCam przez OpenMV nie ma najmniejszego sensu - to właściwie to samo https://pixycam.com/

Jedyna różnica to układ LPC4330 na pokładzie PixyCam (https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:overview) zamiast STM32F7 na OpenMV - ale oba układy są podobne i oba bezsensownie drogie. Moim zdaniem rada kolegi @FlyingDutch była jak najbardziej na miejscu, szkoda kasy na układy z rdzeniem Cortex-M, taniej wychodzi malinka, czy nano-pi z kamerką, a chociaż moc obliczeniowa większa.

Ale skoro układ już wybrany to zostaje życzyć szczęścia w reazliacji projektu 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, desfaq napisał:

Akurat to jest projekt przy współpracy z uczelnią. Tworzę robota, który byłby w stanie śledzić człowieka. Taki robot, który woziłby za sobą wagonik, cargobot. I teraz moim celem jest zrobienie optycznej smyczy czy czegokolwiek co pozwoli śledzić konkretną osobę.

Jeśli ktoś chciałby zaproponować rozwiązanie, to z chęcią bym się dowiedział czegoś od bardziej doświadczonych osób.

Cześć,

rozważyłbym czujnik "Kinect" Microsoftu - może śledzić do 8-miu celów w tym człowieka z dokładnością do punktów szkieletu kostnego. Niestety API pod Windows (i trzeba do tego mocnego kompa). Może mocniejszy SBC typu "LattePanda" dałby radę. Ale musiałbyś mieć dużo większego robota.

Zobacz też algorytm "Viola Jones" do śledzenia obiektów jest barzo wydajny i "pójdzie" na słabym sprzęcie. Tutaj link do jednej z implementyacji:

https://www.codeproject.com/Articles/441226/Haar-feature-Object-Detection-in-Csharp

https://www.codeproject.com/Articles/85113/Efficient-Face-Detection-Algorithm-using-Viola-Jon

Pozdrawiam

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

O ile rozumiem PixyCam śledzi tylko obiekt określonego koloru - to dużo łatwiejsze. Więc w sumie pewnie i na cortex-m da się to spokojnie zrobić. Tylko trzeba potestować jak moduł kamerki działa, napisać program, sprawdzić zasilanie... Ale skoro to praca zaliczeniowa, to chyba Autor powinien się wykazać. W końcu jeśli ma mieć z tego dyplom to niech na niego zapracuje 🙂

Link do komentarza
Share on other sites

19 minut temu, Elvis napisał:

Akurat zastępowanie PixyCam przez OpenMV nie ma najmniejszego sensu - to właściwie to samo https://pixycam.com/

 

Właściwie to nie to samo. Ale dokumentacja jest dostępna i przykłady pokazują różnice, więc skoro kolega ich nie dostrzega, to widocznie tak sobie już postanowił i nie widzę sensu w przekonywaniu.

Link do komentarza
Share on other sites

Prawdę mówiąc nie przeglądałem tak dokładnie dokumentacji PixyCam - zobaczyłem tylko że ma na pokładzie mikrokontroler NXP, potrafi wykonywać prostą analizę obrazu oraz wysyłać wyniki przez port szeregowy. Więc sprzętowo rozwiązania dość podobne, a co do szegółów, to chętnie się dowiem - chociaż po przygodzie z OpenMV raczej wolę nie używać 🙂

Link do komentarza
Share on other sites

Od siebie dorzucę link do tego artykułu: Jetson TK1 okiem robotyka – #4 – Przykładowa aplikacja. Można w nim zobaczysz jak zaawansowana była realizacja projektu, w którym robot śledził człowieka z odblaskową opaską, która posłużyła za znacznik. Tam jednostką obliczeniową był układ Jetson TK1.

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.