Archive

Archive for the ‘Uncategorized’ Category

iSketchnote KickStarter

Dans le cadre des technologies innovantes, nous avons eu l’opportunité chez Sensorit de collaborer avec une équipe très enthousiaste du CEA de Grenoble qui développe une technologie très prometteuse.

Ils ont mis au point un système qui permet d’équiper un stylo tout à fait banal afin d’en capturer les tracés numériquement. Nous avons eu la chance de tester cette technologie qui est très précise, extrèmement rapide et surtout passive (pas d’équipement électronique dans le stylo). Nous parlons donc de technologie grand public, très simple et bas coût.

Si les domaines d’exploitation sont vastes, la première application qui a été retenue pour le lancement de leur kickStarter est un digitaliseur pour tablette.

Le système est ultra simple, vous écrivez/dessinez sur un vrai bloc note clippé sur l’étui de la tablette. Une application dédiée capture vos tracés en temps réel. Idéal pour sketcher tout en ayant le vrai ressenti de l’écriture !

Si vous voulez participer voici le lien du kickStarter: http://kck.st/16gJmjv

Publicités
Catégories :Uncategorized

Techdays 2013, coding4fun : au delà du z-order…

15/02/2013 2 commentaires

Bonjour à tous,

Comme chaque année, ce fut un grand plaisir de participer à la session coding4fun avec mes anciens collègues de Microsoft. Cette fois-ci je vous ai proposé une solution pour résoudre une problématique de z-order complexe. Quelle que soit la technologie d’affichage, traditionnellement le z-order (ou z-index) est résolu par l’ordre de dessin. Il arrive parfois que l’on veuille afficher différents éléments avec une logique plus complexe.

image

ex: un diaphragme d’appareil photo.

J’ai donc mis en place un manager qui permet de définir des associations de superposition multiples entre contrôles, y compris si ces associations finissent par être circulaires. ( A > B > C > A).

 

image

Pour ce faire, j’ai mis en place un système de recalcul dynamique du clipping des éléments afin de respecter mes règles de superposition. Chaque élément est clipé par l’ensemble de ceux qui le superposent. Afin de calculer la géométrie de clipping, je commence par translater l’ensemble des géométries des éléments dans un repère commun afin de calculer leurs intersections potentielles. La géométrie résultante est retranslaté dans le repère du controle et lui est appliquée en tant que zone de clip.

 

public class ZOrderManager
{
    public ZOrderManager()
    {
        shapes = new Dictionary<Shape, List<Shape>>();
    }

    private Dictionary<Shape, List<Shape>> shapes;

    public void IsOver(Shape foreground, Shape background)
    {
        List<Shape> children = null;
        if (shapes.TryGetValue(background, out children))
            children.Add(foreground);
        else
        {
            children = new List<Shape>();
            children.Add(foreground);
            shapes.Add(background, children);
        }
    }

    public void UpdateClipping(UIElement relativeTo)
    {
        foreach (var element in shapes)
        {
            var geom = GetRelativeGeometry(element.Key, relativeTo);
            var clip =
                element.Value.Select(s => GetRelativeGeometry(s, relativeTo))
                    .Aggregate(geom, (acc, g) =>
                        Geometry.Combine(acc, g, 
                            GeometryCombineMode.Exclude, null));
            var trans = element.Key.TransformToAncestor(relativeTo).Inverse;
            element.Key.Clip =
                Geometry.Combine(clip, Geometry.Empty, 
                    GeometryCombineMode.Union, (Transform) trans);
        }
    }

    private Geometry GetRelativeGeometry(Shape shape, UIElement relativeTo)
    {
        var trans = shape.TransformToAncestor(relativeTo);
        return Geometry.Combine(shape.RenderedGeometry, Geometry.Empty,
            GeometryCombineMode.Union, (Transform) trans);
    }
}

On peut voir ici que chaque controle est clipé permettant d’obtenir un résultat impossible à avoir juste en jouant avec l’ordre de dessin.

