Arxiu de la categoria: dards – dardos – darts

darts-machine v0.0.12. Avançant en el projecte

Espero que la versió 0.0.12 sigui la última abans de barrejar tot el codi amb la detecció i calibració dels dards, que utilitza dos càmeres web i la llibreria OpenCV.

La principal novetat de les darreres versions és que ara es pot rectificar una entrada dels dards. Malauradament, ara tinc clar que no es pot aconseguir una fiabilitat del 100% en la detecció dels dards, o sigui que més val pensar en la lògica que ens permetrà rectificar la puntuació dels dards. A més d’anular el punt i restablir l’estat anterior, es proposa els punts més propers, que són els més probables. Per exemple, si hem detectat D20 i és un error, els punts més probables són MISS, 20, D1 i D5.

He ficat colors en la consola, com es veu a la foto, doncs la idea és que en la màquina es podrà jugar en aquesta interfície de consola. Només falta barrejar el subsistema de detecció. Així doncs, la part gràfica, basada en SDL (ja he fet proves de la migració a SDL), i la interface dels botons que necessitaré, ho deixaré pel final de tot.

Els jocs implementats són el 301 (i les seves variants), Cricket, Count-Up, Halve It i Round the Clock. El codi està pensat per tal de què sigui fàcil afegir nous jocs de dard en el cas de què sigui necessari. Es pot jugar de 1 a 4 jugadors. El codi de moment no preveu jugar per equips, és una millora que es deixa per més endavant si fos necessari.

El projecte es troba al GitHub:

Detecció dels dards: Primeres proves

Ja tinc el prototipus del moble, i ja puc començar a fer proves per a detectar els dards. Com es veu al video, la detecció és molt bona. Si ens fixem en la configuració, la webcam està en el mateix pla XY que la diana. Això crec que té avantatges en la detecció del dard; i desavantatges: necessitaré 2 webcams, i possiblement 3 webcams per posicionar amb fiabilitat el dard en la diana.

Utilitzem la llibreria OpenCV sobre C++, i el flux bàsic consisteix en fer una captura de la webcam; llençar el dard; i fer una altra captura. Aleshores es fa la diferència de les imatges; es converteix a binari; s’aplica una màscara per eliminar bona part del dard. En aquest moment hem de veure la part de baix del dard, i ben clarament la punta. Tenim un número limitat de punts blancs. Amb aquests punts calculem el moment, que seria el centre de gravetat dels punts. I fent un bucle sobre tots els punts puc detectar el punt més inferior, que seria la punta del dard. Finalment, per eliminar possibles errors, calculo la distància entre la punta i el moment, que ha de ser un valor petit.

Encara queda molta feina per fer. D’una banda, s’ha de traduir la detecció del dard als possibles sectors on està el dard. Després afegir una altra webcam. I si afegeixo una tercera webcam, segurament necessitaré algun USB Hub. L’objectiu és utilitzar una sola Raspberry Pi 3 en tot el projecte.

Prototipus de diana de dards II

Fa uns dies vaig construir el primer prototipus de moble, i ja vam fer unes quantes proves per detectar els dards. He tret bastantes conclusions del primer prototipus, i he arribat a la conclusió de què s’ha de fer un nou moble, amb unes noves dimensions.

La primera consideració és la distància de la webcam a la diana. Amb la webcam amb què estic fent les proves (Creative Live! Cam Sync HD), la distància de la webcam al centre de la diana ha de ser com a mínim de 46 cm. Un altre tema important és que el pla de la càmera ha de coincidir exactament amb el pla XY de la diana (aquesta és la manera com jo abordo la posició de les càmeres, evidentment necessitaré dues càmeres, o potser tres). La il·luminació ha de ser uniforme, i sobretot, la construcció ha de ser sòlida. La clau està en què quan faig la sostracció entre una captura i la següent (en la què s’ha llençat un dard), la diferència entre les imatges ha de ser realment la detecció del nou dard (no ha d’haver-hi cap mena de soroll).

Ja he estat fent proves amb el nou prototipus, i val a dir que els resultats han estat molt bons (faré un post i un video properament), o sigui que puc afrontar amb optimisme la part més crítica del projecte.

Com es veu en la imatge, la idea que tinc del moble és integrar una pantalla de 15 polzades just a a sota de la diana, i ficar-hi també els tres o quatre botons que necessitaré per interactuar amb el software. La part del software la tinc bastant avançada, però ara m’he de centrar més en la detecció dels dards.

Un altre tema que he de fer els propers dies és convertir la posició del dard a la puntuació de la diana. No cal dir que amb una sola càmera (en el mateix pla XY que la diana) això és impossible, es necessitaran dues càmeres mínim.

Prototipus de diana de dards amb bona il.luminació

