Difference between revisions of "Tello dron s OCR ovladanim - Jan Spirka"

From RoboWiki
Jump to: navigation, search
(Video ukážka)
Line 46: Line 46:
  
 
== Video ukážka ==
 
== Video ukážka ==
<youtube>IUpEpZEuZ1Q</youtube>
+
<youtube width="428" height="700">IUpEpZEuZ1Q</youtube>
  
 
== Zdrojový kód ==
 
== Zdrojový kód ==
 
[https://github.com/RoboCup-Junior-Slovensko/softverova-podpora/tree/master/dron-tello/ocr-controller Github]
 
[https://github.com/RoboCup-Junior-Slovensko/softverova-podpora/tree/master/dron-tello/ocr-controller Github]

Revision as of 00:55, 11 June 2021

Cieľ

Vytvoriť základ pre budúcu knižnicu, ktorá bude schopná na základe spracovania obrazu ovládať pohyb drona.

Použité technológie

  • Python
  • OpenCV
  • OCR (Tesseract)

Použité pip balíčky

  • cv2
  • djitellopy
  • pytesseract
  • time

Postup

Základom pre použitie drona Tello bude knižnica djitellopy, ktorá má v sebe zahrnuté funkcie na inicializáciu drona, komunikáciu s ním. Vďaka nej, nebude nutné ručne vytvárať sockety a posielať ich prostredníctvom UDP. Tiež nám dokáže zachytiť pakety obsahujúce video stream z drona a vyskladať nám z nich jeden celý frame, ktorý budeme môcť použiť na analýzu obrazu. Na prácu s obrazom bude použitá knižnica OpenCV a keďže dron bude ovládaný pomocou príkazov, ktoré mu budeme na kamere ukazovať, musíme doimplementovať použitie OCR systému, v našom prípade Tesseract.

Drona si musíme najprv nainicializovať, t.j. vytvoriť s ním spojenie a nastaviť mu prvotné hodnoty. Na to je potrebné zavolať funkciu initializeTello(). Inicializácia spočíva vo vytvorení inštancie drona a vytvorení spojenia pomocou príkazu connect(). Nasledujúce príkazy nastavujú počiatočnú rýchlosť drona a získanie stavu batérie. Potom je potrebné zavolať príkaz streamoff() ak už náhodou dron streamuje video a nanovo ho naštartujeme príkazom streamon().

InitializeTello.png

Všetka nasledujúca funkcionalita sa bude vykonávať v nekonečnom cycle. S dronom budeme v každej iterácii udržovať spojenie pomocou príkazu connect(). Obraz z drone získame po zavolaní funkcie telloGetFrame(). V tej získame obraz predstavovaný maticou a následne ho zmenšíme pre zrýchlenie výpočtov.

TelloGetFrame.png

Výsledný obraz si zobrazíme pre testovacie účely a začneme analýzu obrazu.

TelloImgShow.png

Tá spočíva z počiatočnej úpravy a to:

  • prevod matice z farebného spektra na čiernobiele
  • vytvorenie binárnej matice
  • vyhladenie obrazu filtrom
  • dilatácia vyhladenej binárnej matice
  • nájdenie kontúr vo výslednej binárnej matici

Následne je potrebné odfiltrovať relevantné zhluky pixelov spraviť výrez z celkového obrazu a spúšťať OCR len v rámci týchto výrezov lebo táto operácie je veľmi náročná na výpočtové prostriedky. Pre testovacie účely bolo dobré zobraziť si medzivýsledky práce s maticami. Návratovou hodnotou funkcie je pole v obraze rozoznaných reťazcov.

TelloFindCommand.png

Vo funkcii decodeCommand() následne prechádzame cez pole týchto reťazcov a hľadáme kľúčové slová. Princíp fungovania je jednoduchý, v prípade nájdenia zhody sa spojíme s dronom, chvíľku počkáme a spustíme potrebný príkaz pre spustenie pohybu.

TelloDecodeCommand.png

Nekonečný cyklus je možné ukončiť prostredníctvom stlačenia klávesy „q“. Dron potom bezpečne pristane a nekonečný cyklus sa preruší.

Video ukážka

Zdrojový kód

Github