VRPN & Dataglove

From Fontys VR-Wiki
Jump to: navigation, search

Dit artikel rammelt nogal. Verbetering nodig.

VRPN Library

Virtual Reality Peripheral Networks VRPN kan gebruikt worden met Visual Studie 2005.

Zoek naar het project "make_vrpn_libs_build" en build dat project. Het is handig om in release mode te builden, maar is niet persé nodig. Release build heeft wel het voordeel dat de library een stuk kleiner is. Als dit succesvol voltooid is zijn er twee library gemaakt een vrpn.lib en quat.lib. De vrpn.lib staat in vrpn -->pc_win32 -->release en de quat.lib staat in quat --> pc_win32 --> release.

Gebruiken Om de VRPN library te gebruiken moeten er bepaalde libraries toegvoegd worden en bepaalde libraries genegeerd. De library wsock32.lib, vrpn.lib en quat.lib moet bij de 'additional Dependencies'. Welke libraries genegeerd moet worden verschilt met de "build" je gebruikt. Bij Debug moet: 'MSVCRT' en 'LIBCMT' genegeerd worden en bij Release moet: 'LIBC' en 'LIBCMT' genegeerd worden.

In de volgende twee screenshots is dat in een oogopslag te zien.

Vrpn1.jpg Vrpn2.jpg

Server

De server die gemaakt moet worden is een klein project. Er moet een 'vrpn_Synchronized_Connection' (of vrpn_Connection voor nieuwere versies) gemaakt worden om connectie te ontvangen en een interface voor een bepaald randapparaat. Dat wordt in een loop gezet.


cliënt

In de opstelling van CAVE wordt VRjuggler als cliënt gebruikt. Dus er hoeft geen cliënt gemaakt te worden, maar zelf een cliënt maken is ook niet moeilijk. Je moet alleen de interface van de device aanmaken en dat aan de adres van de server te koppelen. Dat moet dan in een loop gezet worden. VRPN gebruikt "'devicename'@'server_location'" formaat om de server te bereiken. De devicename is de naam van de device. Het moet overeenkomen met de naam die in de server is gespecificeerd. De server_location is de locatie van de server. Het kan een IP-adres zijn, maar ook een pc naam. Dus om een tracker die "FOB" heet en een lokale server, roept je met "FOB@localhost" aan. Om de waardes binnen te krijgen wordt er gebruikt gemaakt van callbacks. Callbacks zijn functies die aangeroepen worden wanneer er iets gebeurd bij een bijbehorende event.


Coördinaten

In de library van VRPN is een methode toegevoegd om de coördinaten van de FOB goed in te stellen zodat hij de juiste coördinaten doorstuurt naar VRjuggler. De methode zit in vrpn_Flock genaamd 'setCalibratedValues'. Deze methode wordt automatisch aangeroepen door de callback. Je moet alleen deze methode te overwriten. Om standaard waardes te krijgen die FOB stuurt moet je deze methode overwriten en leeglaten. De coördinaten die de FOB stuurt staan in inches en VRPN zet het om in meters, zodat de programmeur daar geen rekening hoeft te houden, omdat VRjuggler ook meters gebruiken. Wanneer de FOB boven de CAVE hangt en met het logo aan de opening van de CAVE staat is de verticale as de z-as met 0 bij de FOB en positieve waarde op de grond. De horizontale as is de y-as met links als positieve as en rechts als negatieve as. De diepte is de x-as met negatieve waarden bij het scherm en positieve waarden bij de uitgang.

In de onderstaande afbeelding dit weergegeven. Vrpn3.jpg

Met deze gegevens zijn de waarden omgerekend naar de waarden die VRjuggler wil hebben. Volgens VRjuggler zit de coördinaten zoalsin de figuur weergegeven.

Vrpn4.jpg

Deze omrekening gebeurt in methode 'setCalibratedValues'. Ook de coördinaten van de rotatie moet hier worden omgerekend. De rotatie is iets minder werk, omdat daar zit alleen de assen verkeerd. Dus alleen de assen worden verplaatst.


FOB coordinaten Vruggler coordinaten
X -Z
Y X
Z Y


Verbeteringen

De server moet nog gekalibreerd worden. Dat moet op een dynamische manier gedaan worden. Wat nu statisch in de code staat moet dynamisch gekalibreerd worden. Dus door een paar punten in de CAVE te laten registreren en dat vergelijken met de waarden die FOB geeft en dan de waarden om laten rekenen.


5dt data glove 5 ultra

Deze data glove gebruikt vijf buig sensoren om de positie van de vingers te detecteren. Deze data wordt via een USB kabel naar de pc gestuurd. De data worden in pakketten gestuurd. Een pakket bestaat uit 29 byte en wordt gestreamd naar de pc. Een pakket ziet als volgt uit.

Opening byte ID byte Versie byte Data bytes Checksum byte Eind byte
1 2 3 4-27 28 29
  • De openingsbyte is het karakter ‘<’ of in hexadecimaal 0x3C
  • De ID byte is de ID van het type glove. De 5dt data glove 5 ultra heeft als ID 0x10.
  • De versie byte geeft het versienummer van de firmware die in de glove zit.
  • Er worden 24 data bytes gestuurd, maar er wordt maar 5x12 bit gebruikt.
  • Er wordt 1 byte gebruikt voor de checksum
  • De eindbyte is het karakter ‘>’ of in hexadecimaal 0x3E

Versie byte De eerste 4 bit geeft major gedeelte en de laatste 4 bit geeft de minor gedeelte. Dus dat byte 0x32 is, dan is de versie nummer 3.2

Data bytes De reden waarom er zo veel zijn, is dat de data glove 14 ultra hetzelfde pakket gebruikt en die gebruikt alle 24 byte. Elke sensor gebruikt 12 bit of 1,5 byte. Het zit zo in elkaar.

1 1-4 bit 5-8 bit
2 9-12 bit 1-4 bit
3 5-8 bit 9-12 bit


Als je iedere keer 3 bytes in leest herhaalt dit blok 8 keer. In de eerste byte en de eerste vier bit van de tweede byte staat de gegevens van de eerste sensor. De laatste vier bit van de tweede byte en de derde byte staat de gegevens van de tweede sensor.

In de databytes passen 16 sensoren, maar voor data glove 5 ultra worden er maar 5 gebruikt.

Sensor nummer Functie
1 Duim
2 Duim
3 niet gebruikt
4 wijsvinger
5 wijsvinger
6 niet gebruik
7 Middelvinger
8 Middelvinger
9 Niet gebruikt
10 Ringvinger
11 Ringvinger
12 Niet gebruikt
13 Pink
14 Pink
15 Niet gebruikt
16 Niet gebruikt

De sensor 1 en 2, 4 en 5, 7 en 8, 10 en 11, 13 en 14 geven dezelfde waarden aan.


VRPN

In de VRPN library is een grote verandering aangebracht. De klasse vrpn_analog_5dt is helemaal herschreven, omdat de standaard klasse in VRPN is geschreven voor de data glove 5 en die gebruikt een ander pakkettensysteem. Ook heb ik in de library verzorgd dat de rauwe data automatisch gekalibreerd wordt tussen de waarde 0 en 1. Dit is met een formule gedaan die ook en met de API van 5dt.

 calVal = (val- min)/(max-min)* const

Max is de maximum waarde en min is de minimum waarde. Val is binnen komende waarde. De waarde moet tussen max en min komen anders moet max of min verplaatst worden Const is een constante waarde die er voor zorgt dat de waarde tussen [0..const] komt. Omdat we de waarde tussen 0 en 1 willen, verwaarlozen we die constante.

De server stuurt 10 waarden naar de cliënt. De eerste vijf waarden zijn ruwe waarden en de laatste vijf waarden zijn gekalibreerde waarden.