A veure si dono una empenta al projecte de la diana electrònica. He avançat bastant en el software. Vaig fer proves en el seu dia amb la llibreria OpenCV, i ara és el moment d’atacar la part crítica del problema, que és la detecció fiable dels darts.

Com que el problema és bastant crític, el primer serà tenir la diana amb unes condicions de llum ben controlades, amb il·luminació uniforme i sense ombres. Per fer-ho, he fet una estructura de fusta amb tira de LEDs pels costats, com es veu a la foto. El següent pas serà aconseguir unes webcams decents. De moment les proves les he fet amb una webcam molt senzilla amb resolució de 480px. Estic esperant una webcam de 720px, que a part d’una millor resolució espero que tingui una millor qualitat. Finalment també disposo d’una RaspiCam NoIR (la càmera d’infrarrojos pròpia de la Raspberry Pi). Aquesta sí que té una bona resolució i qualitat, el problema és que no és USB, i per tant en una Raspberry Pi només hi pot haver una càmera RaspiCam.

La meva idea inicial és utilitzar una sola Raspberry Pi 3, amb dues webcams USB connectades. Es tracta d’anar fent proves i anar controlant totes les variables i causístiques que es puguin donar. Per sort, en tot aquest procés no estic sol, sinó que hi ha més gent engrescada en la construcció d’una diana eletrònica amb dards de punta de ferro. Concretament el projecte https://github.com/hanneshoettinger/opencv-steel-darts i la discussió que es genera en el grup de Facebook de https://www.facebook.com/groups/281778298914107/. Feia anys que no entrava al Facebook, ja veig que les properes setmanes seré un assidu.

Ja aniré explicant les meves aventures i avenços.

recreativa dards v0.0.8

Ja tinc ganes de fer aquesta nova recreativa: una màquina de darts amb detecció automàtica dels darts i la seva puntuació. Però no dards amb punta de plàstic. Ha de ser un dartboard original de suro amb dards de punta metàl·lica.

Per a la detecció dels dards hi havia la possibilitat d’utilitzar una malla resistiva i poder posicionar on llencem els dards. Però crec que no seria de fiar. El millor serà utilitzar visió per computadora amb OpenCV. Ja parlaré sobre el tema més endavant.

De moment he estat treballant amb la lògica dels diferents jocs de dards que hi ha. Els més populars són: 301, 501, Count Up, Cricket, Round the Clock, Halve it. I ara ja puc presentar la primera versió de l’aplicació, no funcional, que només funciona a la consola de Linux. Aquesta versió simula partides reals de fins a 4 jugadors: primer esculls el joc; després número de jugadors; després assignes els usuaris; comencem a jugar al joc seleccionat passant per les diferents rondes (cada ronda són tres tirades dels dards). I així anem registrant la puntuació fins que arribem al guanyador.

En les següent versions del programa (escrit amb C++) s’haurà d’implementar tota la part de OpenCV, i finalment tota la part de SDL (llibreria gràfica). Tot haurà de córrer en una Raspberry Pi 3, de manera que el desenvolupament el faig en el portàtil, però assegurant la portabilitat a la RPi3. Aquest hauria de ser el projecte estrella d’aquest semestre. És una idea que em persegueix de fa tres anys. De fet no és una idea original, hi ha diversos projectes que utilitzen dards amb punta de ferro i taulells de suro o fibra, en comptes de les dianes electròniques amb puntes de plàstic. Potser ara el projecte més similar seria open-cv-steeldarts, que s’està desenvolupant amb Python i que encara no és plenament funcional. Li donaré una ullada sobretot pel tema de la calibració i detecció dels dards.

Enllaços:

Ordenant idees amb la llibreria SDL

Estic programant amb C++ i SDL el software per a una màquina de dards. Ja tinc quasi bé acabada tota la part de la lògica de l’aplicació, així que he començat a mirar-me la part gràfica, que faré amb la llibreria SDL com he utilitzat en altres projectes.

Arrel de migrar el projecte a SDL (tot i conservant la compatitibilitat amb la part de consola) he ensopegat amb un error de programació d’aquells que et fan perdre temps. Al final la cosa no ha sigut greu, diguem que no era un error de concepte sinó més aviat un despiste, degut a què el codi per moments s’està complicant i convé mantenir el codi ben ordenat i lògic.

El cas és que, arrel d’aquest contratemps, he volgut fer una petita recopilació del codi mínim SDL per pintar un tros de text per pantalla, utilitzant diferents tècniques: a) tota la part de SDL barrejada en el fitxer main.cpp; b) POO, utilitzant un fitxer per cada classe; c) POO, però ficant totes les classes en un sol fitxer.

Els tres exemples es poden descarregar: