La classe dérivée USyncClient implémente des méthodes permettant d'obtenir les résultats des commandes URBI de manière synchrone. Vous devez savoir que ces fonctions sont moins efficaces et qu'elles ne fonctionnent pas encore avec la version OPEN-R de la liburbi. Par ailleurs, travailler avec un robot en mode synchrone est à éviter.
Pour obtenir la valeur d'un objet-device (possédant un attribut val), vous pouvez utiliser la méthode syncGetDevice. Le premier paramètre est le nom du device (ici nous prendrons comme exemple neck), le second est un réel (type double) qui est affecté de la valeur recue:
double ValeurNeck;
syncClient->syncGetDevice("neck", ValeurNeck);
Vous pouvez faire appel à la méthode syncGetImage pour obtenir une image de façon synchrone. La méthode enverra la commande appropriée et attendra le résultat, bloquant ainsi votre thread tant que l'image ne sera pas arrivée.
client->send("camera.resolution = 0; camera.gain = 2;");
int width, height;
client->syncGetImage("camera", myBuffer, myBufferSize,
URBI_RGB, URBI_TRANSMIT_JPEG, width, height);
Le premier paramètre est le nom du device de la caméra. Le second est le tampon qui recevra la donnée de l'image. Le troisième doit être une variable de type entier égale à la taille du tampon. La fonction placera la taille de la donnée à l'intérieur. Si le tampon est trop petit, la donnée sera tronquée.
Le quatrième paramètre est le format dans lequel vous souhaitez recevoir l'image. Les valeurs possibles sont URBI_RGB pour une image non compressée d'une profondeur de 24 bits, URBI_PPM pour un fichier PPM, URBI_YCbCr pour une image YCbCr non compressée, et URBI_JPEG pour un fichier compressé JPEG.
Le cinquième paramètre peut être soit URBI_TRANSMIT_JPEG soit URBI_TRANSMIT_YCbCr et spécifie comment l'image sera transmise entre le robot et le client. Transmettre une image JPEG augmente la fréquence de rafraîchissement et améliore nettement les performances.
Enfin la largeur et la hauteur de l'image sont données par les paramètres width et height.
La méthode syncGetSound permet d'obtenir un échantillon sonore du serveur, quelle que soit sa taille.
client->syncGetSound("micro", duree, son);
Le premier paramètre est le nom du device à qui demander du son, le second est la durée souhaitée, en millisecondes. son est une structure USound qui sera remplie avec le son enregistré.