mercredi 19 juin 2013

Aujourd'hui j'ai essayé de corriger un bug dans l'interprétation de l'orientation envoyée par le téléphone.

Voici quelques captures d'écran de l'état des programmes développés.
D'abord le programme principal permettant de connaitre la position du cerf-volant. Pour le développement j'ai réutilisé la vidéo réalisée par High Zenith Power. A terme la vidéo sera envoyée à partir de la webcam d'un téléphone portable. La détection du cerf-volant se base sur la couleur, il est donc important qu'il y ait un bon contraste avec la couleur du ciel ou du paysage si le cerf-volant descend bas. Cela me permet d'obtenir le contour du cerf-volant (en bleu) et une position relative à la caméra, ainsi que l'inclinaison du cerf-volant en faisant la recherche du rectangle le plus petit (rouge) encadrant la forme.
Le rectangle vert correspond à la zone dans laquelle est réellement faite la recherche (en se basant sur la position précédente). Cela permet d'augmenter la fluidité du traitement. Le code utilise simpleCV et n''est pour l'instant pas optimisé. Un optimisation est nécessaire si l'on veut pouvoir contrôler des petits cerf-volants car la latence est de 0.5 à 1s actuellement.
La ligne rouge correspond à l'horizontale (évidemment cela ne correspond pas sur l'image, la vidéo étant un enregistrement et non un live).
Cette ligne rouge est obtenue à partir des informations d'orientation du téléphone (également envoyées en wifi). 
Le 330 correspond ainsi au gisement du cerf-volant.
Le couplage permet d'obtenir une position absolue du cerf-volant au lieu d'une position relative à la caméra. On entre dans le domaine de la réalité augmentée. Voir le code
La photo suivante est un essai de projection de la vidéo de la caméra sur un plan plus grand. En effet, il n'est pas possible de voir toute la fenêtre de vol avec la caméra. Du coup je fais une projection de la fenêtre de vol et je colle dessus l'image correspondant à une partie de la fenêtre de vol.
 

Pour finir pour aujourd'hui, un lien vers n projet étudiant intéressant que je n'avais pas encore vu :

http://www.youtube.com/watch?NR=1&feature=endscreen&v=demmPybYf2I
Ce qui est marrant c'est que les termes de recherche entrés dans Google il y a quelques mois ne donnent pas les mêmes résultats aujourd'hui.

mardi 18 juin 2013

News!!!

Voici plus de deux mois que je n'ai pas posté d'information sur ce blog...
Pourtant le projet n'est pas mort, mais j'ai pris des vacances, entrecoupées de quelques sessions de travail (pourquoi ne pas lier l'utile à l'agréable?).
Je suis maintenant posé pour 15 jours à Bracuhy (Brésil), où je devrais disposer de temps, d'outils et d'une connexion internet pour faire avancer le projet.

Je suis donc parti le 14 avril pour une traversée de l'Atlantique en voilier.
Avant cela, il y a eu quelques préparatifs qui ont fait que la publication d'information sur ce blog n'était plus la priorité.

Voici donc un résumé des avancées liées au projet.

VISION PAR ORDINATEUR
  • prise en main de simpleCV (notamment lors des quarts nocturnes de veille)
  • développement d'un algorithme de détection du cerf-volant à partir d'un flux vidéo et calcul des position et orientation relatives associées
  • développement du traitement des informations d'attitude d'un téléphone android sur un pc distant
    L'application sensorUDP
  • fusion de ces informations pour obtenir une position "absolue" du mobile

MOTORISATION
N'ayant pas pris le moteur et la batterie que j'utilisais en France (et oui c'est lourd dans un sac à dos), j'ai de nouveau eu à choisir un moteur et l'alimentation associée.
Après quelques recherches auprès de moteurs électriques que l'on trouve sur les automobiles (lève-vitre, essuie-glace, direction assistée, etc), mon choix s'est de nouveau porté sur la récupération d'une vielle visseuse/dé-visseuse/perceuse sans fil (pour l'anecdote, j'en ai même acheté une nouvelle, mais heureusement j'en ai trouvé des vielles avant de la démonter...).
Les principales difficultés dans le choix viennent du fait que les données techniques des moteurs sont difficiles à avoir. On arrive en général seulement à avoir le voltage. Il faut souvent démonter le matériel pour obtenir la référence du moteur. Et cela n'est parfois pas suffisant.
Il a donc fallu que je mette en place un banc de test.
Pour cela, j'utilise une bonbonne d'eau de 5 litres (qui à l'avantage d'avoir une poignée) que je remplis avec la quantité d'eau correspondant à la charge demandée. J'utilise une bobine de bout dans laquelle j'ai calé un bouchon de liège dans lequel j'enfonce un outil allant sur la visseuse.
En gros, cela m'a permis de voir que je peux espérer tirer une centaine de watt d'un moteur de visseuse. Malheureusement, pour l'instant je n'atteins qu'une trentaine de watt à cause d'une limitation en intensité au niveau du circuit de puissance. Il peut s'agir du mécanisme de limitation du courant ou du mécanisme de limitation de la température

SIMULATION
J'ai développé un simulateur de cerf-volant 2D au feeling.
Il s'agit d'un modèle cinématique qui ne repose pas vraiment sur les équations de la physique.
J'ai fait une simple interface avec juste un rectangle blanc sur fond noir avec contrôle grâce à la souris

Le petit rectangle blanc représente le cerf-volant dans le simulateur 2D


PILOTAGE
Le simulateur m'a permis de développer un algorithme très simple de pilotage.
Il n'utilise que l'information d'orientation du cerf-volant.
Il s'agit donc à la base d'une sorte de garde-cap.
Si le cerf-volant est horizontal, il va aller vers le haut.
En modifiant son inclinaison il va aller sur le côté de la fenêtre, ce qui permet d'orienter la traction (relativement à la direction du vent)
Je fais ensuite varier l'inclinaison du cerf-volant de manière sinusoïdale, ce qui permet de faire des 8 autour d'une position d'équilibre et ainsi d'augmenter le vent apparent et de faire descendre le cerf-volant dans la fenêtre pour avoir plus de puissance


mercredi 3 avril 2013

simpleCV

Ce soir j'ai découvert simpleCV ici au hasard de mes recherches
SimpleCV est une surcouche python d'openCV, qui facilite grandement les développements. Je ne l'ai pas encore vraiment essayé, mais vu la simplicité des exemples, je pense que l'essayer c'est l'adopter.

USB On The Go

Je croyais jusqu'à présent qu'un périphérique USB ne pouvait être que périphérique sur un fonctionnement maître-esclave.

Et bien je viens de découvrir que depuis 2 ou 3 ans certains périphériques (notamment les tablettes tactiles et maintenant les téléphones) permettent le fonctionnement en esclave ou en maitre.
Cela s'appelle USB On The Go (OTG).

Et bonne nouvelle mon téléphone (xperia mini) semble être un des premiers à avoir bénéficié de cette amélioration (qui est rendue possible par des modifications matérielles et pas seulement logicielles).

Cela m'ouvre donc la porte à la connexion de périphériques directement sur le téléphone.

En fait initialement, pensant que cela n'était pas possible, j'avais derrière la tête d'utiliser la prise jack pour interfacer la plaque arduino directement avec le téléphone. Et c'est en trouvant quelqu'un qui l'avait déjà fait que j'ai vu que cette solution était dépassée, car ceci est possible bien plus simplement avec l'USB.

http://code.google.com/p/usb-serial-for-android/


OpenCV+ Python + Wecam (2)

Aujourd'hui j'ai continué à me plonger dans le programme de traitement d'image.

J'ai rajouté un enregistrement de l'image, ainsi que la possibilité de sauvegardé un cliché avec la date et l'heure en pressant une touche du clavier.

J'essaie de réutiliser la démo camshift mais en l'améliorant pour que l'histogramme soit initialisé :
- sur une image (fixe et prédéfini) et une zone d'image sélectionné
- ou à défaut sur une zone en mouvement

Et le résultat est affreux : je me suis filmé pendant 5 minutes sans y faire attention, et bien ça vaut son pesant de cacahouète.

Voici le code

lundi 1 avril 2013

OpenCV + Python + IP Webcam !!

Cela faisait quelques temps que j'essayais d'obtenir la vidéo de la caméra de mon téléphone mobile dans openCV afin de pouvoir faire du traitement logiciel de la vidéo.
Ca y est j'ai enfin trouvé !
Mon problème était en fait très simple...

Voici le code fonctionnant:

import cv2

cv2.namedWindow("preview")
vc = cv2.VideoCapture("http://192.168.1.2:8080/videofeed?something.mjpeg")

if vc.isOpened(): # try to get the first frame
    rval, frame = vc.read()
else:
    rval = False

while rval:
    cv2.imshow("preview", frame)
    rval, frame = vc.read()
    key = cv2.waitKey(20)
    if key == 27: # exit on ESC
        break

Il suffisait de rajouter ?something.mjpeg à la fin de l'url car sinon opencv ne trouve pas le format (solution venant de http://code.opencv.org/issues/2474 )!

J'arrive donc maintenant à modifier l'image de ma webcam sur mon pc.
Démo d'une vidéo prise avec la caméra du téléphone et visualisé sur le PC dans une fenêtre créée par openCV
L'application IP Webcam sur android

Réinstallation openCV

Aujoud'hui je voulais laisser tomber Morse (pas encore suffisamment au point à mon goût) pour revenir sur Gazebo.

Ca m'énervait un peu qu'openCV soit installé dans un répertoire spécifique à ROS, notamment car je voulais pouvoir l'utiliser sans ROS, avec des chemins "standards".

J'ai donc tenté une réinstallation, mais j'ai mal suivi et j'ai tout recompillé. J'ai également effacé plein de dépendances dans ROS...
http://karytech.blogspot.fr/2012/05/opencv-24-on-ubuntu-1204.html

Un de mes objectifs était de réussir à lire un flux vidéo. On peut par exemple en créer un avec vlc avec la commande suivante :
vlc -vvv "/media/bat/DATA/videos/movie.avi" --sout
 '#standard{access=http,mux=ogg,dst=localhost:8080}'

J'arrive  lire le flux avec vlc (ou à le visualiser dans firefox) :

vlc http://localhost:8080

Lorsque j'essaie de lire le flux avec python et opencv, j'obtiens
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
Et ensuite rien.

J'ai finalement repris le tutoriel suivant (plus complet que le précédent) plus à jour pour l'installation d'opencv. J'ai eu quelques difficultés car je ne lis pas tout et il y avait des précautions pour les systèmes 64bits...
http://www.ozbotz.org/opencv-installation-2-3-1/

Mais j'ai eu pas mal d'ennui à cause d'un changement d'interface de ffmpeg (j'ai voulu prendre la dernière version).
Cela m'a donné l'occasion de mieux jouer avec git.
J'ai trouvé une url avec la correction (il y a 11 jours seulement), donc pas encore dans les versions stables.
J'ai du changé l'origine :
git remote set-url origin new_url
Ensuite, j'ai du également changer de branche (la correction était dans une branche).

git branch -r
git checkout branch_name

Et au final ça ne marchait pas mieux...