Tema de anul ăsta pentru Eurobot, concursul de robotică autonomă la care participăm de câțiva ani, se numește „Chess’up”, și în esență spune că ai o tablă de șah și robotul care are mai multe piese la sfârșitul timpului de 90 de secunde pe culoarea lui câștigă. Am mai scris aici de regulile Eurobot, pentru cei interesați puteți găsi mai multe detalii la oameni pe site.
Una din ideile pe care le încercăm anul ăsta este determinarea obiectelor de pe masa de concurs cu ajutorul a 3 camere video (avem la dispoziție trei locuri pentru a plasa balize, la o anumită înălțime, pe marginea mesei). Ideea o avem din octombrie, dar zilele astea am reușit să fac ceva progrese.
M-am jucat un pic cu python și OpenCV, și am reușit în câteva linii să determin pătratele (tabla de șah), cu un webcam ieftin (codul, pe care l-aș fi postat aici, a dispărut împreună cu laptop-ul meu, dar în esență am transformat imaginea din RGB in HSV, am aplicat un filtru de extracție de margini pe componenta Hue (edge-detection – cum îi spunem în română?), și apoi am aplicat transformarea Hough (pentru puncte coliniare, nu pentru cercuri) pe rezultat, cu niște parametrii tunați de mână.
Ok, după ce am prins puțin curaj cu OpenCV, următorul pas ar fi trebuit să fie să vedem ce se întâmplă când avem mai multe camere, plasate acolo unde urmează să fie (dimensiunea stâlpilor pentru balize, ca și poziționarea lor și dimensiunile balizelor sunt bine reglementate), ca să vedem cam cum arată și să putem rula niște teste.
The setup. Chiar dacă sunt strâmtorat acum, de când cu problema cu laptop-ul, am găsit trei camere de 10 EUR la eMag, care par să fie potrivite. Camerele web (cel puțin astea ieftine la care m-am uitat eu), au o deschidere în jur de 60 – 65 de grade, ceea ce, după calculele mele, plasate central este suficient pentru ce căutăm noi, chiar dacă 3 – 4 grade pe margini sunt afectate de aberațiile optice inevitabile la categoria asta de preț.
În dimineața asta am montat camerele pe masa de concurs și le-am legat pe toate printr-un hub și niște prelungitoare USB la un singur punct, și de aici urmează distracția.
Ideea de bază. Obiectivul este să detectăm toate elementele de pe masă, și să informăm robotul de poziția lor exactă. În mod cert soluția cu USB-ul nu va ține, pentru că robotul nu poate fi conectat prin fir la balize, dar este un pas pentru un POC care să îl implementăm apoi într-o formă viabilă (încă ne gândim foarte serios la smartphone-uri).
Ce încercăm să obținem este o imagine „de deasupra” a mesei. Cu o asemenea imagine, real-time, ne-am putea orienta foarte bine chiar dacă odometria (partea aia cu encodere) nu funcționează, și am putea să îl urmărim și pe adversar și să îi înregistrăm mișcările. Mai mult, imaginea „de deasupra” ar putea fi tridimensională, adică să avem înălțimile obiectelor de pe masă.
Algoritmul la care mă gandesc acum ar face o transformare pe fiecare cameră de la vedere normală, la unghi, în vedere de sus. În mod evident, obiectele de pe masă au o înălțime diferită de 0 (doh!), și asta înseamnă că imaginea transformată de la o cameră nu poate da o vedere completă și corectă (pentru că nu vedem ce e în spatele obiectelor). Informația pentru un obiect de pe masă este validă în imaginea transformată doar pentru punctul în care înălțimea obiectului este, într-adevăr 0 (unde se atinge de masă). Acum, eu cred că, dacă combinăm imaginile transformate, considerând și erorile (sau punctele în care nu știm ce este) introduse de transformare, și dăm prioritate pentru fiecare parte a unui obiect imaginii camerei care are vederea cea mai bună a acelui obiect, am putea să identificăm pozitiile și să deducem înălțimea obiectelor.
Problema. Pe masa de concurs vor fi, în același timp, în jur de 15 pioni (care sunt destul de mari) și ambii roboți care concurează, și mi-e teamă că va fi prea aglomerat. Aici vine în ajutor faptul că, înafara de cei doi roboți, dimensiunile și culoarea restului obiectelor este în principiu bine determinată.
A lucrat cineva cu reconstrucție de-asta de scenă din mai multe puncte de vedere? Sunt deschis la idei și propuneri :)
Un comentariu la „O idee pentru Eurobot”