Arxiu de l'autor: joanillo

Equacions diferencials. MDF: Mètode de les diferències finites

En anàlisi numèrica, el mètode de les diferències finites és un mètode utilitzat per calcular de manera aproximada les solucions a les equacions diferencials usant equacions diferencials finites per aproximar derivades.

En aquest article hem fet una introducció i una exposició aclaridora sobre aquest mètode bàsic de càlcul numèric per a la resolució d’equacions diferencials, i ho hem aplicat a l’exemple de la balística, en tres supòsits: projectil sense fregament; fregament proporcional a la velocitat; i fregament proporcional al quadrat de la velocitat.

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.

Llaç groc: llibertat presos polítics

Finalment hem penjat el llaç groc des del nostre balcó fins al balcó del senyor Jaume, al bell mig del carrer Milà i Fontanals de Barcelona. Avui, 30 de gener de 2018, dia que no s’ha pogut celebrar el ple del parlament perquè el nostre president Puigdemont no pot venir a defensar la seva candidatura a la presidència de la Generalitat.

Cada dia recordem que hi ha presos polítics: Oriol Junqeras, Quim Forn, Jordi Sánchez i Jordi Cuixart, i gent que està a l’exili i que no pot tornar amb garanties. Delictes? El que és delicte és continuar sent súbdits del Regne d’Espanya. Algú dirà que no hi ha majoria per proclamar la idependència… doncs fem un referèndum.

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.

Tauleta Pinball, nova màquina

Per Nadal vaig acabar aquesta taula de pinball, en el format de taula de cafè. Ja és la segona que he fet seguint aquest esquema, montant una TV de 32”. En aquest cas he incorporat algunes millores: la disposició dels botons i la implementació del nudge.

En el procés de construcció m’han vingut ganes de construir una màquina de pinball amb dos monitors (la configuració típica de playfield i backlight), o sigui que estic reunint les peces i ja estic pensant en el disseny. Serà un dels projectes per aquest trimestre.

Nova màquina: recreativa arcade vertical

Aquesta setmana he acabat una nova màquina, una recreativa vertical. Curiosament, és la segona que faig seguides. A mi aquest format m’agrada molt, ja veig que no sóc l’únic.

Com a novetat, he mirat de perfeccionar el tema del vidre que protegeix la pantalla, i el vidre del marquee retroil·luminat. La idea és que amb la fresadora s’ha de fer ranures, i el vidre va encastat dins d’aquestes ranures. El vidre es pinta per darrere, seguint el marc de la pantalla. Queda un resultat molt professional.

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:

Ordenando ideas con la librería SDL

Estoy programando en C++ y SDL el software para una máquina de dardos. Ya tengo casi acabada toda la parte de la lógica de la aplicación, así que he empezado a mirarme la parte gráfica, que haré con la libreria SDL como he utilizado en anteriores proyectos.

A raíz de migrar el proyecto a SDL (y conservando la compatitibilidad con la parte de consola) he tropezado con un error de programación de aquellos que te hacen perder el tiempo. Al final la cosa no ha sido grave, digamos que no era un error de concepto sino más bien de despiste, debido a que el código por momentos se está complicando y conviene mantener el código bien ordenado y lógico.

El cas es que, a raíz de este contratiempo, he querido hacer una pequeña recopilación del código mínimo SDL para pintar un trozo de texto por pantalla, utilizando diferentes técnicas: a) toda la parte de SDL mezclada en el fichero main.cpp; b) POO, utilizando un fichero para cada clase; c) POO, pero metiendo todas las clases en un solo fichero.

Los tres ejemplos se pueden descargar en el siguiente enlace: