AR-Drone 1.0 et Android

11 janvier 2012

Enfin ! bon, est-ce un peu tard ? j’ai enfin reçu mon AR-Drone 1.0 !

Un billet jaune m’a incité à passer à la poste ce soir, et là première surprise, un paquet gigantesque (80x60x45), mais comme d’habitude plein d’air. Dedans, un autre carton, le vrai, et l’engin.
Premières impressions: il est énorme ! (53x53cm)

Je branche la batterie et attend la fin du temps de charge (1h30), en regardant les vidéos de parrot.com, et je charge l’application officielle. Ah oui, je n’ai pas d’aphone, mais un Android !

Enfin, je branche la batterie. Je dispose le carton par terre dans mon hall d’entrée, comme base de départ (c’est prévu pour). Je recule et lance l’application. Connexion en cours… mais rien ne se passe. Ah oui, il faut me connecter sur le wifi de l’AR-Drone. Ok, c’est fait, et je redémarre l’application. Je suis devant un écran où je voit la caméra frontale (il y en a deux), et quelques boutons: configuration, camera switch, arrêt d’urgence, et deux cercles, pour monter-descendre, incliner, tourner. Et un dernier, pour décoller. J’appuie dessus.

Les moteurs démarrent, et après 2-3 secondes, l’AR-Drone décolle et se stabilise à 1m. Mais avec les turbulences, il bouge un petit peu, aussi il faut un peu compenser. Mais comment fais-t’on ?
J’essaie: alors à gauche c’est pour monter et descendre d’après la vidéo. Bon c’est pas ça, il faut cliquer à gauche et pencher le téléphone pour déplacer l’AR dans le sens de SA marche (pas facile quand il est à l’envers !). Avec le cercle de droite, je peut tourner sur moi-même et monter-descendre. Bon, pas facile car quand je lui dit de monter, il tourne aussi ;-)

Et je m’approche du mur ! une direction à gauche… mais trop rapide ! alors à droite… et je me stabilise. Bon, retour à la base et atterrissage par le bouton. Je tombe à cheval sur le carton. Pas trop mal pour un premier vol.

J’en ai fait 5, d’environ 2 minutes chacun, et au dernier, j’ai pu décoller, monter en tournant sur moi-même et corrigeant la position, puis ré-atterrir sur le carton.

