👋

Ludovic David

PhD-Ingénieur R&D IHM/XR

Ingénieur de développement et d'expérimentations scientifiques

Service d’Expérimentation et de Développement (SED) @ INRIA

détaché auprès des équipes-projets Ilda et Aviz

Expériences

Logo Laboratoire IBISC, Univ. d'Evry, Univ. Paris-Saclay

Chargé de recherche et développement

Laboratoire IBISC

juillet 2020 - juin 2022

Évry, France

Logo Interaction Healthcare Logo Laboratoire IBISC, Univ. d'Evry, Univ. Paris-Saclay

Doctorant CIFRE

Interaction Healthcare / Laboratoire IBISC

octobre 2016 - décembre 2019 · 3 ans 3 mois

Levallois-Perret / Évry, France

Logo Laboratoire IBISC, Univ. d'Evry, Univ. Paris-Saclay

Stagiaire - Équipe IRA2

Laboratoire IBISC

mars 2016 - septembre 2016 · 7 mois

Évry, France

Logo Polytechnique Montréal

Stagiaire - Équipe Ptidej

Polytechnique Montréal

juin 2015 - août 2015 · 3 mois

Montréal, Canada

Logo 909c

Stagiaire - Développeur

909c

juin 2014 - août 2014 · 3 mois

Montreuil, France

Formations

Logo Université Paris-Saclay

Doctorat de philosophie (PhD), Informatique

Université Paris-Saclay

2016 - 2019

Logo Université Paris-Saclay

Master 2, Réalité Virtuelle et Systèmes Intelligents

Université Paris-Saclay

2015 - 2016

Logo Université Paris-Saclay

Ingénieur Informatique, Interactions et collaborations Numériques

ENSIIE

2013 - 2016

DUT Informatique

IUT Montreuil - Université Paris VIII

2012 - 2013

Compétences

  • Analyse des besoins, conception et développement de logiciels
  • Gestion de projet centrée-utilisateur en équipe pluridisciplinaire
  • Veille bibliographique, technique et concurrentielle
  • Conception et mise en place d’un protocole expérimental
  • Analyse de données et publications scientifiques
  • Présentations et communications
  • Rédaction de dossier de financement
    • Crédit d’Impôt Recherche (CIR)
    • Fonds Européen de Développement Régional (FEDER)

Expertises

  • Interaction Homme-Machine
  • Unity3D
  • C#
  • Lua
  • Javascript
  • WebXR
  • Three.js
  • Aframe
  • ARCore
  • Git
  • SteamVR
  • OpenCV
  • Java
  • Python
  • C
  • HTML5
  • CSS3
  • Node.js
  • jQuery
  • Angular
  • React
  • JavaEE
  • PHP5
  • Zend Framework
  • XML (DTD, Schemas, XSLT, XPath)
  • JSON
  • MySQL
  • PostgreSQL
  • IndexedDB
  • UML
  • UX

Technologies

  • Oculus Meta Quest
  • Leap Motion
  • Zed Mini
  • Kinect
  • Myo
  • GearVR
  • Daydream View
  • Mirage Solo
  • ZapBox
  • Oculus Meta Rift
  • HTC Vive
  • Hololens
  • OptiTrack
  • CAVE

Connaissances

  • C++
  • WebGL
  • OpenGL
  • GLSL
  • Vuforia
  • StereoKit
  • Tensorflow
  • Keras
  • R
  • Qt
  • Blender
  • AR.js
  • D3.js
  • OpenStack
  • Gradle
  • OCaml
  • SVN
  • Apache
  • Tomcat
  • Glassfish
  • Unreal Engine
  • Figma
  • UI
  • Sécurité
  • Pathologies Neuro-dégénératives

Publications

2024

2020

2019

2017

Projets

Passionné d’informatique et de technologies innovantes, je mène des développements personnels dans divers domaines pour tester de nouvelles méthodes d’interactions, contourner les limitations des outils actuels, tester diverses architectures, langages et méthodes de programmation ainsi que pour me détendre l’esprit. Je participe aussi à plusieurs communautés liées à l'XR, l'IHM et le Web qui vise à inventer, prototyper et diffuser de nouvelles solutions open-source / libres / Do-It-Yourself (DIY) / P2P / Indie comme alternatives éthiques.