image
J’ai également implémenté le pseudo diaphragme en utilisant la même solution.

image
Vous trouverez ici les sources de la solution: http://sdrv.ms/11KQSCX

Qques liens vers les autres démos de la session coding4fun:

Démos de David Catuhe

Démos de David Rousset

Mitsu

Catégories :Uncategorized

Lissage: OneEuroFilter, implémentation en C# et F#

Dès lors que vous développez avec des capteurs, il se peut que le signal renvoyé ne soit pas stable ou bruité et que vous ayez à le lisser afin d’en faciliter l’exploitation. Kinect par exemple est basé sur des caméras et c’est une source qui vibre par nature. A contrario, une souris renvoie un signal stable (aucune perturbation si vous n’y touchez pas par exemple).

Si comme pour moi, le traitement du signal est plutôt un souvenir d’école, voici quelques rappels.

Tout bon informaticien ayant à lisser une série de données utilise le plus souvent le calcul d’une moyenne mobile. Pour faire simple, vous allez remplacer chaque valeur de la série par la moyenne des valeurs qui l’entourent. Ce système fonctionne mais a plusieurs défauts:

– le filtrage exploite la liste des “n” dernières valeurs sur lesquelles il faut itérer et que vous devez maintenir.

– ce système génère de la latence. La courbe sera certes lissée mais les données proches du signal d’origine arriveront plus tard dans le temps.

– la moyenne de la série est conservée mais l’écart type est diminué.

http://fr.wikipedia.org/wiki/Moyenne_mobile

D’autres filtres plus complexes offrent un paramétrage plus riche qui vous permet de mieux adapter leur comportement suivant la nature de vos données.

Parmi eux, les filtres exponentiels sont simples et couramment utilisés.

http://en.wikipedia.org/wiki/Exponential_smoothing

Dans un filtre à moyenne mobile, les valeurs les plus éloignées de l’historique “valent” autant que la dernière valeur enregistrée. Les filtres à exponentiel font décroitre de manière exponentielle le poids des valeurs selon leur éloignement dans le temps. Ces filtres lissent les données mais offrent également un comportement prédictif.

Il existe beaucoup de systèmes de filtrage plus ou moins complexes à mettre en oeuvre et offrant plus ou moins de paramètres d’entrée.

Une équipe de chercheurs de l’INRIA de Lille avec qui nous avons l’occasion d’échanger dans le domaine des intéractions vient de publier un nouveau type de filtre que nous avons utilisé au sein des projets de Sensorit, notamment avec Kinect.

L’avantage de ce filtre est principalement sa simplicité d’utilisation avec deux paramètres d’entrée permettant de lisser puis de contrer la latence.

Tous les détails ici: CHI 2012 paper (PDF)

ainsi qu’une vidéo:

 

et une page exposant l’algorithme et des implémentations dans différents langages: http://www.lifl.fr/~casiez/1euro/

Ci-dessous, une démonstration illustrant l’usage de ce filtre sur une série de données fictive.

Vous trouverez une version de l’algorithme en C# et en F# ainsi qu’un fichier zip avec l’ensemble de la solution.

 

image

 

 

C#
public class OneEuroFilter
{
    public OneEuroFilter(double minCutoff, double beta)
    {
        firstTime = true;
        this.minCutoff = minCutoff;
        this.beta = beta;

        xFilt = new LowpassFilter();
        dxFilt = new LowpassFilter();
        dcutoff = 1;
    }

    protected bool firstTime;
    protected double minCutoff;
    protected double beta;
    protected LowpassFilter xFilt;
    protected LowpassFilter dxFilt;
    protected double dcutoff;

    public double MinCutoff
    {
        get { return minCutoff; }
        set { minCutoff = value; }
    }

    public double Beta
    {
        get { return beta; }
        set { beta = value; }
    }

    public double Filter(double x, double rate)
    {
        double dx = firstTime ? 0 : (x – xFilt.Last()) * rate;
        if (firstTime)
        {
            firstTime = false;
        }

        var edx = dxFilt.Filter(dx, Alpha(rate, dcutoff));
        var cutoff = minCutoff + beta * Math.Abs(edx);

        return xFilt.Filter(x, Alpha(rate, cutoff));
    }

    protected double Alpha(double rate, double cutoff)
    {
        var tau = 1.0 / (2 * Math.PI * cutoff);
        var te = 1.0 / rate;
        return 1.0 / (1.0 + tau / te);
    }
}

public class LowpassFilter
{
    public LowpassFilter()
    {
        firstTime = true;
    }

    protected bool firstTime;
    protected double hatXPrev;

    public double Last()
    {
        return hatXPrev;
    }

    public double Filter(double x, double alpha)
    {
        double hatX = 0;
        if (firstTime)
        {
            firstTime = false;
            hatX = x;
        }
        else
            hatX = alpha * x + (1 – alpha) * hatXPrev;

        hatXPrev = hatX;

        return hatX;
    }
}

 

F#
type LowpassFilter() =
    let mutable firstTime = true
    let mutable hatXPrev = 0.0
    member v.Last() = hatXPrev
    member v.Filter(x:float, alpha:float) =
        let mutable hatX = 0
        let hatX =
            if firstTime then
                firstTime <- false
                x
            else
                alpha * x + (1.0 – alpha) * hatXPrev
        hatXPrev <- hatX
        hatX

type OneEuroFilter(minCutoff:float, beta:float) =
    let mutable firstTime = true
    let xFilt = new LowpassFilter()
    let dxFilt = new LowpassFilter()
    let mutable dcutoff = 1.0

    let mutable _minCutoff = minCutoff
    let mutable _beta = beta

    member v.MinCutoff
        with get () = _minCutoff
        and set (value) = _minCutoff <- value

    member v.Beta
        with get () = _beta
        and set (value) = _beta <- value

    member v.Filter(x:float, rate:float) =
        let Alpha rate cutoff =
            let tau = 1.0 / (2.0 * Math.PI * cutoff)
            let te = 1.0 / rate
            1.0 / (1.0 + tau / te)
        let dx = if firstTime then 0.0 else (x – xFilt.Last()) * rate
        if firstTime then firstTime <- false
        let edx = dxFilt.Filter(dx, Alpha rate dcutoff)
        let cutoff = minCutoff + beta * Math.Abs(edx)
        xFilt.Filter(x, Alpha rate cutoff)

https://skydrive.live.com/embed?cid=7BD91AE7F5096B79&resid=7BD91AE7F5096B79%21207&authkey=AKqZ6OuAtDXOFE8

Catégories :Kinect, Uncategorized

Webcasts de mes sessions Techdays 2012

Les webcasts sont disponibles !

Pour rappel j’avais précédemment fourni les sources des démos ici.

Vous trouverez ici ma session sur C# avancé, ainsi que la session Kinect Effect.

 

Bon visionnage à tous !

Catégories :Uncategorized Étiquettes : ,

Techdays 2012 : démos C# avancé et coding4fun

08/02/2012 8 commentaires

Bonjour à tous,

Ce fut un très grand plaisir de participer encore un fois aux Techdays. Il a eu bien sûr Coding4Fun mais aussi C# avancé qui fut un grand moment. Je n’ai pas posté beaucoup depuis que j’ai ouvert ce blog à part quelques articles sur Kinect ici et , c’était donc  très sympa de repartager à nouveau avec vous.

A noter que des solutions comme le canvas infini et le framework de navigation basé sur async proviennent de réels projets développés dans le cadre de Sensorit. (je dis ça pour les taquins qui disent que je ne code que des démos !)

 

  • C# avancé : dont le principal sujet a été l’écriture d’un petite framework de navigation basé sur Async et permettant de centraliser tous les efforts de navigation à un seul endroit ou comment faire tenir toute une application dans le Loaded Smile

image

 

  • Coding4Fun

