Arxiu de la categoria: Programació

Arbres singulars de Barcelona: Salvem l’alzina!

Aquí estic jo estudiant la programació amb OSM, actualitzant des d’un script python els arbres singulars de Barcelona, i evidentment m’he topat amb l’alzina de la caseta del carrer Encarnació.

Quina contradicció! D’una banda volem protegir el patrimoni i prendre consciència del medi natural que tenim dins una gran ciutat, i d’altra banda veiem com hi ha gent que li importa una merda tot això i només pensa en un terreny pel valor econòmic que té i el rendiment que en pot treure.

Doncs això, s’ha de salvar l’alzina i les casetes del carrer Encarnació de l’especulació urbanística. La gent que està a l’ajuntament que es mullin de veritat i que posin sobre la taula una proposta que acontenti totes les parts.

Per visualitzar tots els arbres singulars que hi ha a Barcelona podem fer servir overpass-turbo.eu, que ens permet realitzar una consulta i veure’n el resultat gràfic de forma fàcil.

area[“name”=”Barcelona”]->.boundaryarea;
(
nwr(area.boundaryarea)[note~’Arbres d\\’interès local de Barcelona’];
nwr(area.boundaryarea)[tree];
);
out meta;

Arbres monumentals de Catalunya a OpenStreetMap (2a part)

Ja he fet l’actualització dels arbres monumentals, són més de 200 arbres. No hem volgut fer una inserció automàtica, perquè sóc conscient de què hi ha informació que ja existeix, i vull ser respectuós amb aquesta informació. Per tant, el script és interactiu perquè, donat un node/arbre que ja existeix (el criteri és cercar arbres en un entorn de 50m del punt on vull inserir), vull comparar la informació antiga amb la nova.

Al final, de la llista de 222 arbres monumentals que tenim, hem inserit al voltant d’un 80% dels arbres, i de la resta s’ha actualitzat la informació.

Aquest estiu vam anar a veure el Pi de les Tres Branques. Feia anys que no anava al Camp Llong, vora de Berga, un indret realment idíl·lic. Després volíem buscar el Pi Jove, també arbre monumentals, que és allí a la vora, i no el vam trobar. Ara quan hi torni ja no tindré excusa per trobar-lo.

Aquest exercici ha estat un bon punt de partida per col·laborar amb la comunitat OpenStreetMap amb una tasca concreta i fàcil. Espero poder seguir col·laborant amb l’actualització dels mapes de OSM.

Arbres monumentals de Catalunya a OpenStreetMap (1a part)

Aquestes últimes setmanes he renovat el meu interès pel projecte OpenStreetMap, i m’he centrat en la part de contribuir en l’actualització dels mapes.

Els mapes es poden actualitzar de forma manual, amb l’editor online iD, o millor amb l’editor JOSM (basat en Java). Tothom pot contribuir-hi, i fins i tot pot ser divertit (i útil).

De totes maneres, el meu interès és la programació de les APIs d’OSM. Concretament la OverpassAPI (orientada a fer cerques), i la Osmapi (API v0.6) que és la que es pot fer servir per editar. Amb les APIs he aconseguit cercar, inserir, actualitzar i editar nodes, com ho tinc documentat a la wiki.

Un cop he adquirit una mica de confiança, ja puc afrontar el repte d’actualitzar amb un script python la llista dels arbres monumentals de Catalunya, catalogats per la Generalitat. Tot això està explicat en la part 2 de l’article.

OpenStreetMaps a rutesgps.joanillo.org

He actualitzat la web de rutesgps.joanillo.org. Ho tenia amb la API de Google Maps i feia temps que no funcionava degut a que la API KEY havia caducat.

A l’assignatura de Javascript, a l’institut, el curs passat ja no vam fer Google Maps, i només la API de OpenStreetMaps (OSM). Els mapes potser no són tan xulos, però son plenament funcionals, i amb el temps anirà millorant gràcies a la col·laboració de la comunitat.

A més, he començat a editar i col·laborar els mapes de OSM, hi ha molta feina per a la comunitat. Aquests dies m’ha vingut per aqui perquè m’he comprat un GPS de ciclisme, el Bryton Rider 450, que m’està donant molt bons resultats. El dissabte passat vam anar a fer una ruta pel massis del Garraf, des de Garraf fins a Begues, i tornada.

Conclusió: adéu Google Maps, endavant OSM!

Experiments d’estiu: model matemàtic de com decau la llum solar quan es fa fosc al capvespre

M’està rondant el cap fer una sèrie d’experiments captant dades amb sensors i processant les dades a l’ordinador. Espero parlar-ne aviat, hi ha bastantes idees xul·les que es poden desenvolupar. Aquí va una petita mostra. I una de les tècniques claus per fer tot això que vull fer és enviar pel protocol sèrie les dades del sensor (arduino) a un programa C++ que s’està executant a l’ordinador.

En la foto es pot veure com es recull les dades del sensor a l’ordinador. Les dades es van gravant en un fitxer, i es poden processar a posteriori. En aquest cas tinc un sensor LDR que capta la llum solar, i es tracta de veure com decau la il·luminació a mida que es fa fosc. Quin comportament tindrà? L’estat inicial és assimptòtic (il·luminació plena), i l’estat final també (foscor). Què passa pel mig? Sabem que a la natura no li agraden els canvis bruscos. Hem d’unir les dues rectes amb una corba. Això ens dóna una corba sigmoide, en la qual hi hauria un punt d’inflexió de canvi màxim en el decreixement de la il·luminació? Serà cert aquest comportament, aquest model matemàtic? Anem a comprovar-ho.

Un cop tenim el fitxer amb les dades, les processarem amb les llibreries científiques numpy i scipy de Python. Com podem veure en el codi, es proposa una línia de màxim ajustament de tipus sigmoide. I efectivament obtenim una bona solució i un bon ajustament com es pot veure en la gràfica. En aquest cas, l’equació obtinguda és:

y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02

No hem de fer massa cas a les dades de l’eix de les X, són tan sols punts. Senzillament tenir en compte que la distància entre punts són 30 segons.

Aquesta és una senzilla i bona demostració d’estiu (un divertimento) de què la natura es descriu amb funcions matemàtiques. Les mates són una bona eina per descriure el comportament de la naturalesa. I que els fenòmens exponencials són inherents a la Física.

Aquest últim any he estat estudiant mètodes numèrics i les llibreries científiques de Python, i realment hi veig un munt de possibilitats, que vull anar explorant aquest curs que començarà d’aquí poc.

# -*- coding: utf-8 -*-
#cel·la LDR que ha gravat com decau la llum al capvespre.
#La funció que s’ajusta a les dades és una sigmoide

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def sigmoid(x, a, b, c, d):
y = c / (1 + np.exp(-b*(x-a))) + d
return y

y = np.loadtxt(‘../dades/LDR_capvespre.txt’)
x = np.linspace(1,len(y),len(y))
#print (x)
#print (len(x))

popt, pcov = curve_fit(sigmoid, x, y, p0=[350, 0.001,1000, 2]) #és necessari ficar uns bons paràmetres inicials

print popt
print (‘y =c * (1 / 1 + exp(-b*(x-a))) +d ‘)
print (‘y =’ + ‘%.2f’%popt[2] + ‘ * (1 / 1 + exp(‘ + ‘%.2f’%popt[1] + ‘*(x-‘ + ‘%.2f’%popt[0] + ‘))) +’ + ‘%.2f’%popt[3] )

plt.figure()
plt.plot(x, y, ‘k’, label=”Original Noised Data”)
plt.plot(x, sigmoid(x, *popt), ‘r-‘, label=”Fitted Curve”)

plt.legend()
plt.show()

# Resultat:
#y =c * (1 / 1 + exp(-b*(x-a))) +d
#y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02

Open Data BCN: World Data Viz Challenge 2018

Participo en l’edició d’enguany del World Data Viz Challenge 2018 Barcelona-Kobe. Entre el catàleg de dades obertes que publica l’Ajuntament de Barcelona, he triat les dades de l’atur en el període 2011-2018. La meva aplicació de visualització la pots veure a http://aturbcn.joanillo.org/. Es presenten les dades desglossades per barris i per districtes, i es pot veure l’evolució de l’atur a través dels anys, o a través dels mesos.

He utiltizat la API de Open Street Map, que és una novetat per mi doncs sempre havia utilitzat l’API de Google Maps. Les dades originals estaven en format xls, i s’han introduït a una base de dades MySQL per tal de poder explotar les dades directament amb SQL.

La idea de participar va venir pel fet que, a l’institut, volem participar en una altra convocatòria: Repte Barcelona Dades Obertes, segona edició 2019 (http://opendata-ajuntament.barcelona.cat/ca/repte-barcelona-dades-obertes). S’ha de veure com, dins de l’assignatura de Javascript (Cicle Formatiu de Desenvolupament d’Aplicacions Web), podem fer alguna visualització per presentar-la a aquesta convocatòria.

Referències:

script cncboxparam: tall làser de caixes de fusta

El novembre passat li vaig regalar a la Maria una caixeta de llum per il·luminar l’habitació [1]. Estic content del resultat, però es pot millorar tant en la part de construcció de la capsa, com en la part de l’electrònica (un timer 555 que fa apagar la llum després de 20 minuts).

Aquí va el script cncboxparam per automatitzar la creació de capses (amb un text a la cara frontal). Genera un fitxer que es pot enviar directament a una màquina de tall làser. La idea que em persegueix de fa temps és fer aquesta mena de capses minimitzant els costos i el temps. Seria una prova de concepte de disseny industrial i fabricació digital, fins a quin punt amb pocs recursos es pot automatitzar fins a fer rendible un petit procés industrial. El curs vinent m’agradaria adquirir una màquina de tall làser, però ja em faig a la idea de què haurà de ser de les màquines xines més petites.

La part de l’electròncia també l’hauria de millorar de cara el curs vinent. La idea és dissenyar una nova placa PCB i utilitzar només components SMD, però això ja és un altre tema.

El script està programat amb C++ i compila sense cap llibreria especial. Per tal de generar el text s’ha de tenir instal.lat la utilitat truetype-tracer-dxf. Les proves les he fet amb LibreCAD, que és el programa de CAD que utilitzo habitualment.

Enllaços:

Projecte CNC: script per a un joc de taula Abalone

Abalone Bord Game and hexagonal gridL’Abalone és un joc de taula dissenyat per Michel Lalet i Laurent Lévi el 1987. És un taulell amb forats on col.loquem 14 caniques per bàndol, i es tracta de fer fora sis caniques del contrincant. De fet, mai hi he jugat, però de moment construirem un taulell.

El problema consisteix bàsicament en fer una xarxa en format rusc d’abelles, que de fet són hexàgons i triangles equilàters. Per disposar els punts sobre un programa de CAD (jo utilitzo LibreCAD), de seguida necessitem el cos(60) i el sin(60). Partint d’una graella ortogonal no és fàcil fer aquesta graella. El millor és crear un script i generar els punts de forma automàtica.

Partim d’un fitxer buit de LibreCAD, creem la capa punts, i fico tres punts de prova. Obrim amb un editor de text (els fitxers de CAD tenen un format de text pla) i localitzem els punts de referència. Ara ja sabem el format que ha de tenir els punts que volem generar programàticament.

Mostrem el tros de codi més representatiu que genera la geometria de la meva graella, script bee_grid.cpp:

...
\tfor (j=0; j
El script genera un fitxer de text amb les línies que podem inserir en el nostre fitxer original, i el resultat el podem veure a la foto. És una graella de punts per al joc de l'Abalone. L'altra foto, la del joc de l'Abalone, no és meva (l'he trobat per Internet), però aquest és el meu objectiu: construir un taulell d'Abalone. Per fer-ho ja tinc el fitxer de CAD, després hauré de generar el G-Code, i finalment fresar tots els punts sobre una fusta. Ja ensenyaré el resultat quan ho hagi acabat.

Enllaços:

update 21/06/2018: aquest és el resultat final. He aprofitat una fusta de cuina, que estava molt marcada, però el resultat final m'agrada.

Curs d’Intel.ligència Artificial CSMM.101x finalitzat

Finalment ja he acabat el curs d’Intel·ligència Artificial. Aquestes últimes hores he fet l’examen final, tipus test. Quant tingui una mica de temps m’agradaria repassar algun concepte i tornar-me a mirar el projecte del Sudoku i els algorismes que allà hem utilitzat. I de cara aquest estiu rellegir el llibre Computational Beauty of Nature, on hi havia algun capítol sobre xarxes neuronals.

M’ha interessat sobretot la part del Machine Learning, i de cara el curs vinent m’agradaria fer algun curs en aquest àmbit. Temps al temps.

Curs d’Intel.ligència Artificial a edx.org

Estic fent el curs ColumbiaX: CSMM.101x d’Intel·ligència Artificial de edx.org. De fet. ja l’estic acabant. Ja estem a la última setmana, i per sort meva, l’últim projecte ja el tinc entregat i m’ha portat menys feina del que em pensava, sense especials contratemps. Ara només em falta fer l’examen final que serà el 23 d’abril, Sant Jordi.

Els projectes que s’han realitzat, tots ells amb Python, són:

  • Projecte 1: Search Algorythms. BFS, DFS,… Es va resoldre el 8-puzzle
  • Projecte 2: Adversarial Search and Games. S’ha resolt el joc del 2048, que de fet jo hi havia jugat bastant. Aquest projecte em va costar bastant, i efectivament vaig arribar a 2048 en una ocasió, combinant diferents heurístiques.
  • Projecte 3: Machine Learning. Hi havia tres problemes diferents: I. Perceptron Learning Algorithm; II. Linear Regression; III. Classification
  • Projecte 4: Constraint Satisfaction Problems. Aquí vam resoldre el joc del sudoku amb els algorismes del AC-3 i del backtracking.
  • Projecte 5: NLP, Natural Language Processing. Un projecte molt interessant. Hi havia un train data de 25000 comentaris de pel·lícules, valorades del 0 al 10. I després també hi havia un test data de 25000 comentaris que s’havien de valorar després d’entrenar el sistema.

El resum de les setmanes ha sigut el següent:

  • Week 1: Introduction to AI
  • Week 2: Intelligent Agents and Uniformed Search
  • Week 3: Heuristic Search
  • Week 4: Adversarial Search and Games
  • Week 5: Machine Learning I
  • Week 6: Machine Learning II
  • Week 7: Machine Learning III
  • Week 8: CSP
  • Week 9: Reinforcement Learning
  • Week 10: Logical Agents
  • Week 11: AI Applications: NLP

Per sort ja s’està acabant perquè m’ha agafat més temps del que tenia i del que volia dedicar-li. Però realment ha sigut interessant i exigent, i m’he hagut de posar les piles amb el Python. Realment el tema de les estructures de dades, i les diferents llibreries que s’han utilitzat amb Python, són molt potents.

Intentaré seguir llegint coses sobre Intel·ligència Artificial (IA) i Machine Learning (ML).

NOTA: encara no tinc acabat el projecte de la màquina de dards, i de fet me n’adono que el problema d’esbrinar on ha tocat el dard i quina puntuació té, a part d’un problema de CV (Computer Vision), també és un problema de ML (Machine Learning).