{"id":1605,"date":"2011-01-22T16:09:07","date_gmt":"2011-01-22T14:09:07","guid":{"rendered":"http:\/\/yeti.albascout.ro\/blog\/?p=1605"},"modified":"2011-02-21T02:54:30","modified_gmt":"2011-02-21T00:54:30","slug":"o-idee-pentru-eurobot","status":"publish","type":"post","link":"https:\/\/yeti.albascout.ro\/blog\/o-idee-pentru-eurobot\/","title":{"rendered":"O idee pentru Eurobot"},"content":{"rendered":"<p>Tema de anul \u0103sta pentru <a href=\"http:\/\/www.eurobot.org\">Eurobot<\/a>, concursul de robotic\u0103 autonom\u0103 la care particip\u0103m de c\u00e2\u021biva ani, se nume\u0219te &#8222;Chess&#8217;up&#8221;, \u0219i \u00een esen\u021b\u0103 spune c\u0103 ai o tabl\u0103 de \u0219ah \u0219i robotul care are mai multe piese la sf\u00e2r\u0219itul timpului de 90 de secunde pe culoarea lui c\u00e2\u0219tig\u0103. Am mai scris aici de regulile Eurobot, pentru cei interesa\u021bi pute\u021bi g\u0103si mai multe detalii la oameni pe site.<\/p>\n<p>Una din ideile pe care le \u00eencerc\u0103m anul \u0103sta este determinarea obiectelor de pe masa de concurs cu ajutorul a 3 camere video (avem la dispozi\u021bie trei locuri pentru a plasa balize, la o anumit\u0103 \u00een\u0103l\u021bime, pe marginea mesei). Ideea o avem din octombrie, dar zilele astea am reu\u0219it s\u0103 fac ceva progrese.<\/p>\n<p><!--more--><\/p>\n<p>M-am jucat un pic cu python \u0219i <a href=\"http:\/\/opencv.willowgarage.com\/wiki\/\">OpenCV<\/a>, \u0219i am reu\u0219it \u00een c\u00e2teva linii s\u0103 determin p\u0103tratele (tabla de \u0219ah), cu un webcam ieftin (codul, pe care l-a\u0219 fi postat aici, a disp\u0103rut \u00eempreun\u0103 cu laptop-ul meu, dar \u00een esen\u021b\u0103 am transformat imaginea din RGB in HSV, am aplicat un filtru de extrac\u021bie de margini pe componenta <em>Hue<\/em> (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Edge_detection\">edge-detection<\/a> &#8211; cum \u00eei spunem \u00een rom\u00e2n\u0103?), \u0219i apoi am aplicat <a href=\"http:\/\/en.wikipedia.org\/wiki\/Hough_transform\">transformarea Hough<\/a> (pentru puncte coliniare, nu pentru cercuri) pe rezultat, cu ni\u0219te parametrii tuna\u021bi de m\u00e2n\u0103.<\/p>\n<p>Ok, dup\u0103 ce am prins pu\u021bin curaj cu OpenCV, urm\u0103torul pas ar fi trebuit s\u0103 fie s\u0103 vedem ce se \u00eent\u00e2mpl\u0103 c\u00e2nd avem mai multe camere, plasate acolo unde urmeaz\u0103 s\u0103 fie (dimensiunea st\u00e2lpilor pentru balize, ca \u0219i pozi\u021bionarea lor \u0219i dimensiunile balizelor sunt bine reglementate), ca s\u0103 vedem cam cum arat\u0103 \u0219i s\u0103 putem rula ni\u0219te teste.<\/p>\n<p><strong>The setup. <\/strong>Chiar dac\u0103 sunt str\u00e2mtorat acum, de c\u00e2nd cu <a href=\"http:\/\/yeti.albascout.ro\/blog\/?p=1600\">problema cu laptop-ul<\/a>, am g\u0103sit trei <a href=\"http:\/\/www.emag.ro\/camere-web\/camera-web-a4tech-pk-836mj--pPK-836MJ\">camere<\/a> de 10 EUR la eMag, care par s\u0103 fie potrivite. Camerele web (cel pu\u021bin astea ieftine la care m-am uitat eu), au o deschidere \u00een jur de 60 &#8211; 65 de grade, ceea ce, dup\u0103 calculele mele, plasate central este suficient pentru ce c\u0103ut\u0103m noi, chiar dac\u0103 3 &#8211; 4 grade pe margini sunt afectate de abera\u021biile optice inevitabile la categoria asta de pre\u021b.<\/p>\n<figure id=\"attachment_1606\" aria-describedby=\"caption-attachment-1606\" style=\"width: 500px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/01\/rect3764.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1606\" title=\"Acoperire la 66 de grade\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/01\/rect3764.png\" alt=\"\" width=\"500\" height=\"358\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/01\/rect3764.png 500w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/01\/rect3764-300x214.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption id=\"caption-attachment-1606\" class=\"wp-caption-text\">Acoperire pentru deschidere de 66 de grade. Punctele ro\u0219ii sunt pozi\u021biile pentru camere, cadrul alb este masa de concurs<\/figcaption><\/figure>\n<p>\u00cen diminea\u021ba asta am montat camerele pe masa de concurs \u0219i le-am legat pe toate printr-un hub \u0219i ni\u0219te prelungitoare USB la un singur punct, \u0219i de aici urmeaz\u0103 distrac\u021bia.<\/p>\n<p><strong>Ideea de baz\u0103.<\/strong> Obiectivul este s\u0103 detect\u0103m toate elementele de pe mas\u0103, \u0219i s\u0103 inform\u0103m robotul de pozi\u021bia lor exact\u0103. \u00cen mod cert solu\u021bia cu USB-ul nu va \u021bine, pentru c\u0103 robotul nu poate fi conectat prin fir la balize, dar este un pas pentru un <a href=\"http:\/\/en.wikipedia.org\/wiki\/Proof_of_concept\">POC<\/a> care s\u0103 \u00eel implement\u0103m apoi \u00eentr-o form\u0103 viabil\u0103 (\u00eenc\u0103 ne g\u00e2ndim foarte serios la smartphone-uri).<\/p>\n<p>Ce \u00eencerc\u0103m s\u0103 ob\u021binem este o imagine &#8222;de deasupra&#8221; a mesei. Cu o asemenea imagine, real-time, ne-am putea orienta foarte bine chiar dac\u0103 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Odometry\">odometria<\/a> (partea aia cu encodere) nu func\u021bioneaz\u0103, \u0219i am putea s\u0103 \u00eel urm\u0103rim \u0219i pe adversar \u0219i s\u0103 \u00eei \u00eenregistr\u0103m mi\u0219c\u0103rile. Mai mult, imaginea &#8222;de deasupra&#8221; ar putea fi tridimensional\u0103, adic\u0103 s\u0103 avem \u00een\u0103l\u021bimile obiectelor de pe mas\u0103.<\/p>\n<p><strong>Algoritmul<\/strong> la care m\u0103 gandesc acum ar face o transformare pe fiecare camer\u0103 de la vedere normal\u0103, la unghi, \u00een vedere <em>de sus<\/em>. \u00cen mod evident, obiectele de pe mas\u0103 au o \u00een\u0103l\u021bime diferit\u0103 de 0 (doh!), \u0219i asta \u00eenseamn\u0103 c\u0103 imaginea transformat\u0103 de la o camer\u0103 nu poate da o vedere complet\u0103 \u0219i corect\u0103 (pentru c\u0103 nu vedem ce e \u00een spatele obiectelor). Informa\u021bia pentru un obiect de pe mas\u0103 este valid\u0103 \u00een imaginea transformat\u0103 doar pentru punctul \u00een care \u00een\u0103l\u021bimea obiectului este, \u00eentr-adev\u0103r 0 (unde se atinge de mas\u0103). Acum, eu cred c\u0103, dac\u0103 combin\u0103m imaginile transformate, consider\u00e2nd \u0219i erorile (sau punctele \u00een care nu \u0219tim ce este) introduse de transformare, \u0219i d\u0103m prioritate pentru fiecare <em>parte<\/em> a unui obiect imaginii <em>camerei care are vederea cea mai bun\u0103<\/em> a acelui obiect, am putea s\u0103 identific\u0103m pozitiile \u0219i s\u0103 deducem \u00een\u0103l\u021bimea obiectelor.<\/p>\n<p><strong>Problema.<\/strong> Pe masa de concurs vor fi, \u00een acela\u0219i timp, \u00een jur de 15 pioni (care sunt destul de mari) \u0219i ambii robo\u021bi care concureaz\u0103, \u0219i mi-e team\u0103 c\u0103 va fi prea aglomerat. Aici vine \u00een ajutor faptul c\u0103, \u00eenafara de cei doi robo\u021bi, dimensiunile \u0219i culoarea restului obiectelor este \u00een principiu bine determinat\u0103.<\/p>\n<p>A lucrat cineva cu reconstruc\u021bie de-asta de scen\u0103 din mai multe puncte de vedere? Sunt deschis la idei \u0219i propuneri :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tema de anul \u0103sta pentru Eurobot, concursul de robotic\u0103 autonom\u0103 la care particip\u0103m de c\u00e2\u021biva ani, se nume\u0219te &#8222;Chess&#8217;up&#8221;, \u0219i \u00een esen\u021b\u0103 spune c\u0103 ai o tabl\u0103 de \u0219ah \u0219i robotul care are mai multe piese la sf\u00e2r\u0219itul timpului de 90 de secunde pe culoarea lui c\u00e2\u0219tig\u0103. Am mai scris aici de regulile Eurobot, pentru &hellip; <a href=\"https:\/\/yeti.albascout.ro\/blog\/o-idee-pentru-eurobot\/\" class=\"more-link\">Continu\u0103 s\u0103 cite\u0219ti <span class=\"screen-reader-text\">O idee pentru Eurobot<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[564],"tags":[727,810,616,731,733,732],"class_list":["post-1605","post","type-post","status-publish","format-standard","hentry","category-roboti","tag-cs-pub","tag-doctorat","tag-eurobot","tag-eurobot2011","tag-opencv","tag-proiect"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/comments?post=1605"}],"version-history":[{"count":4,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1605\/revisions"}],"predecessor-version":[{"id":1608,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1605\/revisions\/1608"}],"wp:attachment":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/media?parent=1605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/categories?post=1605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/tags?post=1605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}