Avec l’application officielle, pas de vidéo, car Apple l’interdit pour des raisons de licences apparemment, mais pourquoi on ne l’a pas sur Android ? Un petit tour sur le market et je trouve une autre application qui permet d’enregistrer le vol sur la carte SD. Un peu plus difficile à manoeuvrer, mais on y arrive. Malheureusement, après mon vol, je constate que je n’ai qu’une vidéo de quelques secondes, quand l’appareil était arrêté :-(

Conclusions:
Mes premières impressions sont bonnes ! C’est un joli outil pas facile à prendre en main à l’intérieur, certainement influencé par les turbulences contre le mur, les plantes. Cependant, en 10 minutes, j’arrive à le manoeuvrer sans trop de difficulté. L’application officielle ne permet pas d’enregistrer les vidéos mais une autre application officieuse le permet. On a une caméra frontale et une dessous, utile pour se poser.

A suivre…

Un porte-téléphone dans la poche ?

13 novembre 2011

Un ami m’a un jour posé un problème intéressant: est-il possible d’avoir un petit objet toujours dans la poche, qui permettrai de tenir un iphone ou tout autre téléphone presque vertical, de manière à pouvoir, par exemple, regarder des films agréablement ?

Ce problème, je me le suis posé alors et retourné dans tous les sens. J’ai presque eu une solution avec une enveloppe a5 pliée 7-8 fois de suite, dont les bouts s’inséraient les uns dans les autres. Trop fragile.

Hors, qu’est-ce que tout le monde a dans le porte-monnaie, et se débarasse au bout de quelques mois ? une carte de crédit…

Mais comment faire un support stable avec une petite carte de crédit ? Voici quelques images…

On peut découper la carte au ciseau assez facilement par grattage, en prenant une carte dont un côté est plastifié et en prenant soin de ne pas casser le film plastique, qui assurera la cohésion de la carte lors de sa rotation.

Le poids du téléphone est étonnement bien absorbé par la stabilité de la carte !

Plugin Gimp

18 juillet 2011

Pour les besoins d’un jeu, je dois transformer un SVG en un fichier PNG. Je le fais avec Gimp, mais le processus est long, car il se compose d’une vingtaine d’étapes qui peuvent être automatisées.

J’ai tenté de les automatiser avec un plugin Gimp, et ça marche plutôt bien. Tout d’abord, je me suis penché sur scriptfu, une extension de Gimp basée sur Scheme, lui-même basé sur Lisp. C’est un language plein de parenthèses difficile à apréhender. J’ai très vite passé à son alternative python: python-fu.

Ensuite, j’ai tatonné durant quelques heures, mais enfin mon compilateur de niveau est prêt, et voici quelques astuces que j’ai trouvées pour développer un plugin gimp. J’espère qu’elles vous seront utiles.

Tout d’abord, il faut créer un plugin Gimp: Dans ~/.gimp-2.6/plug-ins, on créé un fichier .py, contenant:

#!/usr/bin/env python
# -*- encoding:UTF-8 -*-
from gimpfu import *
def myblur(fin, fout):
 image = pdb.gimp_file_load(fin, fin)
 layer = pdb.gimp_image_get_active_layer(image)
 pdb.plug_in_gauss(image, layer, 4, 4, 0)
 pdb.gimp_file_save(image, layer, fout, fout)
 pdb.gimp_image_delete(image)


 register(
 "myblur",
 "myblur: Simple blur test",
 "myblur: Simple blur test",
 "Cédric Dutoit",
 "Cédric Dutoit Company",
 "2011-2011",
 "/Filters/MyFilters/_TestFilter1...",
 "RGB*",
 [
 (PF_STRING, "fin", "fin", "*.png"),
 (PF_STRING, "fout", "fout", "*.png"),
 ],
 [],
 myblur)

main()

Ce petit plug-in s’enregistre dans le menu des filtres Gimp, mais peut aussi être appelé en mode batch, soit sans interface graphique:

gimp --no-interface --batch '(python-fu-myblur RUN-NONINTERACTIVE 0 0 "'$1'")' --batch '(gimp-quit 1)'

Notez que le python-fu-myblur indique:
1) d’utiliser python-fu comme interpreteur
2) d’appeler le plug-in myblur (premier paramètre de register)

Attention: Si votre nom de plugin comprend des underscores, ils se transforment en tirait: my_method -> python-fu-my-method.

Les méthodes appelables sont visualisables dans gimp: help/procedure browser.

Voilà. Sinon pour tester la compilation, et donc inclure gimpfu, on peut utiliser cette astuce:

import sys
sys.path.append("/usr/lib/gimp/2.0/python/")

Mais le pdb demande que le script python soit exécuté en mode batch gimp. Seul le gimpfu.gimp semble échapper à cette règle, mais ses fonctions sont limitées…

Pour aller plus loin:

 

 

Analyse et amélioration du sommeil

22 juin 2011

Depuis quelque temps, j’ai l’impression d’être toujours plus fatigué, aussi je m’intéresse à améliorer mon sommeil. Pour celà, j’ai acquis une montre sleeptracker, qui enregistre tout mouvement durant la nuit: la montre indique ensuite au réveil quand on s’est réveillé et la durée moyenne entre deux mouvements. Idéalement, la durée moyenne doit être supérieure à 45 minutes, seulement voilà, chez moi, elle est de 18-25 minutes. Est-ce possible de bouger autant durant la nuit ? une seule solution, mettre un témoin, ou… une caméra.

Mais comment faire pour filmer une nuit sans avoir de caméra infrarouge ? mais… est-ce qu’une webcam pourrait filmer dans l’infrarouge ? les forums d’astrophotographie affirment que oui !

J’ai une webcam Quickcam Pro 2000 de Logitech. Celle-ci a bien vécu et je peut tenter une modification de la webcam. Après m’être renseigné sur les forums, je me lance… (je n’ai pas trouvé sur les forums d’informations de réussite avec cette webcam)

J’ouvre la webcam. Un peu dur, il y a une petite vis sur le côté. Puis je trouve un circuit imprimé, un optique, une loupe avant le capture et… une plaque de verre légèrement rouge: j’ai trouvé !

