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

JoseMaria josemaria.plaza en gmail.com
Vie Mayo 31 20:55:39 CEST 2013


Esta es una gran mejora en eficiencia!!! 

Lo iremos metiendo en los componentes que manejan varios interfaces
(introrob...) y casi por limpieza y elegancia en todos. Elimina
latencias, no sólo si hay varios interfaces, incluso con uno no se
emplea ICE como si fuera una llamada a procedimiento remoto, sino que el
último dato sensorial ya está en local y se entrega ipso facto al hilo
de control-procesamiento. Y está en local porque el hilo respectivo lo
está pidiendo al ritmo que esté configurado. Que las iteraciones por
segundo del hilo que refresca los datos sensoriales sea configurable es
una chulada y permite moldear ese ritmo para no consumir más ancho de
banda del necesario.

Merece la pena desacoplar la captura de sensores via ICE del hilo de
procesamiento de un componente, muy elegante. Enhorabuena Fran,

JoseMaria
On Fri, 2013-05-31 at 19:47 +0200, franciscomiguel.rivas en urjc.es wrote:
> 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).
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers

-- 
http://gsyc.es/jmplaza 
Universidad Rey Juan Carlos




More information about the Jde-developers mailing list