[Jderobot-dev] ParallelIce -> Acceso en paralelo a múltiples interfaces

franciscomiguel.rivas en urjc.es franciscomiguel.rivas en urjc.es
Vie Mayo 31 19:47:42 CEST 2013


Buenas,

llevo un par de semanas dándole un buen retoque a recorder-replayer  
para mejorar su rendimiento con la captura de múltiples interfaces y  
me he dado cuenta de algunas cosas que se debían solucionar.:
1. Al acceder de forma secuencial a muchos interfaces se produce un  
retardo acumulado muy grande a la hora de la adquisición global. Si  
tenemos un interfaz que tarda 50 ms en darnos el dato y tenemos 4  
interfaces de ese tipo, pues el tiempo que tardamos en tener todos los  
datos para poder empezar a ejecutar nuestro algoritmo es de 200 ms.
2. Todos los datos que se tomen de forma secuencial van a tener un  
retardo entre ellos, por lo tenemos una desinconrización muy grande.  
En el ejemplo anterior cada uno de los datos tiene un desfase de 50 ms  
con respecto al anterior, si ejecutamos el nuestro algoritmo  
suponiendo que son tomados (mas o menos) en el mismo instante de  
tiempo pues tenemos un problema.

Para solucionar esto hemos creado una funcionalidad llamada  
parallelIce que se ha incorporado en la libería jderobotice [1]. Lo  
que nos ofrece esta librería es una abstracción completa del interfaz  
ice ofreciendo un acceso asíncrono instantáneo a una copia local que  
se refresca internamente utilizando un thread dedicado. Con ello  
conseguimos que los datos sean actualizados en paralelo (cada interfaz  
tiene su propia hebra que se ejecuta a una frecuencia configurable) y  
además como trabajamos con copias locales el coste del acceso a ese  
dato es prácticamente 0. Esta funcionalidad está implementada para los  
interfaces:
- camera
- pointCloud

Ademas de ofrecer un acceso en paralelo nos ofrece una abstracción de  
toda la conexión al servidor. Sólo tenemos que pasarle el prefijo del  
interfaz dentro del fichero de configuración de nuestra aplicación y  
esta clase de encarga de hacer todo. Por lo que, por ejemplo, para  
crear un cliente del interfaz cámara solo tendríamos que escribir:

#include <jderobotice/cameraClient.h>

?
Ice::CommunicatorPtr ic = Ice::initialize(argc,argv);
Std::string prefix(?mycomponent.camera1.?);
jderobot::cameraClient cam=new jderobot::cameraClient(ic, prefix,false);

cv::Mat image= cam->getImage();

Y para la nube de puntos:
#include <jderobotice/pointcloudClient.h>

?
Ice::CommunicatorPtr ic = Ice::initialize(argc,argv);
Std::string prefix(?mycomponent.pointcloud1.?);
jderobot::pointcloudClient pc=new jderobot::pointcloudClient(ic,  
prefix,false);

std::vector<jderobot::RGBPoint> cloud = pc->getData();

El tercer argumento es si queremos activar los mensajes de debug,  
imprime un timeout cuando no se han podido los tiempos establecidos en  
los fps.


La configuración que necesita en el fichero de ice, es la que se  
utiliza normalmente incluyendo el Fps al que queremos que se actualice  
internamente:

....
mycomponent.Camera1.Proxy=cameraA:tcp -h localhost -p 9999
mycomponent.Camera1.Fps=10;
mycomponent.Camera1.Proxy=pointcloud1:tcp -h localhost -p 9999
mycomponent.Camera1.Fps=10;
....


Y para compilarlo solo hay que añadir :
${LIBS_DIR}/libparallelIce.so

en el TARGET_LINK_LIBRARIES del CMakeLists.txt de nuestra aplicación.

espero que os sea de utilidad y ante todo pido disculpas por el tocho ;-).

Un saludo,
Fran.




[1] http://jderobot.org/index.php/Manual-5#parallelIce
------------------------------------------------------------------
Laboratorio de Análisis del Movimiento, Biomecánica, Ergonomía y  
Control Motor (LAMBECOM).
Departamento de Fisioterapia, Terapia Ocupacional, Rehabilitación y  
Medicina Física.
Universidad Rey Juan Carlos (URJC).


More information about the Jde-developers mailing list