D’après les forums, beaucoup de webcams peuvent filmer dans l’infrarouge, mais sont limitées par un filtre infrarouge. On peut supprimer celui-ci pour une utilisation spécifique. Il s’agit généralement d’une plaque transparente mise devant le capteur. Pour ma webcam, c’est une sorte de petite vitre légèrement rouge de 5mm de côté. Je l’enlève, puis remonte précautioneusement la webcam, non sans mal (j’ai les doigts trop gros).

J’essaie: la webcam fonctionne dans le visible. J’éteint la lumière, elle fonctionne toujours, mais moins bien. Je prend une télécommande infrarouge et surprise: je vois sur le mur, dans la nuit, un point lumineux… infrarouge. ça a marché !

J’installe donc la webcam, scotchée sur l’armoire, mais il reste à capturer la webcam. Pour ceci, j’utilise un portable Linux et streamer. Et pour le faire durant toute la nuit, je me fais un petit programme Python:

import os, time
dev="/dev/video1"

def capture():
    ts=time.strftime("%Y%m%d%H%M%S")
    os.system("streamer -s 640x480 -c %s -o webcam-%s.ppm"%(dev, ts))

nbExceptions = 0
while nbExceptions < 100:
    try:
        capture()
        time.sleep(10)
    except exception, e:
        print time.strftime("%Y%m%d%H%M%S"), " exception ", e
        nbExceptions+=1

 

J’ai eu quelques problèmes de timeout lors de l’accès à la webcam, et après avoir fouillé 45 minutes, j’ai trouvé la solution: « sudo rmmod pwc »

Ok, ce petit script enregistre une photo toutes les 10 secondes et stocke l’heure dans le nom du fichier.
Maintenant, ce serait cool de faire une vidéo ! Je refais un script python, appelant ImageMagick:

import glob, os

filenames = glob.glob("*.ppm")
filenames.sort()
for filename in filenames:
    os.system("ppmtojpeg %s > tmp0.jpg" % (filename))
    os.system("convert -despeckle tmp0.jpg tmp1.jpg")
    os.system("convert -adaptive-blur 2 tmp1.jpg tmp2.jpg")
    adata = filename[filename.find("20"): filename.rfind(".")]
    year = adata[:4]
    month = adata[4:6]
    day = adata[6:8]
    hour = adata[8:10]
    amin = adata[10:12]
    sec = adata[12:14]
    sdate = "%s.%s.%s %s:%s:%s" % (day, month, year, hour, amin, sec)
    os.system("convert tmp2.jpg  -pointsize 16 -fill white -annotate +10+10  \"%s\" converted_%s.jpg" % (sdate, filename))

os.system("mencoder \"mf://*.jpg\" -mf fps=12 -o out.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800")
os.system("rm converted_*jpg")
print "Created out.avi"

Ce petit script convertit les ppm en jpeg (streamer ne peut pas créer de jpeg ??), puis effectue 2 filtres, despeckle et blur adaptatif, puis lit l’heure et la date dans le nom du fichier et l’incruste en haut à gauche de l’image. J’ai alors plein d’images jpeg, que j’assemble en vidéo avec mencoder…

cqfd (ce qu’il fallait développer). Ok, c’est un peu brut: on peut merger les convert, faire un pipe du streamer sur convert pour sortir la jpeg directement, etc… mais ça marche !

Enfin, j’essaie tout ceci. J’utilise une led infrarouge de viseur nocture pour pointer le lit, je vérifie ma webcam et… je teste. Enfin, je vais dormir, quoi (la meilleur partie ;-) .

Et le matin, je processe ma vidéo, et ça marche ;-)

La vidéo confirme ce que dit la montre: je bouge toutes les 15 minutes en moyenne, moins en début de nuit. Je dois donc travailler ma relaxation pour passer de meilleure nuit… sans somniphère ni médecin coûteux !

Conclusion: on peut facilement modifier une webcam pour voir l’infrarouge et faire une vidéo timelapse d’une nuit. N’espérez pas épier vos voisins de nuit, la qualité est vraiment basique. Mais pour voir qui tire la couette la nuit, c’est génial ;-)

Grottes de Vallorbe – la Cathédrale

12 juin 2011

La salle est noire, un petit bouton vert clignote. Je m’avance, puis revient à ma place. Un son grandit, semblant venir de loin, puis une musique envahit la caverne. La réverberation m’indique que je suis dans un grand espace, une cathédrale.
Une lumière s’allume, et je vois une forme, un pilier éclairé par l’arrière. La couleur est rouge, légérement orangé. J’entend l’eau. Puis une goutte tombe, et arrive sur ce monticule. De l’eau jaillit, chassée par la goutte d’eau tombante, rejettant plus de petites goutes d’eau de tous les côtés. Avec l’éclairage par l’arrière, c’est magnifique… le dormeur doit se réveiller…
Puis une autre lumière s’allume, et encore une autre, et j’observe un espace chaque fois plus grand tandis que résonne la musique qui s’offre aux visiteurs de ce lieu. Le spectacle continue, des lumières s’éteignent et d’autres s’allument.
On voit des draperies, puis plus haut, des fistuleuses, dans un jeu et lumière intriguant, progressif, bien conçu.
Les fistuleuses s’éteignent, et on voit le plafond, d’un curieux vert, et les parois, rouge-orange.
Puis on voit le fond de la caverne, nous révélant enfin le fond de cette cathédrale… mais quel fond ? on ne vois pas le bout !
Progressivement, tout s’éteint, puis se rallume à nouveau le pilier, et on voit l’eau qui goutte, puis s’éclate en d’autres gouttes,
tandis qu’à l’arrière plan, un manequin spéléologue est éclairé, très loin, et, progressivement, la salle s’éteint, et on ne voit bientôt plus que ce petit bouton vert qui clignote.

Etais-ce un rêve ?
en tous les cas, merci à la société des grottes de Vallorbe et ses collaborateurs pour nous avoir dévoilé la cathédrale en ce magnifique jeu et lumière, et je recommande à tous de faire l’expérience et d’aller visiter les grottes !

PS:
Un bémol cependant. Les photos sont interdites. Dommage, mais on comprend pourquoi:
L’oeil met 20 minutes à s’adapter à l’obscurité, et une seconde à la lumière. Un simple flash
peut alors casser les 20 minutes de préparation. Lors de la visite de la cathédrale,
nous avons été très géné par des personnes peu scrupuleuses qui prenaient plein de photos
avec les flashs, et malheureusement, nous avons regardé… et là, il ne restait plus qu’à ressortir,
aveuglés par le flash…
De la même manière, le jeu et lumière de la cathédrale est gâché par des personnes avec
des lampes de poche…
Enfin, il serait appréciable d’interdire les flashs, mais surtout pas les photos !

Google Speed Tracer

1 juin 2011

Google Speed Tracer est une extension Google Chrome, qui permet de tracer le chargement des compostants de la page web: ressources, flux de données, mais également temps de chargement dom, de refresh écran, d’ajax, etc…
C’est un outil indispensable lors de la création d’un site web optimal, et c’est ici:

http://code.google.com/webtoolkit/speedtracer/get-started.html#downloading

Intersection de deux segments de ligne

23 mai 2011

Comment faire pour trouver le point d’intersection de deux segments de lignes ? Après avoir cherché sur internet pendant longtemps, voici ma solution:

public static PrecisionPoint findIntersection(PrecisionPoint p1, PrecisionPoint p2,
                                                           PrecisionPoint p3, PrecisionPoint p4) {
		double ua = ((p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x)) / //
					((p4.y-p3.y)*(p2.x-p1.x) - (p4.x-p3.x)*(p2.y-p1.y));
		double ub = ((p2.x-p1.x)*(p1.y-p3.y) - (p2.y-p1.y)*(p1.x-p3.x)) / //
				    ((p4.y-p3.y)*(p2.x-p1.x) - (p4.x-p3.x)*(p2.y-p1.y));
		if (ua1 || ub1) {
			return null;
		}
		double x = p1.x + ua * (p2.x - p1.x);
		double y = p1.y + ub * (p2.y-p1.y);
		return new PrecisionPoint(x, y);
	}

Ce code Java est utile pour détecter le point d’intersection de deux segments de lignes. si ua et ub sont entre 0 et 1, l’intersection se produit sur le segment, sinon il se produit sur la ligne mais hors segment…