2023

Hackatech Inria Grenoble - NeuroHands (Grand Prix du jury 🎉)

#emg #ia #python #leap-motion

Le projet Neurohands a pour but d’interpréter à l’aide d’apprentissage machine les signaux neuromusculaires (EMG) de l’avant-bras afin de reconstituer numériquement les mouvements de la main. Cette méthode d’interaction peut alors être utilisée dans de nombreux domaines comme la santé, à travers le pilotage de prothèse robotisée ou de fauteuil roulant, ou de faciliter et rendre plus naturelles les interactions avec le numérique au quotidien.

2022

MetaHack : une librarie basée sur WebRTC pour Unity et WebXR

#webrtc #unity #web #webxr

Développé dans le cadre de Hacking the Hack (HTH), la session à distance du MIT Reality Hack (MRH), l'idée du projet est de renforcer l'interopérabilité des expériences XR comme première brique du "metavers". Contrairement au MRH, l'HTH n'était pas compétitif et se concentrait sur le futur des hackathons. Le premier thème Hybrid Hacks avait pour objectif de trouver des idées pour améliorer l'aspect hybrid des futurs hackathons. Le deuxième thème A Collaborative Metaverse of Hacks avait pour objectif de permettre aux différents projets de pouvoir intéragir les uns avec les autres. Mon idée était donc de fournir une librarie commune qui permette une communication inter-projets. Malheureusement, j'ai mis un jour de trop à résoudre les bugs côté Unity et la librairie n'a pas eu le temps d'être intégrée dans les projets. Cependant, compte-tenu de son potentiel, je pense continuer à la développer pour qu'elle puisse être utilisée dans les futurs hackthons et projets XR (voir même juste Unity/Web)..

Lambda : Réseau Social P2P Local-First

#web #p2p #crypto-security #local-first #social-network #webrtc

Partisans de l’IndieWeb, j’ai voulu développer un réseau social local-first p2p adapté du protocole Secure Scuttlebutt. L’idée principale est que les données des utilisateurs sont signées et dupliquées entre chaque pair dans un cercle restreint. Les communications sont sécurisées et directes. Il faut donc que les utilisateurs soient connectés au même moment pour se synchroniser, mais ça ne les empêche pas de consulter plus tard ou de publier hors-ligne. Dans l'idéal, l'objectif est de poursuivre le même principe avec WebXR : un local-first cyberspace.

2021

[En cours] NeuroXR : Suivi de doigts par EMG

#unity #myo #python #ihm #machine-learning #tensorflow #leap-motion #quest

Ce projet de suivi de doigts par EMG grâce au Myo me tient particulièrement à coeur et est loin d’être terminé. En début de thèse, j’avais vu les premiers travaux de CTRL.Labs et tenté de les reproduire dans Unity avec ML-Agents et le Myo du laboratoire car je pensais déjà à la pertinence de ces travaux dans le cadre de la rééducation post-AVC et du contrôle de prothèse de bras robotisée. Cependant, si je comprenais les bases de l’apprentissage machine (ML), j’étais loin de savoir comment faire. C’est en 2021 que j’ai recommencé à travailler sur cette idée en contribuant de manière open-source à pyomyo et NeuroLeap, travaux initiés par @PerlinWarp. Nous sommes convaincu que c’est le futur de l’Interaction Homme-Machine (IHM) et l’objectif est de permettre à la communauté d’être indépendante de Facebook Meta, qui a racheté CTRL.Labs, possède les brevets de Myo, et qui devrait sortir d’ici peu un bracelet EMG pour interagir en XR. Malheureusement, l’entreprise ne fait pas cela par compassion. Les signaux EMG sont une des meilleures manières d’identifier un individu (fingerprinting). Le modèle économique étant basé sur la publicité ciblée, on peut rapidement imaginer les dérives du géant américain. Une partie du groupe NeuroXR tente donc de développer du matériel DIY (Do-It-Yourself) car Myo n’est plus commercialisé et les alternatives restent peu nombreuses, tandis que l’autre partie s’occupe de développer du logiciel pour permettre le décodage des signaux électriques de l'activité musculaire des doigts. Je ne suis pas spécialiste de ML, mais j’ai commencé à m’y mettre avec Python et Tensorflow. De plus, malgré ses imperfections, le Leap Motion permet de constituer rapidement une base de données pour faire le lien entre signaux EMG et mouvements des doigts.

2020

Leap Motion et Zed Mini comme caméra passthrough pour Oculus Meta Quest

#unity #leap-motion #quest #ar #passthrough #android

Pour contourner les limitations de l’API passthrough qui n’était alors pas encore disponible en 2019, j’ai commencé par connecter un Leap Motion directement au Quest en tant que caméra UVC. Bien que difficilement accessible dans Unity grâce à un plugin qu’il a fallu étendre pour supporter le format un peu spécial YUYV interlacé mis à disposition par Leap Motion, il m’a ensuite suffi de distordre et d’afficher l’image de chaque caméra à chaque oeil pour permettre le passthrough. Cependant, plusieurs aspects restent insatisfaisants, notamment à cause du problème d’alignement. Pour simplifier, la position du Leap Motion et l’écart entre les caméras sont différents de la position des yeux et l’écart des yeux, ce qui génère une adaptation légèrement gênante de notre vision. J’ai par la suite fait l’acquisition d’une Zed Mini (caméra stéréoscopique couleur) et ai retenter l’expérimentation. Cependant, je n’ai pas entièrement réussi à faire du passthrough avec car il y a un problème d’images par secondes (framerate). Toutes les ~5 secondes, l’image récupérée de la caméra appliquée à une texture dans Unity freeze. Cela ne semble pas être en rapport à un problème de mémoire ni de ramasse-miettes (garbage collection), mais pourrait être lié à une librairie interne au plugin qui n’est pas mise à jour pour l’USB3.0. N’étant pas entièrement à l’aise avec le développement Android de plugin AAR et l’API passthrough d’Oculus Meta étant sortie, j’ai mis le projet en pause. Maintenant que le casque Lynx a été annoncé, j'utilise la Zed Mini avec un PC, SteamVR, Unity et OpenCV pour expérimenter en réalité augmentée.

Tsks : Gestion de tâches

#web #js #remote-storage

Depuis toujours, je recherche des applications qui permettent d’améliorer la productivité, la prise de notes et plus globalement la gestion de projet. Une des applications dont j’ai trouvé l’UI/UX très plaisante est Google Keep. Cependant, j’aime l’idée de commencer à s’émanciper des GAFAM, et notamment Google et ses produits. Je voulais faire une application web dans laquelle les données pouvaient être stockée à l’endroit où l’utilisateur le souhaite, et dans mon cadre, à domicile. J’ai donc opté pour RemoteStorage, une librairie qui permet de synchroniser ses données avec un serveur que peut choisir l’utilisateur à travers un protocole spécifique.

Leap Motion Remote Unity

#unity #leap-motion #network #websockets #quaternions

Afin d'aider un utilisateur du Leap Motion (LM) qui avaient exposé ses problèmes sur le forum de LM, j'ai apporté quelques modifications au Leap Motion Unity Core Plugin pour faciliter son utilisation à distance. J'ai tout simplement ajouté une libraire C# de Websocket pour se connecter au serveur déjà déployé par LM qui sont normalement utilisés par Leap.js. Ensuite, il a fallu reconvertir les données json pour qu'elles correspondent aux structures C#, et notamment reconstituer les quaternions à partir des bases.

2019

Leap Motion (LM) sur Oculus Meta Quest avec PC distant

#unity #leap-motion #quest #hand-tracking

Avant que le suivi de main soit disponible sur Quest, j’avais connecté un Leap Motion directement au casque autonome. Comme le LM ne dispose pas de SDK compatible Android, il a fallu utiliser l’application VirtualHere qui permet d’utiliser des appareils USB sur le réseau comme s'ils étaient connectés en local. Installé sur le casque (pour rappel sous Android) et un PC, connecté par Wifi (5GHz pour une latence minimale), le LM est fonctionnel sur le PC comme s'il était branché en local. Ensuite, il suffit de récupérer les données du LM via le serveur websocket déjà déployé sur le PC dans une expérience WebXR sur Quest en l’occurence basé sur Aframe.

UNIJAM

#game-jam #ensiie #tsp

Lors de mes études, j'ai participé à une game jam de 48h dont le thème était "I have a dream!" dans laquelle nous avons remporté 2 prix : le stick adhésif (meilleur gameplay) et le coup de coeur du public.

AirCodea : AirCode de Codea dans Codea

#codea #lua #aircode #expresslua

Codea dispose d'une fonctionnalité nommée AirCode qui permet d'éditer son code dans un navigateur web et de hot-reload le projet à chaque modification. Comme à mon habitude, dès qu'un système ne me satisfait pas entièrement, je le reconstruis. J'ai donc utilisé ma librairie de serveur web en lua, expressjs, ainsi que le monaco editor. J'implémente cette fois-ci un véritable hot-reload qui permet de conserver l'état du projet malgré le rechargement d'une partie du code. Je me heurte cependant à quelques problèmes, notamment le fait de devoir redévelopper des fonctions Codea qui sont par défaut liée au projet dans lequel elles sont utilisées. Je n'ai jamais terminé de reconstruire l'entièreté de la sandbox viable.

ExpressLua : Comme Express de Node.js mais en Lua

#codea #lua #express

Pour permettre de faciliter la communication entre mes projets dans Codea et d'autres projets web, natifs et XR. Je redéveloppe un serveur web simple en Lua basé sur les coroutines. Celui-ci sera d'ailleurs utilisé dans AirCodea.

2018

Webvrse : WebVR Experiment pour le Medieval Fantasy Experience Challenge de Mozilla

#webvr #webrtc #aframe #social

Avant la sortie de Mozilla Hubs, les briques logicielles étaient déjà réunis et j’avais mis en place sur glitch.com un site qui permettait de déployer un environnement virtuel persistant et social (avatar et voix via WebRTC) codé avec Aframe. La spécificité était qu’un responsable (master) pouvait via son PC modifier la scène en temps réel et ajouter des objets juste par drag&drop d’objets disponibles sur poly.google.com et sketchfab.com dans l’Aframe inspector. Il était aussi possible de visiter les environnements sans l’aspect social.

Utilisation de l’API ARCore pour le suivi 6dof en VR sur smartphone

#android #arcore #6dof #vr

En 2018, les seuls casques que je possédais étaient un Samsung Gear VR et un (Google) Daydream View que j’utilisais avec mon Samsung S8 (premier téléphone qui était compatible VR/AR, qui est encore celui que j’utilise en 2022 !). Mais ayant eu l’occasion de tester une CAVE et un peu plus tard l’HTC Vive, je souhaitais avoir accès à de la 6dof. Grâce à l’API ARCore, c’est devenu possible. Cependant, les ressources demandées au smartphone (double rendu VR + SLAM propriétaire avec ARCore) sont assez élevées, ce qui n’est pas idéal.

2017

Leap Motion Multijoueurs

#unity #leap-motion #network #unet #hlapi

Premiers tests d'interactions à distance avec des Leap Motion et découverte de la High Level API réseau de Unity maintenant tombée en désuétude pour que sorte en 2021-2022 Netcode for GameObjects (toujours en développement au moment où j'écris ces lignes...).

2016

Controller Emulator pour iOS

#vr #ios #controller #3dof #daydream

Avant d’avoir un Daydream View de Google, je voulais commencer à développer des applications de réalité virtuelle et n’ayant pas de deuxième téléphone sous Android pour utiliser le Controller Emulator proposé par Google, je l’ai redéveloppé sous Unity pour pouvoir l’utiliser sur un vieux Iphone 4. La difficulté majeure était de faire de la rétro-ingénierie de la communication réseau, mais avec Wireshark et un peu de patience plus un carnet de note, rien n’est impossible. De plus, l’Iphone 4 n’étant pas très puissant, il a fallu faire un peu d’optimisation mémoire pour éviter l’allocation du ramasse-miettes (garbage collector).

VRIKEA - Projet de fin d’école d’ingénieur

#vr #oculus-dk2 #phone-controller #cardboard

Nous avons développé une application d'aménagement de cuisine en réalité virtuelle réalisée dans le cadre de la filière Jeux Vidéos, Interactions et Collaborations Numériques (JIN) en partenariat avec Telecom SudParis et l’ENSIIE. A l’époque, nous développons sur Unity pour l’Oculus DK2 et Cardboard. Pour pallier au problème du contrôle de l’application, nous utilisons un smartphone comme manette (télécommande) 3dof tactile. Ce n’est que quelques mois plus tard que nous verrons apparaître les manettes 3dof pour les casques Samsung Gear VR et Daydream View de Google (et d’autres par la suite comme le Mirage Solo de Lenovo/Google). Nous avons eu l'opportunité de faire deux présentations du projet directement à IKEA.

2015

LAVAL VIRTUAL - Concours « Virtual Fantasy » catégorie « Temps limité »

#vr #oculus-dk2 #unity #game-jam

Avec l'association de réalité de virtuelle de l'ENSIIE nommée RealitIIE, nous participons pour la deuxième année consécutive au concours de RV de Laval Virtual. Cette année, l'objet mystère de mon équipe est un jardin zen. Contrairement à 2014, je suis plus expérimenté et prends le rôle de lead dev. Cependant, le matériel (oculus dk2), nos connaissances UX et en optimisation pour la VR sont encore limités et notre expérience suscite un peu de cybermalaise...

Required : Gestion des dépendances dans Codea

#codea #dependencies #lua #gist

Dans Codea, il est possible de préciser que d'autres projets installés en local doivent être chargé avant le projet principal comme dépendance. Afin de faciliter les collaborations et la gestion de version, j'avais développé Required qui permet à la fois de publier ses projets sur Gist (de Github) mais aussi de charger des projets sur Gist comme dépendances, comme dans le web ou il suffit de mettre dans la section head un lien vers une librairie javascript.

2014

LAVAL VIRTUAL - Concours « Virtual Fantasy » catégorie « Temps limité »

#vr #oculus-dk1 #kinect #unity #game-jam

Première compétition à base de réalité virtuelle à laquelle j'ai eu l'occasion de participer. Suite à mon DUT, j'avais de solides bases en programmation qui m'ont rapidement permis de prendre en main unity et de contribuer à cette compétition lors de ma première année d'école d'ingénieur. Notre objet mystère : un rongeur volant !

Codeaception : Codea dans Codea

#codea #meta #ide #lua

Codea est un IDE sur iPad avec des fonctionnalités semblables à Processing. Comme celui-ci n'était pas extensible, j'avais commencé à le recréer, mais dans celui-ci. J'ai donc commencé par coder un visualiseur de code, dans lequel le code est parsé pour obtenir de la coloration syntaxique. De plus, grâce à la programmation meta, je pouvais lancer des projets dans le codea dans codea. J'ai malheureusement arrêté le projet avant de passer à l'édition de texte.

SyncCodea : Synchronisation de projets Codea via Dropbox

#codea #lua #dropbox #api #rest

Ce projet permet de synchroniser des projets entre Codea et Dropbox. En particulier, lorsque le projet est modifié, par exemple sur un pc avec le dossier synchroniser dropbox, SyncCodea le détecte, télécharge les modifications et relance le projet.

2013

API Github et Dropbox

#codea #lua #github #gist #dropbox #api #rest

A cette époque, je développe sur iPad via Codea (une IDE avec des fonctionnalités semblables à Processing). Codea intègre un outil de synchronisation des projets via Dropbox, mais à l'époque, celui-ci n'est pas encore stable. Je commence alors à le développer (il deviendra SyncCodea en 2014), et pour ce faire, il me faut comprendre et accéder à l'api dropbox en Lua. Pendant les développements, j'en profite aussi pour m'attaquer à l'api de Github pour faciliter la gestion de version. L'année d'après, je mets à jour GithubAPI (qui dans mes souvenirs avait changé de méthode d'authentification avec OAuth2.0).