Tutorial yarp devices

From Asociación de Robótica UC3M
Jump to navigation Jump to search

¿Qué es un YARP device?

Es, en esencia, una clase C++ que se puede cargar dinámicamente a través de una cadena de texto que contiene su nombre. El hecho de cargar una clase cuya implementación interna sólo depende de una cadena de texto que contiene su nombre es extremadamente útil (además de difícil de implementar de cero).

¿Para qué se utilizan los YARP device?

Imagínate que dentro de tu código llamas a funciones de lectura de un encoder. Lo habitual es incorporar una capa de abstracción para tener una clase base para cualquier tipo de encoder. El polimorfismo característico de C++ te permite cambiar de:

EncoderTypeA enc;
enc.getEncoders(&encoderValues);

a:

EncoderTypeB enc;
enc.getEncoders(&encoderValues);

para cambiar de implementación. Esto es, de buenas a primeras, debemos cambiar nuestro código y recompilar si queremos pasar de utilizar la implementación de la clase EncoderTypeA a utilizar la de la clase EncoderTypeB. En esencia, YARP devices nos permite un código mucho más parecido a;

std::cout << "¿Qué tipo de encoders utilizas (EncoderTypeA o EncoderTypeB)?";
std::cin >> encoderType;
...
options.put("device",encoderType);
...
enc->getEncoders(&encoderValues);

Esto es, la selección de implementación de encoder se realiza en tiempo de ejecución, y no es necesario modificar el código ni recompilar para conmutar entre una implementación y otra.

¿Cómo se implementa un YARP device?

En cuanto a implementación, por norma general es una clase C++ que hereda de yarp::dev::DeviceDriver y otras clases. Necesita además un poco de magia CMake. Las versiones actuales de YARP compilan esta clase en una librería dinámica que se puede cargar de dos maneras:

YARP device desde yarpdev

Para ver los YARP devices disponibles, tecleamos:

yarpdev --list

Para lanzar un YARP device, tecleamos:

yarpdev --device nombre_dispositivo

YARP device desde un programa

int main(int argc, char *argv[]) {

   yarp::os::Network yarp;
   if ( ! yarp::os::Network::checkNetwork() )
   {
       printf("Please start a yarp name server first\n");
       return(1);
   }
   yarp::os::Property options;
   options.put("device","nombre_dispositivo");
   //-- Se pueden pasar más parámetros al YARP device en el formato:
   //options.put("mas_parametros","valor_de_ese_parametro");
   //options.put("mas_parametros","valor_de_ese_parametro");
   //-- ...
   yarp::dev::PolyDriver dd(options);
   if( ! dd.isValid() )
   {
       printf("Device not available.\n");
       dd.close();
       yarp::os::Network::fini();
       return 1;
   }

   while(1);  //-- Esta no es la mejor práctica, la idea es no cerrar el programa!

   return 0;
}