<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tchampag</id>
		<title>Wiki de Projets IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tchampag"/>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Tchampag"/>
		<updated>2026-05-15T08:18:11Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9652</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9652"/>
				<updated>2014-02-23T15:52:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Objectifs Futurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre propre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer venait d'être développé (decembre 2013) mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
Server : OpenVibe : TCP Writer &lt;br /&gt;
&lt;br /&gt;
Client : NetCat : nc localhost 5678&lt;br /&gt;
&lt;br /&gt;
Sniffeur de Tram : WireShark&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le client reçoit 8 paquets dont 4 octets de données. Ce qui correspondrait donc aux 8 variables annoncées. Nous avons fais une étude détaillé pour nous en assurer.&lt;br /&gt;
&lt;br /&gt;
Format et découpage des octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  4  Octets de Données&lt;br /&gt;
&lt;br /&gt;
1er Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 08 40 00 40 06  e1 b5 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 e9 09 34&lt;br /&gt;
  a6 c9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Numéro de version : 1, semble correspondre au numéro de version du bloc TCP Writer plus qu'à la version d'OpenVibe&lt;br /&gt;
&lt;br /&gt;
2em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 09 40 00 40 06  e1 b4 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 e9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Endianness : Little Endian&lt;br /&gt;
&lt;br /&gt;
3em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0a 40 00 40 06  e1 b3 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00&lt;br /&gt;
Fréquence d'échantillonnage : 0 Cette valeur n'est valide que dans le cas de la transmission d'un signal ce qui n'est pas le cas ici&lt;br /&gt;
&lt;br /&gt;
4em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0b 40 00 40 06  e1 b2 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd cd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 01 00 00 00&lt;br /&gt;
Nombre de Lignes. En considérant seulement le premier octet on obtient effectivement la valeur attendue 1 mais nous ne comprenons pas pourquoi elle serait à cet endroit.&lt;br /&gt;
&lt;br /&gt;
5em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0c 40 00 40 06  e1 b1 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Nombre de Colonnes = 1&lt;br /&gt;
&lt;br /&gt;
6em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0d 40 00 40 06  e1 b0 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00 &lt;br /&gt;
Variable de rembourrage 1&lt;br /&gt;
&lt;br /&gt;
7em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0e 40 00 40 06  e1 af 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 2&lt;br /&gt;
&lt;br /&gt;
8em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0f 40 00 40 06  e1 ae 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd dd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 3&lt;br /&gt;
&lt;br /&gt;
Ensuite La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 3c 7a 2f 40 00 40 06  c2 8a 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e 94 10 05 7b  a6 c7 6f c2 f5 62 80 18&lt;br /&gt;
  08 00 fe 30 00 00 01 01  08 0a 08 09 f7 58 08 09&lt;br /&gt;
  f7 43&amp;lt;/span&amp;gt; 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
Interprétation&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Adresses : Les deux programmes étant en local ses octets sont laissés à 0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; Type : 0x0800 ==&amp;gt; IP&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;IPv4 : 4 pour IPv4 par defaut&lt;br /&gt;
  Header Length : 5 : 5 x 32 bits&lt;br /&gt;
  Length : 00 3c = 60 Correspondant bien aux 74 octets totaux moins les paquets Ethernet&lt;br /&gt;
  Identification : 7a 2f valeur dépendante du message et incrémentée chaque fois&lt;br /&gt;
  Flags : 04 00 pour ne pas fragmenter&lt;br /&gt;
  Time To Live : 40 = 64 Ce qui est largement suffisant étant donné que tnous travaillons en local&lt;br /&gt;
  Protocol : 06 TCP&lt;br /&gt;
  CheckSum : c2 8a Correct&lt;br /&gt;
  Adresse Source : 7f 00 00 01 Correspond à l'adresse localhost&lt;br /&gt;
  Adresse Destination : 7f 00 00 01 Idem&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;Port Source : 16 2e = 5678 Est le port configuré dans le bloc TCP Writer d'OpenVibe&lt;br /&gt;
  Port Destination : 94 10 = 37904&lt;br /&gt;
  Sequence Number : 05 7b  a6 c7&lt;br /&gt;
  Acknowledgment : 6f c2 f5 62 &lt;br /&gt;
  Longueur de l'en-tete : 80 = 32 Octets que nous sommes en train de détailler&lt;br /&gt;
  Flags : 18 = Acknowledgment et Push activés&lt;br /&gt;
  Window Size Value 08 00 = 2048 Octets seront envoyés sans attendre de confirmation d'un éventuel client&lt;br /&gt;
  CheckSum : fe 30 : La validation étant désactivé d'après WireShark&lt;br /&gt;
  00 00&lt;br /&gt;
  Options 01 01 : Ne fait Rien&lt;br /&gt;
  Kind : 08 TimeStamp(8)&lt;br /&gt;
  Length : 0a = 10 Octets concernant les variables de temps&lt;br /&gt;
  Heure d'envoie celon l'émeteur : 08 09 f7 58&lt;br /&gt;
  Timestamp Echo Replay :08 09 f7 43 &amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données : 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
L'heure d'envoie de l'émeteur : 08 09 f7 58 que nous avons observer conrespondrait à la date du 11/4/1974 à 1:07:52. Nous avons donc déduis que le server n'enverrait donc pas les données de la manière dont WireShark les interprète... Mais nous n'avons pas plus d'information sur les envois de données que celle rappelées plus haut. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé d'écrire un script implémentant soit une communication TCP ou UDP dans le cas d'une future amélioration, tout en restant simple. La communication TCP étant celle que nous visons à utiliser actuellement, et la communication UDP étant celle des VRPN :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Projet BCI Lagis Lille&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# TCP client&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;socket&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;sys&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Here enter mode TCP or VRPN &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#depending on how you send data from OpenVibe&amp;lt;/span&amp;gt;&lt;br /&gt;
 MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 HOST &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;localhost&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 BUFFER_SIZE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Port are here defined as defaults openvibe values&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color:#fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket TCP (SOCK_STREAM for TCP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;5678&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_STREAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket UDP (SOCK_DGRAM for UDP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;VRPN&amp;amp;quot;&amp;lt;/span&amp;gt;)&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;3883&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_DGRAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;try&amp;lt;/span&amp;gt;:&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Connect to server&amp;lt;/span&amp;gt;&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;connect((HOST, PORT))&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;bind((HOST, PORT))&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Receive data from the server and shut down&amp;lt;/span&amp;gt;&lt;br /&gt;
   ov_msg &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;recv(BUFFER_SIZE)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;finally&amp;lt;/span&amp;gt;:&lt;br /&gt;
   sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;close()&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;Data :&amp;amp;quot;&amp;lt;/span&amp;gt;, ov_msg)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La communication TCP étant fonctionnelle, nous avons analysé les échanges OpenVibe&amp;lt;-&amp;gt;Blender avec WireShark. Le script client étant exécuté periodiquement dans blender (au rythme des image de l'animation) on observe un taux de réussite d’échange de donnée supérieur à 85%. Les échecs étant probablement dus aux accès concurrents entre le serveur et le client. Ces erreurs n'engendrerai donc pas de défaut de fonctionnement du système global. Tout au plus, on observerai un retard d'une ou deux images entre le moment où la donnée est recue et le moment ou l'animation est modifié. Mais étant donnée la conception du serveur (TCP Writer), l'en-tête est renvoyé à chaque fois qu'un échange a échoué. Autrement dit, il est nécessaire d'échangé au moins 9 paquets consécutivement sans erreurs pour pouvoir avoir enfin une donnée exploitable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI WireShark TCP OVtoB.png]]&lt;br /&gt;
&lt;br /&gt;
'''Conversion de donnée OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les données d'OpenVibe sont formatés en EBML (Extensible Binary Meta Language) historiquement un formatage pour fichiers multimédia propriétaire de Matroska. Pour les rendre exploitable dans blender nous avons trouver un parser EBML to Python.&lt;br /&gt;
&lt;br /&gt;
Sources : http://sjohannes.wordpress.com/2010/04/28/matroska-tagging-support/ &lt;br /&gt;
&lt;br /&gt;
Code Python : http://bazaar.launchpad.net/~exaile-devel/exaile/exaile-0.3.x/view/head:/xl/metadata/_matroska.py&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque a été développé dans un besoin de convertir des fichiers multimédia en python. Comme notre projet est très différent nous avons étudié ce code pour voir si effectivement il pourrait répondre à nos besoins.&lt;br /&gt;
Nous avons donc utilisé le Bloc EBML Spy d'OpenVibe pour observer les données, connues, provenant du classifier du scenario &amp;quot;Handball-replay&amp;quot;. La donnée utile pour nous étant un nombre réel compris entre -10 et +10 et indiquant si le sujet présentait des mouvement de la main droite ou de la main gauche.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI EBML Stream Champeiro.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
Dans le code source du parser, on trouve des lignes 292 à 376 les tags qui sont actuellement convertis. Malheureusement, aucun des tags openvibe n'est pris en compte par ce parser. Nous avons donc envisagé d'adapter ce parser à nos besoin quitte à le reconstruire presque entièrement.&lt;br /&gt;
&lt;br /&gt;
'''Client VRPN'''&lt;br /&gt;
&lt;br /&gt;
La communication TCP s'avérant infructueuse nous avons envisagé de développé plutot un client VRPN en python pour Blender. Pour se faire nous avons utilisé la bibliothèque VRPN version 7.30 ainsi qu'un parser de langages objet : SWIG version 2.0.12&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_piano_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_roll1_Champeiro.png]]  [[Fichier:BCI_roll2_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
''Vue du modèle de la main au repos et pendant le pianotement''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectifs Futurs ==&lt;br /&gt;
&lt;br /&gt;
Nous avons créé une ébauche de deuxième scène, avec un mouvement de main différent (fermeture et ouverture de la main), où le but est de fermer la main sur une pompe pour gonfler un ballon qui y est connecté. A l'heure actuelle, cette scène n'est esthétiquement pas terminée, mais est utilisable.&lt;br /&gt;
&lt;br /&gt;
Avec une expérience plus avancée de Blender, il serait aussi possible d'utiliser la gestion des collisions pour que le mouvement de la main agisse visuellement directement sur les objets, comme les touches du piano ou la pompe. Cela augmenterait le réalisme du feedback. Nous ne sommes toutefois pas encore en mesure de réaliser cela.&lt;br /&gt;
&lt;br /&gt;
Le but final serait de pouvoir créer une scène par mouvement possible de main ; il y a déjà une scène pour le pianotement, la fermeture de la main, et on pourrait imaginer une scène pour un mouvement de grattement, ou un mouvement de balancier de la main.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9651</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9651"/>
				<updated>2014-02-23T14:35:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Réalisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre propre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer venait d'être développé (decembre 2013) mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
Server : OpenVibe : TCP Writer &lt;br /&gt;
&lt;br /&gt;
Client : NetCat : nc localhost 5678&lt;br /&gt;
&lt;br /&gt;
Sniffeur de Tram : WireShark&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le client reçoit 8 paquets dont 4 octets de données. Ce qui correspondrait donc aux 8 variables annoncées. Nous avons fais une étude détaillé pour nous en assurer.&lt;br /&gt;
&lt;br /&gt;
Format et découpage des octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  4  Octets de Données&lt;br /&gt;
&lt;br /&gt;
1er Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 08 40 00 40 06  e1 b5 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 e9 09 34&lt;br /&gt;
  a6 c9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Numéro de version : 1, semble correspondre au numéro de version du bloc TCP Writer plus qu'à la version d'OpenVibe&lt;br /&gt;
&lt;br /&gt;
2em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 09 40 00 40 06  e1 b4 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 e9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Endianness : Little Endian&lt;br /&gt;
&lt;br /&gt;
3em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0a 40 00 40 06  e1 b3 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00&lt;br /&gt;
Fréquence d'échantillonnage : 0 Cette valeur n'est valide que dans le cas de la transmission d'un signal ce qui n'est pas le cas ici&lt;br /&gt;
&lt;br /&gt;
4em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0b 40 00 40 06  e1 b2 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd cd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 01 00 00 00&lt;br /&gt;
Nombre de Lignes. En considérant seulement le premier octet on obtient effectivement la valeur attendue 1 mais nous ne comprenons pas pourquoi elle serait à cet endroit.&lt;br /&gt;
&lt;br /&gt;
5em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0c 40 00 40 06  e1 b1 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Nombre de Colonnes = 1&lt;br /&gt;
&lt;br /&gt;
6em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0d 40 00 40 06  e1 b0 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00 &lt;br /&gt;
Variable de rembourrage 1&lt;br /&gt;
&lt;br /&gt;
7em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0e 40 00 40 06  e1 af 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 2&lt;br /&gt;
&lt;br /&gt;
8em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0f 40 00 40 06  e1 ae 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd dd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 3&lt;br /&gt;
&lt;br /&gt;
Ensuite La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 3c 7a 2f 40 00 40 06  c2 8a 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e 94 10 05 7b  a6 c7 6f c2 f5 62 80 18&lt;br /&gt;
  08 00 fe 30 00 00 01 01  08 0a 08 09 f7 58 08 09&lt;br /&gt;
  f7 43&amp;lt;/span&amp;gt; 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
Interprétation&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Adresses : Les deux programmes étant en local ses octets sont laissés à 0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; Type : 0x0800 ==&amp;gt; IP&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;IPv4 : 4 pour IPv4 par defaut&lt;br /&gt;
  Header Length : 5 : 5 x 32 bits&lt;br /&gt;
  Length : 00 3c = 60 Correspondant bien aux 74 octets totaux moins les paquets Ethernet&lt;br /&gt;
  Identification : 7a 2f valeur dépendante du message et incrémentée chaque fois&lt;br /&gt;
  Flags : 04 00 pour ne pas fragmenter&lt;br /&gt;
  Time To Live : 40 = 64 Ce qui est largement suffisant étant donné que tnous travaillons en local&lt;br /&gt;
  Protocol : 06 TCP&lt;br /&gt;
  CheckSum : c2 8a Correct&lt;br /&gt;
  Adresse Source : 7f 00 00 01 Correspond à l'adresse localhost&lt;br /&gt;
  Adresse Destination : 7f 00 00 01 Idem&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;Port Source : 16 2e = 5678 Est le port configuré dans le bloc TCP Writer d'OpenVibe&lt;br /&gt;
  Port Destination : 94 10 = 37904&lt;br /&gt;
  Sequence Number : 05 7b  a6 c7&lt;br /&gt;
  Acknowledgment : 6f c2 f5 62 &lt;br /&gt;
  Longueur de l'en-tete : 80 = 32 Octets que nous sommes en train de détailler&lt;br /&gt;
  Flags : 18 = Acknowledgment et Push activés&lt;br /&gt;
  Window Size Value 08 00 = 2048 Octets seront envoyés sans attendre de confirmation d'un éventuel client&lt;br /&gt;
  CheckSum : fe 30 : La validation étant désactivé d'après WireShark&lt;br /&gt;
  00 00&lt;br /&gt;
  Options 01 01 : Ne fait Rien&lt;br /&gt;
  Kind : 08 TimeStamp(8)&lt;br /&gt;
  Length : 0a = 10 Octets concernant les variables de temps&lt;br /&gt;
  Heure d'envoie celon l'émeteur : 08 09 f7 58&lt;br /&gt;
  Timestamp Echo Replay :08 09 f7 43 &amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données : 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
L'heure d'envoie de l'émeteur : 08 09 f7 58 que nous avons observer conrespondrait à la date du 11/4/1974 à 1:07:52. Nous avons donc déduis que le server n'enverrait donc pas les données de la manière dont WireShark les interprète... Mais nous n'avons pas plus d'information sur les envois de données que celle rappelées plus haut. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé d'écrire un script implémentant soit une communication TCP ou UDP dans le cas d'une future amélioration, tout en restant simple. La communication TCP étant celle que nous visons à utiliser actuellement, et la communication UDP étant celle des VRPN :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Projet BCI Lagis Lille&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# TCP client&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;socket&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;sys&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Here enter mode TCP or VRPN &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#depending on how you send data from OpenVibe&amp;lt;/span&amp;gt;&lt;br /&gt;
 MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 HOST &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;localhost&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 BUFFER_SIZE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Port are here defined as defaults openvibe values&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color:#fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket TCP (SOCK_STREAM for TCP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;5678&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_STREAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket UDP (SOCK_DGRAM for UDP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;VRPN&amp;amp;quot;&amp;lt;/span&amp;gt;)&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;3883&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_DGRAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;try&amp;lt;/span&amp;gt;:&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Connect to server&amp;lt;/span&amp;gt;&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;connect((HOST, PORT))&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;bind((HOST, PORT))&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Receive data from the server and shut down&amp;lt;/span&amp;gt;&lt;br /&gt;
   ov_msg &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;recv(BUFFER_SIZE)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;finally&amp;lt;/span&amp;gt;:&lt;br /&gt;
   sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;close()&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;Data :&amp;amp;quot;&amp;lt;/span&amp;gt;, ov_msg)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La communication TCP étant fonctionnelle, nous avons analysé les échanges OpenVibe&amp;lt;-&amp;gt;Blender avec WireShark. Le script client étant exécuté periodiquement dans blender (au rythme des image de l'animation) on observe un taux de réussite d’échange de donnée supérieur à 85%. Les échecs étant probablement dus aux accès concurrents entre le serveur et le client. Ces erreurs n'engendrerai donc pas de défaut de fonctionnement du système global. Tout au plus, on observerai un retard d'une ou deux images entre le moment où la donnée est recue et le moment ou l'animation est modifié. Mais étant donnée la conception du serveur (TCP Writer), l'en-tête est renvoyé à chaque fois qu'un échange a échoué. Autrement dit, il est nécessaire d'échangé au moins 9 paquets consécutivement sans erreurs pour pouvoir avoir enfin une donnée exploitable.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI WireShark TCP OVtoB.png]]&lt;br /&gt;
&lt;br /&gt;
'''Conversion de donnée OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les données d'OpenVibe sont formatés en EBML (Extensible Binary Meta Language) historiquement un formatage pour fichiers multimédia propriétaire de Matroska. Pour les rendre exploitable dans blender nous avons trouver un parser EBML to Python.&lt;br /&gt;
&lt;br /&gt;
Sources : http://sjohannes.wordpress.com/2010/04/28/matroska-tagging-support/ &lt;br /&gt;
&lt;br /&gt;
Code Python : http://bazaar.launchpad.net/~exaile-devel/exaile/exaile-0.3.x/view/head:/xl/metadata/_matroska.py&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque a été développé dans un besoin de convertir des fichiers multimédia en python. Comme notre projet est très différent nous avons étudié ce code pour voir si effectivement il pourrait répondre à nos besoins.&lt;br /&gt;
Nous avons donc utilisé le Bloc EBML Spy d'OpenVibe pour observer les données, connues, provenant du classifier du scenario &amp;quot;Handball-replay&amp;quot;. La donnée utile pour nous étant un nombre réel compris entre -10 et +10 et indiquant si le sujet présentait des mouvement de la main droite ou de la main gauche.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI EBML Stream Champeiro.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
Dans le code source du parser, on trouve des lignes 292 à 376 les tags qui sont actuellement convertis. Malheureusement, aucun des tags openvibe n'est pris en compte par ce parser. Nous avons donc envisagé d'adapter ce parser à nos besoin quitte à le reconstruire presque entièrement.&lt;br /&gt;
&lt;br /&gt;
'''Client VRPN'''&lt;br /&gt;
&lt;br /&gt;
La communication TCP s'avérant infructueuse nous avons envisagé de développé plutot un client VRPN en python pour Blender. Pour se faire nous avons utilisé la bibliothèque VRPN version 7.30 ainsi qu'un parser de langages objet : SWIG version 2.0.12&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_piano_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_roll1_Champeiro.png]]  [[Fichier:BCI_roll2_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
''Vue du modèle de la main au repos et pendant le pianotement''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectifs Futurs ==&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_roll2_Champeiro.png&amp;diff=9526</id>
		<title>Fichier:BCI roll2 Champeiro.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_roll2_Champeiro.png&amp;diff=9526"/>
				<updated>2014-02-17T16:02:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_roll1_Champeiro.png&amp;diff=9525</id>
		<title>Fichier:BCI roll1 Champeiro.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_roll1_Champeiro.png&amp;diff=9525"/>
				<updated>2014-02-17T16:01:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_piano_Champeiro.png&amp;diff=9524</id>
		<title>Fichier:BCI piano Champeiro.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:BCI_piano_Champeiro.png&amp;diff=9524"/>
				<updated>2014-02-17T16:01:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9523</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9523"/>
				<updated>2014-02-17T16:00:57Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Réalisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre propre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer venait d'être développé (decembre 2013) mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
Server : OpenVibe : TCP Writer &lt;br /&gt;
&lt;br /&gt;
Client : NetCat : nc localhost 5678&lt;br /&gt;
&lt;br /&gt;
Sniffeur de Tram : WireShark&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le client reçoit 8 paquets dont 4 octets de données. Ce qui correspondrait donc aux 8 variables annoncées. Nous avons fais une étude détaillé pour nous en assurer.&lt;br /&gt;
&lt;br /&gt;
Format et découpage des octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  4  Octets de Données&lt;br /&gt;
&lt;br /&gt;
1er Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 08 40 00 40 06  e1 b5 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 e9 09 34&lt;br /&gt;
  a6 c9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Numéro de version : 1, semble correspondre au numéro de version du bloc TCP Writer plus qu'à la version d'OpenVibe&lt;br /&gt;
&lt;br /&gt;
2em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 09 40 00 40 06  e1 b4 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 e9&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Endianness : Little Endian&lt;br /&gt;
&lt;br /&gt;
3em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0a 40 00 40 06  e1 b3 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd c9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00&lt;br /&gt;
Fréquence d'échantillonnage : 0 Cette valeur n'est valide que dans le cas de la transmission d'un signal ce qui n'est pas le cas ici&lt;br /&gt;
&lt;br /&gt;
4em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0b 40 00 40 06  e1 b2 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd cd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34 &lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 01 00 00 00&lt;br /&gt;
Nombre de Lignes. En considérant seulement le premier octet on obtient effectivement la valeur attendue 1 mais nous ne comprenons pas pourquoi elle serait à cet endroit.&lt;br /&gt;
&lt;br /&gt;
5em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0c 40 00 40 06  e1 b1 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d1 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 01&lt;br /&gt;
Nombre de Colonnes = 1&lt;br /&gt;
&lt;br /&gt;
6em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0d 40 00 40 06  e1 b0 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d5 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00 &lt;br /&gt;
Variable de rembourrage 1&lt;br /&gt;
&lt;br /&gt;
7em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0e 40 00 40 06  e1 af 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd d9 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 2&lt;br /&gt;
&lt;br /&gt;
8em Envoi&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 38 5b 0f 40 00 40 06  e1 ae 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e b7 35 2e ae  fd dd 61 71 6f 2c 80 18&lt;br /&gt;
  08 00 fe 2c 00 00 01 01  08 0a 09 34 a6 ea 09 34&lt;br /&gt;
  a6 ea&amp;lt;/span&amp;gt; 00 00 00 00   &lt;br /&gt;
Variable de rembourrage 3&lt;br /&gt;
&lt;br /&gt;
Ensuite La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Addresses&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt;Type&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;20 Octets d'en-tête IPv4&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;32 Octets TCP&amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;00 00 00 00 00 00 00 00  00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; 08 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt; 45 00&lt;br /&gt;
  00 3c 7a 2f 40 00 40 06  c2 8a 7f 00 00 01 7f 00&lt;br /&gt;
  00 01&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt; 16 2e 94 10 05 7b  a6 c7 6f c2 f5 62 80 18&lt;br /&gt;
  08 00 fe 30 00 00 01 01  08 0a 08 09 f7 58 08 09&lt;br /&gt;
  f7 43&amp;lt;/span&amp;gt; 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
Interprétation&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;Adresses : Les deux programmes étant en local ses octets sont laissés à 0&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #0e84b5&amp;quot;&amp;gt; Type : 0x0800 ==&amp;gt; IP&amp;lt;/span&amp;gt;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #008800&amp;quot;&amp;gt;IPv4 : 4 pour IPv4 par defaut&lt;br /&gt;
  Header Length : 5 : 5 x 32 bits&lt;br /&gt;
  Length : 00 3c = 60 Correspondant bien aux 74 octets totaux moins les paquets Ethernet&lt;br /&gt;
  Identification : 7a 2f valeur dépendante du message et incrémentée chaque fois&lt;br /&gt;
  Flags : 04 00 pour ne pas fragmenter&lt;br /&gt;
  Time To Live : 40 = 64 Ce qui est largement suffisant étant donné que tnous travaillons en local&lt;br /&gt;
  Protocol : 06 TCP&lt;br /&gt;
  CheckSum : c2 8a Correct&lt;br /&gt;
  Adresse Source : 7f 00 00 01 Correspond à l'adresse localhost&lt;br /&gt;
  Adresse Destination : 7f 00 00 01 Idem&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color: #880000&amp;quot;&amp;gt;Port Source : 16 2e = 5678 Est le port configuré dans le bloc TCP Writer d'OpenVibe&lt;br /&gt;
  Port Destination : 94 10 = 37904&lt;br /&gt;
  Sequence Number : 05 7b  a6 c7&lt;br /&gt;
  Acknowledgment : 6f c2 f5 62 &lt;br /&gt;
  Longueur de l'en-tete : 80 = 32 Octets que nous sommes en train de détailler&lt;br /&gt;
  Flags : 18 = Acknowledgment et Push activés&lt;br /&gt;
  Window Size Value 08 00 = 2048 Octets seront envoyés sans attendre de confirmation d'un éventuel client&lt;br /&gt;
  CheckSum : fe 30 : La validation étant désactivé d'après WireShark&lt;br /&gt;
  00 00&lt;br /&gt;
  Options 01 01 : Ne fait Rien&lt;br /&gt;
  Kind : 08 TimeStamp(8)&lt;br /&gt;
  Length : 0a = 10 Octets concernant les variables de temps&lt;br /&gt;
  Heure d'envoie celon l'émeteur : 08 09 f7 58&lt;br /&gt;
  Timestamp Echo Replay :08 09 f7 43 &amp;lt;/span&amp;gt;&lt;br /&gt;
  8  Octets de Données : 75 df 7a cb fa e0  d9 3f&lt;br /&gt;
&lt;br /&gt;
L'heure d'envoie de l'émeteur : 08 09 f7 58 que nous avons observer conrespondrait à la date du 11/4/1974 à 1:07:52. Nous avons donc déduis que le server n'enverrait donc pas les données de la manière dont WireShark les interprète... Mais nous n'avons pas plus d'information sur les envois de données que celle rappelées plus haut. &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé d'écrire un script implémentant soit une communication TCP ou UDP dans le cas d'une future amélioration, tout en restant simple. La communication TCP étant celle que nous visons à utiliser actuellement, et la communication UDP étant celle des VRPN :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Projet BCI Lagis Lille&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# TCP client&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;socket&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0e84b5; font-weight: bold&amp;quot;&amp;gt;sys&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Here enter mode TCP or VRPN &amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#depending on how you send data from OpenVibe&amp;lt;/span&amp;gt;&lt;br /&gt;
 MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 HOST &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;localhost&amp;amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 BUFFER_SIZE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;1024&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;#Port are here defined as defaults openvibe values&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color:#fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket TCP (SOCK_STREAM for TCP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;5678&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_STREAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Create a socket UDP (SOCK_DGRAM for UDP socket)&amp;lt;/span&amp;gt;&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;VRPN&amp;amp;quot;&amp;lt;/span&amp;gt;)&lt;br /&gt;
   PORT &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;3883&amp;lt;/span&amp;gt;&lt;br /&gt;
   sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;socket(socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;AF_INET, socket&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;SOCK_DGRAM)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;try&amp;lt;/span&amp;gt;:&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt;(MODE &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;==&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;TCP&amp;amp;quot;&amp;lt;/span&amp;gt;):&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Connect to server&amp;lt;/span&amp;gt;&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;connect((HOST, PORT))&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;else&amp;lt;/span&amp;gt;:&lt;br /&gt;
       sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;bind((HOST, PORT))&lt;br /&gt;
       &amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;# Receive data from the server and shut down&amp;lt;/span&amp;gt;&lt;br /&gt;
   ov_msg &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;recv(BUFFER_SIZE)&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;finally&amp;lt;/span&amp;gt;:&lt;br /&gt;
   sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;.&amp;lt;/span&amp;gt;close()&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;print&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;background-color: #fff0f0&amp;quot;&amp;gt;&amp;amp;quot;Data :&amp;amp;quot;&amp;lt;/span&amp;gt;, ov_msg)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La communication TCP est fonctionnelle, nous avons analysé les échanges OpenVibe&amp;lt;-&amp;gt;Blender avec WireShark et les resultats sont encourageants. Le script client étant exécuté periodiquement dans blender (au rythme des image de l'animation) on observe un taux de réussite d’échange de donnée supérieur à 85%. Ces erreurs n'engendreront donc pas de défaut de fonctionnement du système global. Tout au plus, on observera un retard d'une ou deux images entre le moment où la donnée est recue et le moment ou l'animation est modifié.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI WireShark TCP OVtoB.png]]&lt;br /&gt;
&lt;br /&gt;
'''Conversion de donnée OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
Les données d'OpenVibe sont formatés en EBML (Extensible Binary Meta Language) historiquement un formatage pour fichiers multimédia propriétaire de Matroska. Pour les rendre exploitable dans blender nous avons trouver un parser EBML to Python.&lt;br /&gt;
&lt;br /&gt;
Sources : http://sjohannes.wordpress.com/2010/04/28/matroska-tagging-support/ &lt;br /&gt;
&lt;br /&gt;
Code Python : http://bazaar.launchpad.net/~exaile-devel/exaile/exaile-0.3.x/view/head:/xl/metadata/_matroska.py&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque a été développé dans un besoin de convertir des fichiers multimédia en python. Comme notre projet est très différent nous avons étudié ce code pour voir si effectivement il pourrait répondre à nos besoins.&lt;br /&gt;
Nous avons donc utilisé le Bloc EBML Spy d'OpenVibe pour observer les données, connues, provenant du classifier du scenario &amp;quot;Handball-replay&amp;quot;. La donnée utile pour nous étant un nombre réel compris entre -10 et +10 et indiquant si le sujet présentait des mouvement de la main droite ou de la main gauche.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI EBML Stream Champeiro.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
Dans le code source du parser, on trouve des lignes 292 à 376 les tags qui sont actuellement convertis. Malheureusement, aucun des tags openvibe n'est pris en compte par ce parser. Nous avons donc envisagé d'adapter ce parser à nos besoin quitte à le reconstruire presque entièrement.&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_piano_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI_roll1_Champeiro.png]]  [[Fichier:BCI_roll2_Champeiro.png]]&lt;br /&gt;
&lt;br /&gt;
''Vue du modèle de la main au repos et pendant le pianotement''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9522</id>
		<title>Fichier:Piano.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9522"/>
				<updated>2014-02-17T15:58:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : a téléversé une nouvelle version de « Fichier:Piano.png »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9236</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9236"/>
				<updated>2014-02-06T22:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Réalisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer avait déjà été développé mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (Addresses, Type)&lt;br /&gt;
  20 Octets d'en-tête IPv4&lt;br /&gt;
  32 Octets TCP (ceux détaillé au dessus)&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Grâce à la communauté Blender il est aisée de trouver un bout de code python implémentant des fonctionnalités réseaux.&lt;br /&gt;
Sources : http://blenderartists.org/forum/showthread.php?280465-setblocking%280%29-PROBLEM!&amp;amp;highlight=setblocking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:roll1.png]]  [[Fichier:roll2.png]]&lt;br /&gt;
&lt;br /&gt;
''Vue du modèle de la main au repos et pendant le pianotement''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9235</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9235"/>
				<updated>2014-02-06T22:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Réalisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer avait déjà été développé mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (Addresses, Type)&lt;br /&gt;
  20 Octets d'en-tête IPv4&lt;br /&gt;
  32 Octets TCP (ceux détaillé au dessus)&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Grâce à la communauté Blender il est aisée de trouver un bout de code python implémentant des fonctionnalités réseaux.&lt;br /&gt;
Sources : http://blenderartists.org/forum/showthread.php?280465-setblocking%280%29-PROBLEM!&amp;amp;highlight=setblocking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:roll1.png]]  [[Fichier:roll2.png]]&lt;br /&gt;
&lt;br /&gt;
Vue du modèle de la main au repos et pendant le pianotement&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Roll2.png&amp;diff=9233</id>
		<title>Fichier:Roll2.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Roll2.png&amp;diff=9233"/>
				<updated>2014-02-06T22:17:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Roll1.png&amp;diff=9232</id>
		<title>Fichier:Roll1.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Roll1.png&amp;diff=9232"/>
				<updated>2014-02-06T22:16:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9231</id>
		<title>Fichier:Piano.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9231"/>
				<updated>2014-02-06T22:15:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : a téléversé une nouvelle version de « Fichier:Piano.png »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9230</id>
		<title>Fichier:Piano.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Piano.png&amp;diff=9230"/>
				<updated>2014-02-06T22:13:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9229</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9229"/>
				<updated>2014-02-06T22:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Réalisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer avait déjà été développé mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (Addresses, Type)&lt;br /&gt;
  20 Octets d'en-tête IPv4&lt;br /&gt;
  32 Octets TCP (ceux détaillé au dessus)&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Grâce à la communauté Blender il est aisée de trouver un bout de code python implémentant des fonctionnalités réseaux.&lt;br /&gt;
Sources : http://blenderartists.org/forum/showthread.php?280465-setblocking%280%29-PROBLEM!&amp;amp;highlight=setblocking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
[[Fichier:piano.png]]&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
[[Fichier:roll1.png]]  [[Fichier:roll2.png]]&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9228</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9228"/>
				<updated>2014-02-06T21:55:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Développement du retour graphique sous blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer avait déjà été développé mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (Addresses, Type)&lt;br /&gt;
  20 Octets d'en-tête IPv4&lt;br /&gt;
  32 Octets TCP (ceux détaillé au dessus)&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Grâce à la communauté Blender il est aisée de trouver un bout de code python implémentant des fonctionnalités réseaux.&lt;br /&gt;
Sources : http://blenderartists.org/forum/showthread.php?280465-setblocking%280%29-PROBLEM!&amp;amp;highlight=setblocking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Le développement sous Blender consiste à créer un feedback visuel pour l’utilisateur. Il faut donc modéliser une main qui bouge selon la volonté de mouvement de l’utilisateur. Dans un premier temps, il faut créer une main, et lui associer une animation pour qu’elle pianote, superposée à un piano dont les touches bougent en même temps que les doigts ; l’objectif est que lorsque l’utilisateur veut pianoter, il voit la main pianoter à sa place et appuyer sur les touches du piano. Le logiciel de création de Blender permet d’associer un signal d’entrée, par exemple l’appui sur une touche du clavier (d’ordinateur), à l’animation de la main et du piano. L’intérêt serait alors que le signal d’entrée soit provoqué par le logiciel OpenVibe lors de l’imagination de mouvement de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
== Réalisation ==&lt;br /&gt;
&lt;br /&gt;
Une main déjà modélisée et articulée, ainsi qu’un décor d’opéra contenant un piano, ont été trouvés sur des sites communautaires de Blender.&lt;br /&gt;
Pour le piano, il a été nécessaire de recréer le clavier (l’ensemble des touches) car dans le modèle utilisé, elles étaient toutes solidaires. Le clavier à touches indépendantes a donc été placé à la place du clavier original. Maintenant, il est donc possible de faire bouger chaque touche indépendamment, et donc de créer l’animation des touches qui s’enfoncent.&lt;br /&gt;
&lt;br /&gt;
Pour la main, une animation était déjà pré-programmée, qui montrait la main d’abord fermée, puis qui s’ouvrait le plus possible, sans que le rendu paraisse irréaliste. La construction de l’animation est basée sur une série de marqueurs qui indiquent la position que doivent avoir chaque membres à certaines images de l’animation. En réutilisant ces marqueurs, il est donc possible de créer le mouvement de pianotement voulu.&lt;br /&gt;
&lt;br /&gt;
Une étape intéressante serait de pouvoir agir sur la vitesse de l’animation de la main, en fonction de l’intensité de l’imagination du mouvement par l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9227</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=9227"/>
				<updated>2014-02-06T21:54:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Développement d'une interface logicielle OpenVibe  Blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
== Reflexion ==&lt;br /&gt;
&lt;br /&gt;
=== TCP/IP ===&lt;br /&gt;
&lt;br /&gt;
Nos recherches nous ont amené à entrer en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet : c'est lui qui a réalisé une interface BCI implémentant une liaison TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI. C'est lui qui nous a proposée cette éventualité. Voici l'un de ses projets en cours : https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
Blender permet ce type de communication grace à un script python, mais ce n'est pas le cas d'OpenVibe.&lt;br /&gt;
 &lt;br /&gt;
Notre objectif ici est donc de créer un bloc OpenVibe qui implémentera une fonction de communication via ce protocole.&lt;br /&gt;
&lt;br /&gt;
Ce bloc prendra en entrée un vecteur de donnée issu du classifieur. Le programmeur de scénario OpenVibe pourra paramétrer le message envoyé et pour quel donné du vecteur.&lt;br /&gt;
L'idée est donc d'importer des bibliothèques de communication tcp/ip dans openvibe pour développer un bloc pouvant communiquer aussi bien avec Blender qu'avec un autre programme voire un autre système en réseau. Au niveau du choix de protocole TCP ou UDP, c'est le protocole TCP qui satisfera le mieux notre besoin car il garantit l'intégrité des paquets transmis. Sachant que les messages seront transmis à chaque changement d'état d'un des paramètre d'entrée de la boite, il faut absolument que l'ordre soit correctement transmis à Blender. Le protocole UDP permettrai une meilleure réactivité, car plus rapide, mais il ne garantis pas le bon fonctionnement à chaque transmission, on pourrait envisager ce protocole dans le cas d'échanges de messages cadencé à une certaine fréquence, où la quantité rattrape la qualité de la communication.&lt;br /&gt;
&lt;br /&gt;
La difficulté rencontrée ici est l'implémentation d'un bloc nouveau dans OpenVibe. Nous nous somme inscrits sur le forum d'OpenVibe pour nous faire aider de la communauté associée.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VRPN ===&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. &lt;br /&gt;
La bibliothèque VRPN est implémentée nativement dans OpenVibe ce qui nous amène à envisager d'implémenter cette même bibliothèque coté Blender. Le problème étant que nous n'avons pas de garantis que ceci soit possible. Il est possible d'étendre Blender grâce à des scripts python donc nous pensons que c'est effectivement faisable mais ne comprenons pas pourquoi est ce que cette fonction n'a pas déjà été implémenté étant donné la manière dont Blender est répandu et son aspet opensource. Cela dit, la communication VRPN utilise en réalité la communication réseau TCP classique comme base (port par défaut 3883), il s'agit donc en fait d'un protocole spécifique ajouté sur la base dont nous avons pas forcément utilité.&lt;br /&gt;
&lt;br /&gt;
Après des recherches approfondies nous avons découvert qu'il existe un patch permettant de transformer Blender en BlenderCave. http://blendercave.limsi.fr/doku.php&lt;br /&gt;
Celui ci intègre de nouvelles fonctions notamment la possibilité de faire de la 3D stéréoscopique mais qui intègrerai également un VRPN.&lt;br /&gt;
L'inconvénient principal de cette configuration est que ce patch ne peut être utilisé que sur une révision précise de Blender.&lt;br /&gt;
&lt;br /&gt;
L'objectif serait de vérifier sa compatibilité entre OpenVibe et ce dernier. Si c'est le cas, essayer de porter la fonctionnalité VRPN vers une version quelconque de Blender.&lt;br /&gt;
&lt;br /&gt;
== Développement ==&lt;br /&gt;
&lt;br /&gt;
Nous choisissons donc de développer un système de communication TCP car les briques de bases sont disponibles de chaque coté. En effet la bibliothèque VRPN utilise en fait une communication TCP, donc OpenVibe devrait pouvoir communiquer par TCP. &lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Réaliser un nouveau bloc OpenVibe permettant de transmettre des données via TCP ou UDP. Nous sommes inscrits sur le Forum OpenVibe : http://openvibe.inria.fr/forum/&lt;br /&gt;
Et partons suivre les tutos OpenVibe sur la créations de nouveaux blocs : http://openvibe.inria.fr/introduction-algo-boxes/&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
&lt;br /&gt;
'''Bloc OpenVibe'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BCI TCP Writer Champeirock.png|left]][[Fichier:Wireshark Icon BCI Champeiro.png|right|50px]]&lt;br /&gt;
Après avoir commencé à développer notre Bloc nous avons été informé par la communauté qu'un bloc TCP Writer avait déjà été développé mais était en version Non Stable. Nous sommes donc repartis de cette base-ci. Doc TCP Writer : http://openvibe.inria.fr/documentation/unstable/Doc_BoxAlgorithm_TCPWriter.html&lt;br /&gt;
Nous avons donc analysé la structure de la transmission avec un outils type WireShark&lt;br /&gt;
La boite fait office de Server TCP qui transmet son vecteur d'information d'entrée sur une Socket TCP. On peut choisir 3 types de données de sorties : Raw, Hexa ou String. &lt;br /&gt;
Mais en pratique, on ne peut utiliser les formats Hex ou String que pour transmettre des données de stimulation, ce qui n'est pas notre cas ici vu que nous voulons transmettre un vecteur d'information. Nous allons donc nous intéresser au format du message transmis au format Raw.&lt;br /&gt;
- La boîte envoie d'abord à chaque client qui se connecte huit variables uint32 : &lt;br /&gt;
  numéro de version&lt;br /&gt;
  endianness : 0 == inconnue , 1 == little , 2 == big, 3 == PDP&lt;br /&gt;
  la fréquence d'échantillonnage du signal &lt;br /&gt;
  le nombre de canaux (nb de lignes de la matrice d'info transmise)&lt;br /&gt;
  le nombre d'échantillons par bloc (colonnes de la matrice) &lt;br /&gt;
  Trois variables de rembourrage &lt;br /&gt;
&lt;br /&gt;
8 * 4 = 32 octets au total. Les 6 dernières variables sont dans l'ordre des octets du flux. &lt;br /&gt;
&lt;br /&gt;
Plusieurs clients peuvent se connecter à la socket. La boîte continue à envoyer des données à chaque client jusqu'à ce que le scénario OpenVibe se termine ou que le client se déconnecte.&lt;br /&gt;
&lt;br /&gt;
Analyse détaillée d'une trame pour la transmission d'une Matrice (1,1) :&lt;br /&gt;
La trame est composé d'un total de 74 Octets :&lt;br /&gt;
  14 Octets Ethernets (Addresses, Type)&lt;br /&gt;
  20 Octets d'en-tête IPv4&lt;br /&gt;
  32 Octets TCP (ceux détaillé au dessus)&lt;br /&gt;
  8  Octets de Données&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Script Blender'''&lt;br /&gt;
&lt;br /&gt;
Grâce à la communauté Blender il est aisée de trouver un bout de code python implémentant des fonctionnalités réseaux.&lt;br /&gt;
Sources : http://blenderartists.org/forum/showthread.php?280465-setblocking%280%29-PROBLEM!&amp;amp;highlight=setblocking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développement du retour graphique sous blender =&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation BCI&lt;br /&gt;
&lt;br /&gt;
21/02/2014&lt;br /&gt;
&lt;br /&gt;
'''Présentation Polytech'Lille'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== Blender ===&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
http://blendercave.limsi.fr/doku.php&lt;br /&gt;
&lt;br /&gt;
http://www.blendswap.com/&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/romaingrandchamp/cerveaurium&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=8702</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=8702"/>
				<updated>2014-01-17T11:06:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Développement d'une interface logicielle OpenVibe  Blender */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
== Contexte : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le but général est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement. Les patients susceptibles d'utiliser cette technologie sont ceux atteint de paralysie musculaire complète (LIS : Locked In Syndrom) ou de SLA (Sclérose Latérale Amyotrophique). Ces maladies affectant très peu les fonctions cérébrales, cette technologie semble pouvoir devenir LA solution pour pallier au handicap. Ce projet est réalisé en collaboration avec l'équipe BCI du LAGIS.&lt;br /&gt;
&lt;br /&gt;
Voilà ce que fait l'interface cerveau ordinateur (BCI : Brain Computer Interface ou BMI : Brain Machine Interface) de façon détaillée : les signaux électroencéphalographiques (EEG) sont acquis, numérisés et traités pour pouvoir ensuite être transformés en commandes. Une partie de ces informations est aussi affichée de manière simple pour l'utilisateur pour lui permettre un apprentissage plus rapide grâce à ce retour visuel.&lt;br /&gt;
&lt;br /&gt;
Comment ? &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema-bci.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Acquisition ===&lt;br /&gt;
&lt;br /&gt;
L'information cérébrale peut-être acquise de différentes manières :&lt;br /&gt;
&lt;br /&gt;
- La première est non invasive, c'est à dire qu'elle ne nécessite pas d'intervention chirurgical visant à implanter un quelconque dispositif dans le corps du patient. A l'aide d'un casque muni d'électrodes placés sur le crane, on peut acquérir les signaux cérébraux passant à travers la boite crânienne (appelés signaux EEG). L'ordre de grandeur de ces signaux électriques ne dépasse pas le microvolt et les signaux acquis sont très fortement bruités. Mais ce dispositif est simple à mettre en œuvre et peut être utilisé aussi bien par les patients que par les chercheurs lors d'une phase expérimentale qu'est la nôtre.&lt;br /&gt;
&lt;br /&gt;
- La seconde est semi-invasive, l’électrode servant à l'acquisition des signaux est implanté sous la surface de la boîte crânienne (ECoG : électrocorticogramme). Cette méthode permet d'augmenter considérablement la qualité des signaux qui sont beaucoup moins bruités que les signaux EEG. De plus, elle présente peu de risque puisque l’électrode est situé à l’extérieur de la dure-mère.&lt;br /&gt;
&lt;br /&gt;
- La dernière est dite invasive, dans le sens où on vient placer des électrodes directement dans la masse cérébrale. Cette méthode a deja fait ses preuves : en 2005 un patient tétraplégique était capable de contrôler une prothèse robotique grâce à ce dispositif. Néanmoins, les électrodes ont une durée de vie limitée et les lésions cérébrales, dues à l’implantation des électrodes, sont irréversibles.&lt;br /&gt;
&lt;br /&gt;
Une autre méthode consiste à détecter des signaux résultant de stimuli extérieurs connus (ERP : Event Related Potentials). Dans le cadre de notre projet, nous allons développer une interface graphique qui va être intégrer dans une interface BCI de type asynchrone basée sur l'analyse des signaux EEG acquis dans le cas de mouvements imaginés des pieds et des mains gauche ou droite. Les EEG considérés sont issus des activités ipsilatérales et contralatérales du cortex pré-moteur.&lt;br /&gt;
&lt;br /&gt;
=== Traitement des signaux EEG ===&lt;br /&gt;
&lt;br /&gt;
L'objectif du traitement des signaux EEG est de discriminer le mouvement imaginé par le patient (main droite, main gauche, pied). Pour cela, il est nécessaire d'extraire des signaux EEG un certains nombre d'attributs qui vont permettre de prendre une décision sur la commande à effectuer au sein de l'interface BCI en cours de developpement au LAGIS. Il est effectué par un logiciel d'analyse numérique comme MatLab, OpenVibe.&lt;br /&gt;
&lt;br /&gt;
Les attributs extraits sont les amplitudes des signaux cérébraux dans certaines bandes de fréquence. Exemple, l'amplitude du rythme µ (entre 8Hz et 15Hz) disparait environ une seconde avant et pendant un mouvement des pieds ou des mains, mais aussi avant et pendant l'imagination de ce mouvement. Dans le même contexte on peut observer de grandes modifications d'amplitude du signal EEG dans la bande ß (entre 15Hz et 35Hz) occurrentes avant, pendant et juste après un mouvement. Ces signaux sont toujours très brefs mais la manière dont ils sont acquis (niveau d'invasivité) change complètement la manière dont ils seront traités. Les signaux mesurés à la surface du cerveau sont les plus problématiques car ils résultent de l'activité de millions de neurones.&lt;br /&gt;
&lt;br /&gt;
Le pré-traitement a pour fonction l’élimination des artefacts (signaux induits par une autre activité corporelle que celle observée comme le clignement des yeux, la déglutition...) ainsi que l'amélioration du rapport signal sur bruit, bruit venant de tous les signaux à proximité, autant dire de tous les neurones à proximité donc quelques millions par point de mesure. Pour ce faire, différentes techniques sont mises en œuvre : &lt;br /&gt;
&lt;br /&gt;
-Filtrage spatial : Combinaison linéaire des signaux des électrodes voisines. Par exemple le filtrage Laplacien, consistant à soustraire à un signal, la moyenne de ces voisins : très répandu car aussi simple qu’efficace pour éliminer le bruit. &lt;br /&gt;
&lt;br /&gt;
-Filtrage fréquentiel : Sachant que nous cherchons à mesure l'amplitude des signaux dans les bandes de fréquence 8-35Hz il convient d'effectuer un filtrage fréquentiel éliminant toutes les fréquences hors de cette plage.&lt;br /&gt;
&lt;br /&gt;
-Interface Synchrone : Une interface est dite Synchrone lorsque ce n'est pas l'activité spontanée du cerveau qui est analysée mais la réponse attendu à des stimulus générés par l'interface. Des signaux réflexifs sont générés de manière mécanique et inconsciente ce qui rend la phase d'apprentissage beaucoup plus simple.&lt;br /&gt;
&lt;br /&gt;
-Interface Asynchrone : Une interface asynchrone à contrario analyse les signaux à tous moments. Et même si l'on peut sélectionner les zones du cerveaux à observer en choisissant l'emplacement des électrodes il n’empêche que les signaux observés sont le résultat de la somme de toutes les activités cérébrales avoisinante. Dans le cas de la réalisation ou de l'imagination de mouvements des mains (droite ou gauche) par exemple, il s'agit de reconnaitre dans les signaux cérébraux, le moment où un événement se produit et le type d'événement généré (droite ou gauche). Dans le cas de l'interface développée par le LAGIS les signaux EEG sont analysés en s'appuyant sur l'expertise des neurophysiologistes qui ont mis en évidence des modifications des signaux EEG dans certaines bandes de fréquence dans la zone moteur du cortex avant, pendant et après l'imagination ou la réalisation du mouvement.&lt;br /&gt;
&lt;br /&gt;
=== Méthode d'exploitation des signaux cérébraux acquis (ou paradigme) ===&lt;br /&gt;
Afin de transformer les signaux acquis en commande d'un vas, d'un fauteuil roulant, ou autre, il est nécessaire de définir un paradigme expérimental. En d'autre termes : la manière dont les signaux cérébraux vont être exploités au sein de l'interface. Il est possible de distinguer deux grandes catégories d'interfaces BCI dans ce cas : les interfaces synchrones et les interfaces asynchrones.&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
A l'issue de la phase de traitement précédemment décrite, nous disposons d'un ensemble d'attributs mesurés sur les signaux à intervalles réguliers (tous les dixièmes de seconde).&lt;br /&gt;
A partir de ces vecteurs d'attributs, il s'agit d'identifier le type de mouvement réalisé ou imaginé(dans le cas d'une interface asynchrone) ou de décider si le sujet a répondu positivement au stimulus ou non (dans le cas d'une interface synchrone).&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de décider si le vecteur d'attributs considéré est caractéristique d'un mouvement ou d'une réponse positive au stimulus. Ceci est le propre de ce que l'on appelle la classification.&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles de techniques de classification : la classification supervisée et la classification non supervisée. La classification non supervisée consiste à prendre une décision d'identification sans aucune connaissance à priori sur les vecteurs d'attributs (ou éléments) à classer.&lt;br /&gt;
&lt;br /&gt;
La classification supervisée part de la connaissance à priori des éléments que l'on vise à identifier et se décline en deux phases successives :&lt;br /&gt;
&lt;br /&gt;
'''Offline'''&lt;br /&gt;
Une phase d'apprentissage basée sur l'analyse d'éléments connus et parfaitement identifiés. Il s'agit alors d'ajuster les paramètres du classifieur en fonction des éléments à priori identifiés&lt;br /&gt;
&lt;br /&gt;
'''Online'''&lt;br /&gt;
Une phase de classement des éléments inconnus en utilisant le classifieur paramétré dans la phase précédente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans le domaine des interfaces BCI, les techniques de classification les plus utilisées sont de type supervisées. Les plus courantes : &lt;br /&gt;
&lt;br /&gt;
-LDA&lt;br /&gt;
&lt;br /&gt;
-Les réseaux de neurones&lt;br /&gt;
&lt;br /&gt;
-La classification floue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette étape a pour but d'exploiter les éléments caractéristiques extraits précédemment. Les méthodes choisies dépendent du type d'interface, on distinguera deux types d'interfaces: synchrones ou asynchrones. Le logiciel remplissant cette fonction a été développé par l'INRIA, il s'agit d'OpenVibe.&lt;br /&gt;
&lt;br /&gt;
=== Commande ===&lt;br /&gt;
&lt;br /&gt;
Le résultat de la classification des attributs extraits des signaux cérébraux st généralement mise sous forme de décision binaire. Par exemple : &amp;quot;Y a t il imagination de mouvement de la main droite?&amp;quot; Résultat : &amp;quot;Oui ou Non&amp;quot;. Nous pouvons alors relier ce résultat à la partie opérative de l'interface et piloter ainsi un actionneur. Le nombre d'actionneur devant bien sur être adapté à l'interface qui les exploitera.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces BCI Existantes ===&lt;br /&gt;
&lt;br /&gt;
'''Interface Synchrone'''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Doc BoxAlgorithm P300SpellerVisualisation Snapshot.png|400px|right]]&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complètement immobile de communiquer ou de se déplacer. En terme d'interface de communication, le P300 Speller qui est basé sur la détection de potentiels endogènes évoqués, signaux correspondant à une activité cognitive. Cette interface permet à un sujet entraîné d’écrire plusieurs caractères par minute. Le principe est simple: le sujet regarde une matrice de caractères dont les colonnes et les lignes sont mises en surbrillance de manière aléatoire, il doit alors se concentrer sur le caractère qu'il veut écrire et compter son nombre d'illuminations. A chaque fois que la lettre est comptée une modifications des signaux se produit 300ms plus tard. Il est ainsi possible de détecter la colonne et la ligne sur lesquelles se situe le caractère intéressant. Après plusieurs scintillement on peut donc connaître la lettre choisi par le patient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Online-shooter.png|445px|left]]Il existe également tout un ensemble d'interface développées à partir de l'analyse et l'interprétation des signaux SSVEP (Steady-State Visual Evoked Potential). Ceux-ci ne sont pas générés par une action cognitive mais inconsciemment par notre cerveau. Lorsque nous regardons un objet clignotant sur l’écran, on retrouve la fréquence de ce clignotement sur notre lobe occipital. Ainsi, en créant une interface graphique constituée de plusieurs objets clignotants à différentes fréquences (de l'ordre de quelques dizaines de hertz), et en analysant les signaux évoqués, on peut reconnaitre l'objet observé par le sujet. Cette technique basée sur l'analyse de signaux reflexes s'avère très efficace et ne nécessite aucune phase d'apprentissage. L'exemple ci dessous pourrait représenter l'écran de saisie des commandes de pilotage d'un fauteuil roulant. Les deux carrés pourraient représenter une demande de rotation gauche ou droite tandis que le triangle représenterait une demande de marche avant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MuseumImmersive1.jpg|right|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Interface Asynchrone'''&lt;br /&gt;
&lt;br /&gt;
La dernière technique est la plus complexe mais aussi celle avec le plus grand potentiel. Elle consiste à analyser les signaux cérébraux en vue de détecter la réalisation ou l'imagination de mouvements de différentes parties du corps. Dans notre cas, ce sont les mouvements des deux mains et des pieds qui sont exploités car plus présents au niveau du cortex moteur et donc plus faciles à détecter. L'identification de ces mouvements fournit donc un total de 3 commandes complètement indépendantes de toute stimulation extérieure. On ne peut prévoir à l'avance quand le sujet décidera d'imaginer un mouvement d'une des parties de son corps. Ce paradigme a déjà été exploité par l'INRIA de Rennes pour diriger un avatar dans un espace 3D virtuel matérialisant une visite virtuelle d'un musée. Les signaux correspondant aux mouvements de la main droite sont utilisés pour tourner à droite, ceux de la main gauche pour tourner à gauche et les mouvements des pieds pour avancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des applications interfaces BCI ont aussi été développées pour commander des prothèses ou des fauteuils roulants. En effet, des expériences ont été menées avec succès sur un patient équipé d'une interface non invasive. Il a réussi à contrôler une main robotique grâce à l'analyse de ses rythmes sensorimoteurs, exploités pour détecter l'imagination de mouvement de la main. Ces essais ont été fais sur des personnes valides mais on peut imaginer les possibilités qui s'offrent à des personnes paralysées ou amputées.&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
=== Formulation des besoins ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:main3d.jpg|right|200px]]&lt;br /&gt;
Notre projet consiste au développement de l'interface graphique 3D d'une BCI, de type asynchrone basée su l'analyse de mouvements, réels ou imaginés, fournissant à l'utilisateur un feedback visuel ds commandes qu'il effectue. L'interface doit être composée de 2 couches graphiques dissociables :&lt;br /&gt;
&lt;br /&gt;
- Une couche que nous appelons &amp;quot;la couche Feedback&amp;quot; : c'est la couche est au premier-plan. Elle affichera un avatar virtuel qui va exécuter le mouvement réel ou imaginé par le sujet. Par exemple, dans le cas d'un mouvement imaginé de la main, nous devons représenter graphiquement une main exécutant le mouvement imaginé par le sujet. Il peut s'agir d'une rotation du poignet, d'un mouvement de préhension, de mouvements des doigts etc. La visualisation du mouvement que le sujet imagine (le feedback) permettra peut-être un apprentissage de l'interface dit plus aisé pour le sujet mais on doit essayer de s'assurer qu'il ne soit pas un élément perturbateur. Nos inquiétudes sont fondées sur le même principe que l'instabilité des systèmes bouclés en général. On ne peut pas être certain qu'en observant son avatar à l'écran, le cerveau du sujet ne génère pas les sinusaux électriques correspondant au mouvement qu'il observe.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:piano 3d.jpg|300px|left]]&lt;br /&gt;
- Une couche ludique : celle-ci se situe au second-plan. Elle présente un objectif à réaliser par l'utilisateur en cohérence avec l'action imaginée et représentée par l'avatar. On peut par exemple imaginer un clavier de piano dans le cas d'un mouvement des doigts, d'un ballon qui se gonfle dans le cas de mouvements de préhension répétés.L'objectif permet de créer une forte motivation de l'utilisateur qui facilitera inconsciemment sa concentration. Par exemple : Si le mouvement imaginé par le sujet est de fermer et d'ouvrir la main, on sélectionnera une interface montrant par exemple une main actionnant une pompe et un arrière plan, des ballons à gonfler. Ou encore, avec un mouvement de doigt tapoter sur une table, on choisira d'avantage un piano en arrière plan joué par cette/ces main(s), ou même, avec un mouvement de serrage de vis avec la main, un meuble à monter le plus rapidement possible.&lt;br /&gt;
&lt;br /&gt;
Ces couches doivent être affichables une par une ou en même temps. Le but est de pouvoir analyser l'impact du feedback sur les performances du sujet lors l'utilisation de l'interface BCI. Ainsi que de fournir au sujet un feedback &amp;quot;réaliste&amp;quot; des mouvements qu'il réalise ou imagine plutôt qu'un curseur sur un graphique.&lt;br /&gt;
 [[Fichier:Piano main 3d.jpg|430px|center]]&lt;br /&gt;
&lt;br /&gt;
=== Spécifications ===&lt;br /&gt;
&lt;br /&gt;
Au sein de l'équipe BCI du LAGIS, les outils de développement les plus utilisés sont  :&lt;br /&gt;
&lt;br /&gt;
-MatLab : Pour le traitement des signaux.&lt;br /&gt;
&lt;br /&gt;
-OpenVibe : Logiciel dédié BCI développé par l'INRIA de Rennes, pour la partie acquisition, traitement et feedback visuel.&lt;br /&gt;
&lt;br /&gt;
-C++ : Pour le développement des blocs OpenVibe additionnels&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter dans le cadre de notre projet sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et le nombre de signaux de commandes en sortie d'OpenVibe (main gauche, main droite, pieds, repos).&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui va utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Cela implique donc d'assurer une grande configurabilité des objectifs pour l'utilisateur mais aussi de la manière d'afficher la complétion de ces objectifs et ses performances. Enfin il est important d'assurer une grande configurabilité du mouvement du feedback pour le rendre plus cohérent possible avec celui du sujet.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteurs graphiques 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos Grand Public ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed) : License propriétaire privée d'Ubisoft, impossible d'acheter le DK&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis) : Gratuit pour une utilisation non commerciale&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo) : &lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal) : Non distribué&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Etude Comparative des Moteurs Graphiques ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Engines.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Choix final ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender_logo.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après cette étude nous avons retenus '''Blender''' car il permet un développement très performant et rapide de model 3D réalistes. Nous comptons utiliser son moteur de jeu BlenderGame qui permet des interactions avec les models pour faire fonctionner nos interfaces. La difficulté que cela soulève est l'absence de VRPN dans ce moteur. Outil qui permet la communication entre un système tier et une interface de réalité virtuel. La suite va donc consister à interfacer Blender et Openvibe&lt;br /&gt;
&lt;br /&gt;
= Développement d'une interface logicielle OpenVibe &amp;lt;-&amp;gt; Blender =&lt;br /&gt;
&lt;br /&gt;
Notre objectif est de permettre une communication entre le logiciel OpenVibe, et le moteur graphique de Blender. Plusieurs protocoles de communication sont alors exploitables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Blender-Openvibe.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous mettre en relation avec Romain Grandchamp, un doctorant ayant déjà travaillé sur ce sujet. D'après ses travaux, il est tout à fait possible d'utiliser une communication par protocole TCP/IP entre Blender et BCI2000, un logiciel similaire à OpenVibe pour l'utilisation en recherche en BCI.&lt;br /&gt;
&lt;br /&gt;
Blender permet nativement ce type de communication, mais la version d'OpenVibe dont nous disposons ne permet pas un tel protocole, à moins de créer un bloc OpenVibe à implémenter dans le logiciel.&lt;br /&gt;
La principale difficulté rencontrée ici est que l'implémentation d'un bloc nouveau dans OpenVibe nécessite la recompilation des codes source du logiciel, ce qui n'est possible que sous Linux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un autre moyen de communication est l'utilisation d'un VRPN, un ensemble de librairies permettant la liaison entre un moteur graphique et une interface de réalité virtuelle. L'utilisation de VRPN pour OpenVibe est adéquate, puisque ce logiciel communique déjà avec Ogre3D par ce protocole. Toutefois, ici, c'est Blender qui ne communique pas nativement par VRPN.&lt;br /&gt;
&lt;br /&gt;
Nous avons découvert qu'il existe un patch permttant de transformer Blender en BlenderCave, un moteur graphique évolué de Blender y implémentant plusieurs nouveaux outils de développement pour réalité virtuelle, dont un VRPN.&lt;br /&gt;
&lt;br /&gt;
Un désavantage principal de cette implémentation est qu'un patch ne peut être utilisé que sur une révision précise de Blender, et que l'application de ce patch ne semble pas fonctionner sous Windows.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gant PFE BCI.png|650px]]&lt;br /&gt;
&lt;br /&gt;
'''Présentation Mi-PFE'''&lt;br /&gt;
&lt;br /&gt;
10/12/2013&lt;br /&gt;
&lt;br /&gt;
'''Présentation'''&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/search?q=engine+3d&amp;amp;sa.x=0&amp;amp;sa.y=0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://www.blender.org/education-help/tutorials/game-engine/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://mycryengine.com/index.php?conid=70&lt;br /&gt;
&lt;br /&gt;
http://www.havok.com/try-havok&lt;br /&gt;
&lt;br /&gt;
http://www.desura.com/engines/unreal-development-kit/downloads/udk&lt;br /&gt;
&lt;br /&gt;
http://www.truevision3d.com/downloads.php&lt;br /&gt;
&lt;br /&gt;
http://hub.jmonkeyengine.org/&lt;br /&gt;
&lt;br /&gt;
http://www.neoaxis.com/neoaxis/licensing&lt;br /&gt;
&lt;br /&gt;
http://www.shivaengine.com/download.html&lt;br /&gt;
&lt;br /&gt;
http://unity3d.com/unity/download&lt;br /&gt;
&lt;br /&gt;
https://store.unity3d.com/&lt;br /&gt;
&lt;br /&gt;
http://www.twinmotion.com/acheter.html&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;br /&gt;
&lt;br /&gt;
=== Autres Projets BCI ===&lt;br /&gt;
&lt;br /&gt;
http://air.imag.fr/index.php/Armind&lt;br /&gt;
&lt;br /&gt;
= Annexe =&lt;br /&gt;
&lt;br /&gt;
== Journal ==&lt;br /&gt;
&lt;br /&gt;
'''Entrée 1'''&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
&lt;br /&gt;
'''Entrée 2'''&lt;br /&gt;
&lt;br /&gt;
Réalisation de l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
'''Entrée 3'''&lt;br /&gt;
&lt;br /&gt;
Installation de Ogre. Nécessite un IDE ainsi qu'un compilateur (Comblock + MinGW pour Windows)&lt;br /&gt;
&lt;br /&gt;
Configuration : Installation de MinGW à la racine de C:/  Installation de Ogre   Installation de Comblock&lt;br /&gt;
Problème pour compiller&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7381</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7381"/>
				<updated>2013-10-14T09:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Moteur 3D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés, dans notre cas, principalement les électrodes C3 C4 et CZ correspondant respectivement aux mouvements de la main droite de la main gauche et des pieds mais aussi les signaux du lobe occipitale correspondant à la vision pour l'utilisation de SSVEP (Steady-State Visual Evoked Potential)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité des objectifs pour l'utilisateur ainsi que la manière d'afficher la complétion de ces objectifs et ses performances. ET configurabilité du mouvement du feedback pour le rendre plus cohérent avec celui de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteurs graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
http://www.worldofleveldesign.com/categories/level_design_tutorials/recommended-game-engines.php&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7346</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7346"/>
				<updated>2013-10-13T21:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Journal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponibles sur le site de l'INRIA mais malheureusement, cela ne nous a pas amené jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique.&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteurs graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7345</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7345"/>
				<updated>2013-10-13T21:25:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Spécifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponible sur le site de l'INRIA mais malheureusement, cela ne nous a pas amener jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaires pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteurs graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7344</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7344"/>
				<updated>2013-10-13T21:24:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Choix d'un moteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponible sur le site de l'INRIA mais malheureusement, cela ne nous a pas amener jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaire pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteurs graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7343</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7343"/>
				<updated>2013-10-13T21:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Moteur Jeux Vidéos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponible sur le site de l'INRIA mais malheureusement, cela ne nous a pas amener jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaire pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteur graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivants sont utilisés par les développeurs de jeux vidéos actuels. Leurs rendus graphiques sont les meilleurs, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissantes pour les mettre en œuvre. De plus, certains sont conçus exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7342</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7342"/>
				<updated>2013-10-13T21:21:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Autres Moteurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponible sur le site de l'INRIA mais malheureusement, cela ne nous a pas amener jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaire pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteur graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivant sont utilisés par les développeurs de jeux vidéos actuel leurs rendus graphiques sont les meilleures, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissante pour les mettre en œuvre. De plus, certain sont conçu exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immenses espaces 3D jusqu'à des planètes entières. Le rendu global est effectivement très joli mais les détails de petits éléments sont assez simplistes. Ce moteur n'est donc pas du tout adapté à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7341</id>
		<title>BCI : Interface Cerveau Ordinateur</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=BCI_:_Interface_Cerveau_Ordinateur&amp;diff=7341"/>
				<updated>2013-10-13T21:20:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectif : ==&lt;br /&gt;
&lt;br /&gt;
Développer une interface cerveau-ordinateur ergonomique et conviviale.&lt;br /&gt;
&lt;br /&gt;
== Description : ==&lt;br /&gt;
&lt;br /&gt;
Ce projet est réalisé en collaboration avec l'équipe du LAGIS. Le but premier est de faciliter la vie des personnes paralysées avec un système interprétant directement leurs signaux cérébraux pour communiquer ou agir avec leur environnement.&lt;br /&gt;
Des applications ont déjà été créées pour permettre à une personne complétement immobile de communiquer.&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes à respecter sont les suivantes : &lt;br /&gt;
&lt;br /&gt;
-Respect et/ou compatibilité avec les technologies utilisées : Compatibilité de l'interface graphique avec OpenVibe. Compatibilité entre l'application et les signaux EEG utilisés (mains gauche et droite et pieds ou SSVEP)&lt;br /&gt;
&lt;br /&gt;
-Grande configurabilité : Ne connaissant pas l'utilisateur qui viendra utiliser le système, il doit être le plus personnalisable possible. Le but est que chacun puisse s'identifier à notre application pour obtenir les meilleurs résultats possibles. Configurabilité de l'interface de &amp;quot;fond&amp;quot; ou du &amp;quot;jeu&amp;quot; ET configurabilité du mouvement du feedback.&lt;br /&gt;
&lt;br /&gt;
-Facilité de configuration : l'utilisateur doit pouvoir changer les options facilement et rapidement.&lt;br /&gt;
&lt;br /&gt;
-Modulation du programme : le code source doit être le plus générique possible, documenté, commenté et le plus facilement modifiable possible.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
&lt;br /&gt;
== Entrée 1 ==&lt;br /&gt;
&lt;br /&gt;
Installation de OpenVibe (en deux fois pour le rendre fonctionnel)&lt;br /&gt;
Suivi du tutoriel 1 proposé sur le site de l'INRIA : http://openvibe.inria.fr/designer-tutorial-1/&lt;br /&gt;
&lt;br /&gt;
== Entrée 2 ==&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement réalisé l'ensemble des tutoriels disponible sur le site de l'INRIA mais malheureusement, cela ne nous a pas amener jusqu'à l'utilisation du VRPN. Nous Projetons maintenant d'étudier les moteurs graphiques 3D existant pour en choisir un pour notre développement.&lt;br /&gt;
&lt;br /&gt;
== Entrée 3 ==&lt;br /&gt;
&lt;br /&gt;
Redéfinition du sujet et précision des spécifications techniques du projet et du moteur graphique&lt;br /&gt;
&lt;br /&gt;
= Étude des différents moteur graphique 3D =&lt;br /&gt;
&lt;br /&gt;
== Spécifications ==&lt;br /&gt;
&lt;br /&gt;
Les contraintes de choix du moteur 3D sont les suivantes par ordre de priorités décroissantes :&lt;br /&gt;
&lt;br /&gt;
-Compatibilité avec le VRPN de Openvibe&lt;br /&gt;
&lt;br /&gt;
-Permettre le développement multiplateforme (Linux, Windows, MacOS)&lt;br /&gt;
&lt;br /&gt;
-Simplicité de développement&lt;br /&gt;
&lt;br /&gt;
-Ressources nécessaire pour le mettre en œuvre minimisées&lt;br /&gt;
&lt;br /&gt;
-Rendu visuel de qualité&lt;br /&gt;
&lt;br /&gt;
== Choix d'un moteur ==&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de la liste de moteur graphiques disponible sur Wikipédia plus quelques autres trouvés grâce à Google&lt;br /&gt;
&lt;br /&gt;
=== Moteurs à Analyser === &lt;br /&gt;
    Twinmotion ! NOVA 2010 ! Id Tech 5 ! NX Engine ! Crystal Space ! Irrlicht ! OGRE ! Unity3D ! Revolution3D ! Truevision3D ! Unigine ! redway3D ! NSRE GX ! JMonkeyEngine ! REA Fox Two&lt;br /&gt;
&lt;br /&gt;
=== Moteur Jeux Vidéos ===&lt;br /&gt;
&lt;br /&gt;
Les moteurs suivant sont utilisés par les développeurs de jeux vidéos actuel leurs rendus graphiques sont les meilleures, donc nous n'avons analysé en premier lieu que leurs autres caractéristiques :&lt;br /&gt;
&lt;br /&gt;
-Anvil (Assassin's Creed)&lt;br /&gt;
&lt;br /&gt;
-CryEngine (Crysis)&lt;br /&gt;
&lt;br /&gt;
-Dunia Engine (Farcry)&lt;br /&gt;
&lt;br /&gt;
-Frostbite (Battlefield)&lt;br /&gt;
&lt;br /&gt;
-Havok (Halo)&lt;br /&gt;
&lt;br /&gt;
-Hero Engine (Star Wars : Old Republic)&lt;br /&gt;
&lt;br /&gt;
-Quest3D (Audiosurf)&lt;br /&gt;
&lt;br /&gt;
-Source (Portal)&lt;br /&gt;
&lt;br /&gt;
-Unreal Engine (Borderlands)&lt;br /&gt;
&lt;br /&gt;
La plupart de ces moteurs sont très performants, ce qui implique l'utilisation de machines suffisamment puissante pour les mettre en œuvre. De plus, certain sont conçu exclusivement pour du développement de jeu pour console de salon. Même si leur complexité de programmation est tout aussi abordable que les autres, nous ne pouvons pas choisir ces derniers.&lt;br /&gt;
&lt;br /&gt;
=== Autres Moteurs ===&lt;br /&gt;
&lt;br /&gt;
-Outerra : Ce moteur permet surtout la génération d'immense espace 3D jusqu'à des planètes entières le rendu global est effectivement très joli mais les détails de petits éléments sont assez simpliste. Ce moteur n'est donc pas du tout adapter à notre projet.&lt;br /&gt;
&lt;br /&gt;
= Gestion de Projet et Sources =&lt;br /&gt;
&lt;br /&gt;
== Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Présentation ===&lt;br /&gt;
&lt;br /&gt;
27/02/2014&lt;br /&gt;
&lt;br /&gt;
== Bibliographie ==&lt;br /&gt;
&lt;br /&gt;
=== OpenVibe ===&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/tag/vrpn/&lt;br /&gt;
&lt;br /&gt;
http://openvibe.inria.fr/documentation-index/#User+Documentation&lt;br /&gt;
&lt;br /&gt;
=== Moteur 3D ===&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Moteur_3D&lt;br /&gt;
&lt;br /&gt;
http://www.outerra.com/forum/index.php?topic=637.0&lt;br /&gt;
&lt;br /&gt;
http://www.ogre3d.fr/&lt;br /&gt;
&lt;br /&gt;
http://jeux.developpez.com/tutoriels/?page=prog-3d#ogre-3d&lt;br /&gt;
&lt;br /&gt;
=== EEG ===&lt;br /&gt;
&lt;br /&gt;
http://openeeg.sourceforge.net/doc/sw/&lt;br /&gt;
&lt;br /&gt;
http://www.emotiv.com/store/app.php&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4431</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4431"/>
				<updated>2013-03-07T09:15:22Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 06/03/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
Apres de multiples test, il n'y a qu'un capteur qui s'avère communiquer en utilisant le protocole I2C.&lt;br /&gt;
Les Ports du NXT ne sont donc pas parallellisés.&lt;br /&gt;
Nous avons donc prévu de repartir de la brique RFID pour creer une nouvelle brique communiquant avec un Microcontroleur.&lt;br /&gt;
Le microcontroleur se fera passer pour esclave du NXT en scrutant le bus et en décodant le message pour renvoyer au NXT l'information d'un des capteurs qui auront été branchés au µC&lt;br /&gt;
&lt;br /&gt;
Nous avons pu récuperer des informations sur la maniere de creer un bloc labview ou mindstorm. Ce sera notre prochain objectif.&lt;br /&gt;
&lt;br /&gt;
Sources:&lt;br /&gt;
Brochage Port Mindstorm : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
Brique RFID http://www.generationrobots.com/capteur-rfid-pour-robot-lego-mindstorms-nxt-codatex,fr,4,Capteur-RFID-NXT.cfm&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 07/03/2013 ==&lt;br /&gt;
'''Partie Arduino:'''&lt;br /&gt;
&lt;br /&gt;
L'Arduino doit être remplacé par un microcontrôleur ATTiny13. Pour créer le circuit, il faut créer un typon sous Altium. Toutefois, certains éléments, comme le microcontrôleur ou la connectique femelle du câble Mindstorm, ne sont pas reconnus par les librairies installées sur Altium : il faudra donc les créer nous-mêmes.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Remplacer l'Arduino par un microcontrolleur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4429</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4429"/>
				<updated>2013-03-06T17:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* To Do : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Remplacer l'Arduino par un microcontrolleur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4419</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4419"/>
				<updated>2013-03-06T15:38:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* To Do : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4418</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4418"/>
				<updated>2013-03-06T15:38:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 06/03/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4417</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4417"/>
				<updated>2013-03-06T15:38:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 04/03/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4416</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4416"/>
				<updated>2013-03-06T15:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 04/03/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
Nous avons réussi à établir le schéma de la structure du câble I2C du Mindstorm :&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 06/03/2013 ==&lt;br /&gt;
'''Partie Arduino :'''&lt;br /&gt;
Il a fallu réaliser un programme sur l'Arduino prenant en compte le protocole suivant :&lt;br /&gt;
&lt;br /&gt;
La brique NXT envoie des messages en I2C ; l'un d'entre eux signifiera qu'il s'adresse à l'Arduino. Quand ce dernier lit ce message précis, il doit attendre que la brique NXT lui envoie un second message contenant un code désignant le capteur dont on désire avoir les informations (on pourra relier des capteurs analogiques sur les broches A0, A1, A2 et A3 ainsi que des capteurs digitaux sur les broches 2 à 12). Grâce à ce dernier code, l'Arduino saura laquelle de ses entrées elle doit lire, et pourra ainsi réceptionner les données générées par le capteur correspondant ; ainsi, les données du capteur pourront être envoyées par l'Arduino en I2C à la brique NXT.&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4400</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4400"/>
				<updated>2013-03-04T17:02:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 27/02/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== 04/03/2013 ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma-cable-i2c.jpg]]&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma-cable-i2c.jpg&amp;diff=4399</id>
		<title>Fichier:Schéma-cable-i2c.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma-cable-i2c.jpg&amp;diff=4399"/>
				<updated>2013-03-04T17:02:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4346</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4346"/>
				<updated>2013-02-28T07:26:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Objectif: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm.&lt;br /&gt;
&lt;br /&gt;
Schéma du montage :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema_Montage.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Schema_Montage.jpg&amp;diff=4345</id>
		<title>Fichier:Schema Montage.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Schema_Montage.jpg&amp;diff=4345"/>
				<updated>2013-02-28T07:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : a téléversé une nouvelle version de « Fichier:Schema Montage.jpg »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Schema_Montage.jpg&amp;diff=4344</id>
		<title>Fichier:Schema Montage.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Schema_Montage.jpg&amp;diff=4344"/>
				<updated>2013-02-28T07:24:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4327</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4327"/>
				<updated>2013-02-27T16:41:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 27/02/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm. &lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvable à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4325</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4325"/>
				<updated>2013-02-27T16:40:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 27/02/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm. &lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip.&lt;br /&gt;
&lt;br /&gt;
Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvalble à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4324</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4324"/>
				<updated>2013-02-27T16:40:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* To Do : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm. &lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip . Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvalble à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4323</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4323"/>
				<updated>2013-02-27T16:40:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm. &lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip . Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvalble à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== To Do : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4322</id>
		<title>Mindstorm</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Mindstorm&amp;diff=4322"/>
				<updated>2013-02-27T16:38:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* Avancement : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Objectif: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concevoir une brique materielle qui fera l'interface entre la brique Mindstorm et les capteurs et actionneurs divers&lt;br /&gt;
&lt;br /&gt;
Développer une brique logicielle utilisable dans l'interface de programmation Labview livrée avec le MindStorm. &lt;br /&gt;
&lt;br /&gt;
== Avancement : ==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Prise en main et test du bus I2C&lt;br /&gt;
&lt;br /&gt;
URL Mindstorm/Arduino : https://sites.google.com/site/mccolganrobotics/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 27/02/2013 ==&lt;br /&gt;
Test de l'accéléromètre par communication I2C avec l'arduino : résultats encourageants, l'arduino reçoit des valeurs correspondant à la position du capteur ainsi qu'à ses mouvements.&lt;br /&gt;
[[Fichier:Infos-serie-accel.png]]&lt;br /&gt;
&lt;br /&gt;
Code utilisé : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Magneto/LSM303_Example.zip . Nous sommes partis de cette exemple et l'avons adapté pour qu'il concorde avec les versions plus récentes de la bibliothèque utilisée.&lt;br /&gt;
Brochage I2C de l'arduino trouvalble à l'adresse : http://arduino.cc/en/Reference/Wire .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objectifs : ==&lt;br /&gt;
'''Matériel : '''&lt;br /&gt;
Faire communiquer l'arduino avec la brique programmable du Mindstorm.&lt;br /&gt;
Brancher plusieurs capteurs I2C sur un seul arduino, et les mettre en oeuvre.&lt;br /&gt;
&lt;br /&gt;
'''Logiciel : '''&lt;br /&gt;
Faire un bloc LabView permettant à l'utilisateur de programmer le robot Mindstorm en fonction des connexions de l'arduino.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Infos-serie-accel.png&amp;diff=4320</id>
		<title>Fichier:Infos-serie-accel.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Infos-serie-accel.png&amp;diff=4320"/>
				<updated>2013-02-27T16:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1974</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1974"/>
				<updated>2012-04-08T17:06:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 3e séance : 04/04/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
*Ecrire le script CGI-BIN pour communiquer avec la LED&lt;br /&gt;
*Tranférer le programme sur la Foxboard&lt;br /&gt;
&lt;br /&gt;
L'application web permet bien de faire varier la couleur de la LED. Le script est donc réussi. L'application, le script, et le démon ont été transmis et compilés sur la Foxboard. Toutefois, la LED ne peut pas encore être modifiée à distance.&lt;br /&gt;
&lt;br /&gt;
== Séance complémentaire : 05/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
*Modifier la LED à distance grâce à la Foxboard&lt;br /&gt;
&lt;br /&gt;
Cette séance a été particulièrement recommandée pour terminer la partie informatique du projet, cela n'ayant pas été possible à la séance précédente à cause de problèmes qui n'avaient alors pas pu être réglés.&lt;br /&gt;
Le problème a finalement été réglé entre la séance précédente et celle-ci. Les fichiers importants (l'application web, les codes source du démon, du script CGI-BIN et leurs exécutables) ont été transférés sur la Foxboard, et la couleur de la LED a pu être pilotée grâce à la Foxboard. La partie informatique du projet est donc terminée.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1893</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1893"/>
				<updated>2012-04-04T11:26:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 3e séance : 04/04/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
*Ecrire le script CGI-BIN pour communiquer avec la LED&lt;br /&gt;
*Tranférer le programme sur la Foxboard&lt;br /&gt;
&lt;br /&gt;
L'application web permet bien de faire varier la couleur de la LED. Le script est donc réussi. L'application, le script, et le démon ont été transmis et compilés sur la Foxboard. Toutefois, la LED ne peut pas encore être modifiée à distance.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1892</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1892"/>
				<updated>2012-04-04T10:49:32Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 3e séance : 04/04/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
*Ecrire le script CGI-BIN pour communiquer avec la LED&lt;br /&gt;
*Tranférer le programme sur la Foxboard&lt;br /&gt;
&lt;br /&gt;
L'application web permet bien de faire varier la couleur de la LED. Le script est donc réussi. L'application, le script, et le démon ont été transmis sur la Foxboard.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1891</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1891"/>
				<updated>2012-04-04T10:28:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 3e séance : 04/04/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
*Ecrire le script CGI-BIN pour communiquer avec la LED&lt;br /&gt;
*Tranférer le programme sur la Foxboard&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1890</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1890"/>
				<updated>2012-04-04T10:25:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 3e séance : 04/04/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;br /&gt;
''' Partie Informatique :''' &lt;br /&gt;
ghd&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1889</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1889"/>
				<updated>2012-04-04T10:25:13Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 2e séance : 28/03/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 3e séance : 04/04/2012 ==&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1834</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1834"/>
				<updated>2012-03-28T10:31:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 2e séance : 28/03/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est réalisé à l'aide d'un compteur. nous n'avons pas encore pu le tester.&lt;br /&gt;
&lt;br /&gt;
== 2e séance : 28/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Générer les couleurs dans l'application web&lt;br /&gt;
&lt;br /&gt;
Il a finalement fallu utiliser 255 nuances pour chaque couleur primaire. La majeure partie de la séance a été utilisée pour faire varier la couleur d'un élément à partir des trois curseurs.&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Finaliser le PWM&lt;br /&gt;
* Simuler et charger un premier montage essai&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM a été réalisé avec un compteur et un comparateur. Tant que la valeur du compteur est inferieure à la valeur choisie le signal reste à 1 (état haut) puis passe au niveau bas pour tout le restant de la pèriode.&lt;br /&gt;
Après avoir tester que le PWM fonctionne (ce qui est le cas), nous avons pu passer à la création de toute la &amp;quot;maquette&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1783</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1783"/>
				<updated>2012-03-21T11:10:28Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 1e séance : 21/03/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
Cette 1e séance m'a permis de me familiariser suffisamment avec javascript pour progresser. J'ai ainsi pu créer des sliders et commencer à les mettre en forme.&lt;br /&gt;
&lt;br /&gt;
Toutefois, il sera difficile d'obtenir 256 couleurs avec les mêmes possibilités de variations d'intensités pour les trois couleurs primaires. Donc, nous avons décidé de faire 216 couleurs, en donnant à chaque couleur primaire la possibilité de connaître 6 variations d'intensité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est à base de compteur. nous n'avons pas encore pu le tester.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1781</id>
		<title>Contrôle LED 256 couleurs, 2011/2012, TD1</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Contr%C3%B4le_LED_256_couleurs,_2011/2012,_TD1&amp;diff=1781"/>
				<updated>2012-03-21T10:52:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tchampag : /* 1e séance : 21/03/2012 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1e séance : 21/03/2012 ==&lt;br /&gt;
&lt;br /&gt;
'''Partie Informatique :'''&lt;br /&gt;
&lt;br /&gt;
Objectif : &lt;br /&gt;
* Se familiariser avec javascript et prototype.js&lt;br /&gt;
* Créer des sliders&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie Electronique'''&lt;br /&gt;
&lt;br /&gt;
Objectifs :&lt;br /&gt;
* Comprendre le sujet&lt;br /&gt;
* Apprendre à connaître les composants de la nanoboard.&lt;br /&gt;
* Débuter la partie FPGA&lt;br /&gt;
&lt;br /&gt;
Cette première scéance n'a pas été très concluante. La majorité du temps a été utilisé pour la compréhension du sujet.&lt;br /&gt;
&lt;br /&gt;
Pour la partie FPGA, nous avons pu décomposer les différentes sous parties à traiter: Les mémoires et le PWM principalement.&lt;br /&gt;
&lt;br /&gt;
Après reflexion, le PWM le plus simple à réaliser dans ce sujet est à base de compteur. nous n'avons pas encore pu le tester.&lt;/div&gt;</summary>
		<author><name>Tchampag</name></author>	</entry>

	</feed>