VRPN Dev

Un article de OpenMASKWiki.

Jump to: navigation, search

Un plugin VRPN pour OpenMASK 4

Sommaire

Introduction

VRPN

VRPN (Virtual Reality Peripheral Network) est un service (gratuit et OpenSource) d'abstraction des périphériques de réalité virtuelle. VRPN fournit une interface homogène pour une large palette de périphériques avec un accès fiable, transparent au réseau et à faible latence.
VRPN est basé sur une architecture Client-Serveur. Le serveur est fourni par le réalisateur du périphérique.
L'abstraction n'est pas faite autour de classes de périphériques mais autour de classes de fonctions. Actuellement la liste des classes est :

  • Tracker : positions, vitesses et accélérations
  • Button : appui/relâche d'un ou plusieurs boutons
  • Analog : valeurs continues
  • Dial : rotations incrémentales
  • ForceDevice : surfaces et champs de force en 3D

Un périphérique peut proposer plusieurs classes mais toutes sont accessibles via une seule connexion. L'exemple typique est le périphérique haptique qui exporte Tracker, Button et ForceDevice
Un périphérique peut éventuellement exporter plusieurs interfaces.
Les messages non traitables sont simplement ignorés par le serveur.
Le système laisse la possibilité de définir des messages dédiés à des périphériques spécifiques qui ne perturberont pas le fonctionnement général. Cela peut être utilisé pour une phase de calibrage par exemple.
Un mécanisme d'affichage de messages d'information sur le fonctionnement d u système VRPN tient en permamence l'utilisateur au courant de l'évolution du système.
Un service d'archivage et éventuellement de rejeu des données transmises par le serveur est disponible.
VRPN propose différent niveaux de service pour la livraison des messages, ainsi qu'une datation de ces messages.

La communauté VRPN propose un serveur sachant gérer tous les périphériques connus par cette communauté (vrpn_server). Il est configurable via un fichier déclarant le type de périphérique a gérer.

VRPN dans OpenMASK

OpenMASK est utilisateur de périphériques. Il est donc client d'un serveur VRPN. Plusieurs clients à un ou plusieurs serveurs peuvent cohabiter dans une application OMK.
L'objectif est de proposer un ensemble de classes ESO qui permet soit la réutilisation de clients VRPN existants , soit la définition rapide de nouveaux clients.

Historique du développement

OpenMASK 3 disposait d'un module de gestion d'un client VRPN pour OpenMASK. Un portage a été réalisé pour adapter ces classes à la nouvelle API OpenMASK 4.

Plugin OMK VRPN

Installation de VRPN

Nous proposons avec le source de notre plugin, un fichier zip de vrpn_7_30 qui à sa compilation fournit une lib en debug et une en release. La lib en debug est nécessaire si on veut une application en debug d'OpenMASK.

Test de l'installation VRPN

Vous pouvez tester votre installation VRPN juste avec votre souris.

  • Editer le fichier vrpn.cfg
dé-commenter la ligne 
#vrpn_Mouse	Mouse0
  • Lancer le serveur vrpn dans une console
C:\vrpn_07_30\bin\bin>vrpn_server.exe -f C:\vrpn_07_30\bin\etc\vrpn-AC.cfg
  • Lancer l'application de trace dans une autre console, avec le paramètre Mouse0
C:\vrpn_07_30\bin\bin>vrpn_print_devices.exe Mouse0@localhost

vous aurez une trace des valeurs x,y de la souris en continu, ainsi que l'utilisation des boutons.

Lancement des serveurs VRPN

Avant de lancer votre application, vous devez lancer le ou les serveurs vrpn des périphériques dont vous avez besoin. Les serveurs doivent s'exécuter sur des machines accessibles sur votre réseau. Pour chaque serveur, il faut configurer le fichier vrpn.cfg associé.

vrpn_server.exe -f vrpn-adhoc.cfg

Architecture du plugin

Ce plugin Vrpn est actuellement articulé autour d'une classe abstraite pour tout client Vrpn dans OpenMASK -AbstractVrpnPeriphericOSO, et d'un client générique. De nombreux cas d'usage de périphérique vrpn peuvent se traiter sans programmation par une configuration adhoc du client générique. Pour les cas particulier, vous pourrez toujours programmer un nouveau client spécifique au dessus de la classe abstraite.
Le plugin propose actuellement une spécialisation de cette classe et deux utilitaires d'interface avec les OSO :

  • un client générique : GenericVRPNClient
  • un utilitaire de transformation de trois flux analogiques et un flux de type OMK:Type:Transform : VrpnAnalogToTransform
  • un utilitaire qui fait suivre l'usage d'un bouton sous forme d'un évènement de type clavier : VrpnButtonToKey

Vous y trouvez également les trois fichiers qui définissent le plugin.
Le préfix des fichiers sources de ce plugin est VC (pour Vrpn Client).

Classe abstraite de tout périphérique OMK

  • Identifiant : AbstractVrpnPeripheric

Actuellement, notre client VRPN traite uniquement les type de device Tracker, Button et Analog.
C'est un objets extensible OpenMASK. Il prend en paramètre le nom du serveur VRPN à contacter. Sa fréquence devient la fréquence d'exécution des main_loop VRPN sur les devices traités.
Cette classe abstraite n'a pas d'attributs.

 UserParams
 {
   DeviceName "device0@computer.domain"
 }

Classe d'un client générique

  • Identifiant : GenericVRPNClient

Une première spécialisation de la classe abstraite qui devrait répondre à une majorité de cas.

VRPNDTrack
  {
   Class GenericVRPNClient
   Scheduling
   {
    Frequency 60
   }
   UserParams
   {
    DeviceName "DTrack@localhost"
    ButtonEvents
    [
     [0 ["MyEvent" "Receiver0"]]
     [0 ["AnotherEvent" "Receiver1"]]
     [1 ["MyEvent" "Receiver2"]]
    ]
   AnalogCount 3
   AnalogAttributeNames
   [
    [0 "FlystickJoyX"]
    [1 "FlystickJoyY"]
   ]
   AnalogAttributeBase "AnalogOutput"
   TrackerCount 4
   TrackerAttributeNames
   [
    [0 "Head"]
    [3 "Flystick"]
   ]
   TrackerAttributeBase "body"
   TrackVelocity true
   TrackAcceleration true
   }
  }

Un client générique ne gère qu'un seul périphérique.
Un bouton sert à envoyer un évènement à un autre OSO. Cet événement est de type booléen : enfoncement = vrai ; relâchement = faux . A noter que chaque usage d'une touche entraine l'envoi de deux événements, éventuellement bien dissociés dans le temps si la touche est maintenue pressée longtemps.
Chaque analogue définit une sortie de type OMK::Type::FloatType avec un identifiant d'attribut. Vous pouvez soit définir explicitement le nom de chaque attribut, soit le faire bâtir à partir d'une base et de son numéro.
Chaque tracker dispose du même mécanisme sur un attribut de type OMK::Type::Transform.

Utilitaire de Transform

  • Identifiant : VrpnAnalogToTransform

Cet utilitaire combine plusieurs flux analogiques en une donnée de type Transform d'OpenMASK.

AnalogToTransform
 {
 Class VrpnAnalogToTransform
 Scheduling
 {
  Frequency 60
 }
 UserParams
 {
  AnalogSender "VRPNSpaceMouse"
  InvertTransZ true
  OutputForTransX "SpaceMouseTransX"
  OutputForTransY "SpaceMouseTransY"
  OutputForTransZ "SpaceMouseTransZ"
  InvertRotX false
  OutputForRotX "SpaceMouseRotX"
  OutputForRotX "SpaceMouseRotY"
  OutputForRotX "SpaceMouseRotZ"
  RotationSpeed 1.0
  EventReceiver "Receiver"
  EventID "LocalMove"
 }
}

Vous précisez l'identifiant du client vrpn associé.
Vous pouvez éventuellement inverser les translation et les rotations, et définir les identifiants des attributs correspondants.
Vous pouvez définir un événement à envoyer à un autre OSO.

Utilitaire "Bouton à Touche"

  • Identifiant : VrpnButtonToKey

Chaque instance de cette classe va écouter les événementts ButtonToKeyEvent.

VRPNButtonToKey
{
  Class VrpnButtonToKey
  Scheduling
  {
   Frequency 60
  }
  UserParams
  {
   KeyReceiver "ReceiverOSO"
   KeyToSendOnPress "P"
   KeyToSendOnRelease "R"
  }
}

En paramètre, vous donnez le nom de l'OSO qui doit recevoir un code de touche-clavier, soit lorsque vous avez appuyé sur le bouton du périphérique vrpn, soit lorsque vous l'avez relâché, soit les deux.
Cela implique que l'OSO récepteur a une extension qui le fait réagir à la réception d'un événement Touche-clavier (voir par exemple Key...EmitterExtension).

Exemples OpenMASK

  • souris 2D : Cet exemple est disponible dans le répertoire config-tests du plugin
  • PAC : Cet exemple est disponible dans le répertoire Samples\1Basic-tests\architecture-PAC.

Liens

VRGeeks propose une release windows d'un serveur vrpn et un tutoriel VRPN : [1]
Le site pour obtenir la dernière version de vrpn : [2]
Le document de référence introductif au système VRPN : [3]

Notes

La spacemouse de Connexion3D s'utilise plutôt avec la ligne "vrpn_3DConnexion_Navigator" du fichier .cfg et a donc pour nom device0@localhost

Navigation