Le Canvas infini dont voici un screenshot hyper parlant !!

image

 

Et Arkanoid dans l’éditeur de code Wpf de Visual Studio, l’année prochaine ça va être vraiment très dur d’en faire un nouveau !

image

 

Pour ceux qui ont raté ou veulent revoir Coding4Fun la session est déjà en ligne car elle était diffusé en live: http://tdtv.microsoft.fr/j1/Live.aspx#fbid=t6BuyaYrGlX (dernier repère de la timeline)

Voici intégralité des sources dans un dossier skydrive.

Mitsu

Catégories :Uncategorized Étiquettes : ,

Offre de stage

Bonjour à tous,

Sensorit, société spécialisée dans le développement d’interactions naturelles, recherche stagiaire en développement.

La durée est de 11 mois dès que possible mais vous pouvez postuler pour une durée inférieure.

Le stage porte sur le développement de dispositifs divers et variés avec l’équipe Sensorit.

Technologies utilisées : WPF/Silverlight/ Xaml, .Net, C#.

Des connaissances sur Kinect, Html5 ou Windows phone 7 sont des plus, Windows 8 sera surement de la partie.

Merci de me contacter directement.

Mitsuru FURUTA – cto Sensorit
mitsufu@sensorit.fr

Catégories :Uncategorized

Au revoir Microsoft…

Spectateurs

Je ne sais pas trop par où commencer…

Le 3 mars 2003, je rejoins Microsoft France pour un poste de relations techniques avec les développeurs et l’ambition de faire adopter la plate-forme .Net au plus grand nombre. Je ne suis jamais allé à une conférence Microsoft de ma vie. A l’époque, les blogs n’existent pas, les réseaux sociaux non plus. Nous écrivons des articles sur msdn et nous parcourons la France plusieurs fois par an pour présenter les nouveautés. L’évènement annuel majeur rassemblant les développeurs s’appelle alors les DevDays.

8 ans plus tard, j’ai beaucoup appris sur l’évènementiel, sur la communication, sur Microsoft et évidemment sur .Net. Les années se sont succédées à vitesse grand V, toutes différentes, au rythme des versions de produit.

La technologie est une passion que j’ai adoré partager avec vous. J’ai rencontré un nombre incroyable de développeurs, de partenaires, de clients. J’ai participé et organisé bon nombre de conférences, enregistré des heures de webcasts, animé des quizz sur mon blog !
Les mercredis du développement, les sessions C# ou encore Coding for fun, les Msdays, les évènements partenaires et les fêtes qui suivaient sont tout autant de souvenirs incroyables que j’ai pu partager avec vous tous et je vous en remercie.

De manière plus personnelle mon plus grand souvenir restera surement d’avoir eu l’occasion d’écrire quelques lignes de code dans le version 3.5 du framework .Net lors d’une mission à Corp.

Je ne peux partir sans faire un clin d’oeil aux partenaires et communautés que j’ai cotoyés: Nicolas Clerc, Rédo, Bernard et Christine, David et Yann de Bewise, Michel Perfetti, les Mvps ou encore certains que j’ai connus étudiants comme Thomas, Simon, Johanna.

C’est aujourd’hui vers un nouveau défi que je me tourne. Je rejoins mon ami de longue date Dick Lantim que vous connaissez peut-être, pour une nouvelle aventure technologique et humaine à laquelle je n’ai pas su résister.
La société s’appelle Sensorit et est spécialisée dans les interactions numériques disruptives.

Mercredi dernier (15 décembre) j’animais ma dernière conférence en tant que microsoftee sur la programmation asynchrone aux cotés de Bruno Boucard.
J’animerai tout de même 4 sessions au prochain TechDays parisien de février.

Merci pour tout, à bientôt et au plaisir de vous recroiser sur ce nouveau blog ou ailleurs.

Mitsu

mailto://mitsufu@sensorit.fr/
http://twitter.com/mitsufu
https://mitsufu.wordpress.com/

Catégories :Uncategorized