[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