YARP

A continuación, presentamos un mini-tutorial, destinado a establecer las comunicaciones en un entorno YARP.

Para más información existe una sección dedicada en la guía oficial: YARP (Tutorials).

Para nociones básicas de redes, existe el tutorial de redes (ASROB).

Requisitos previos

Lección 1: yarp server, yarp write, y yarp read

Abre una terminal en un sistema Linux (que llamaremos consola+número) y sigue estos pasos:

  • consola1:

    yarp server
    
  • consola2:

    yarp read /read
    
  • consola3:

    yarp write /write /read
    

    Ahora escribimos (casi) cualquier cosa en consola3 y vemos cómo aparece mágicamente en consola2.

Lección 2: yarp read con función de quit

Crea un archivo llamado ejemplo.cpp con este código:

#include <yarp/os/Network.h>
#include <yarp/os/Port.h>
#include <yarp/os/Bottle.h>
#include <stdio.h>

int main()
{
    yarp::os::Network yarp;
    yarp::os::Bottle bot;
    yarp::os::Port input;
    input.open("/read");
    while(1)
    {
        input.read(bot);
        printf("Got message: %s\n", bot.toString().c_str());
        // Now exit the loop if first element (this is, 0), treated as a string, equals "quit":
        if (bot.get(0).asString() == "quit")
            break;
    }
    input.close();
    return 0;
}

Abre una consola (que llamaremos consola1) en donde esté ese archivo.

  • consola1:

    yarp cmake
    mkdir build; cd build; cmake ..; make
    
  • consola2:

    yarp server
    
  • consola1:

    ./yarpy
    
  • consola3:

    yarp write /write /read
    

Ahora escribimos cualquier cosa en consola3 y vemos cómo aparece mágicamente en consola1. Si escribimos quit en la consola3, vemos que el módulo de la consola1 se cierra, tal y como está explícito en el código que le hemos implementado.

Observación 1: Con input.read(bot); se está diciendo que el programa se quede en esta línea esperando (esto es, la función read, utilizada así, es una función "bloqueante") a que algo llegue por el puerto (que dentro del programa manejamos a través del objeto input) y vuelque su contenido dentro del objeto bot (de clase Bottle).

Observación 2: ¿Quién es el que manda, en la lección, contenido al puerto que manejamos con input? Pues yarp write, que conectamos con sus parámetros de inicialización de (qué nombre muestro al exterior -> /write) (a quién me conecto al iniciarme -> /read, que es el nombre que hemos dicho a input que muestre de cara al exterior) al hacer yarp write /write /read desde la consola. yarp write por defecto, cada vez que damos al retorno de carro (enter), coge lo que hemos escrito y lo envía encapsulado en un Bottle.

Lección 3: yarp write básico

Se parte de la lección anterior, añadiendo código nuevo.

#include <yarp/os/Network.h>
#include <yarp/os/Port.h>
#include <yarp/os/Bottle.h>
#include <yarp/os/Time.h> // código nuevo
#include <stdio.h>

int main()
{
    yarp::os::Network yarp;
    yarp::os::Bottle bot;
    yarp::os::Port output; // código nuevo
    output.open("/write"); // código nuevo
    while(1) // código nuevo
    { // código nuevo
        char c[100]; // código nuevo
        scanf("%s",c); // código nuevo
        bot.clear(); // will keep on appending if this line were inexistent // código nuevo
        bot.addString(c); // código nuevo
        output.write(bot); // código nuevo
    } // código nuevo
    output.close(); // código nuevo
    return 0;
}

Abre una consola (que llamaremos consola1) en donde esté ese archivo.

  • consola1:

    yarp cmake
    
  • consola1:

    mkdir build; cd build; cmake ..; make
    
  • consola2:

    yarp server
    
  • consola1:

    ./yarpy
    
  • consola3:

    consola3~$ yarp read /read # comando nuevo
    
  • consola4:

    yarp connect /write /read # comando nuevo
    

Ahora escribimos cualquier cosa en consola1 y veremos cómo aparece mágicamente en consola3.

FAQ (Frequently asked questions o Preguntas frecuentes)

¿Que es yarpy?

Está definido en la línea 10 del CMakeLists.txt que genera yarp cmake. Es simplemente el nombre por defecto que asigna al ejecutable que generas tras el cmake y make (o sistema de compilación que utilices). Prueba a cambiar esa palabra antes del cmake!

¿Que funcion tiene una botella (Bottle)?

Es una estructura de datos flexible, un contenedor donde puedes incorportar enteros, cadenas de caracteres, coma flotante... Si nos fijamos en la declaración de la clase Port de YARP, no es más que un puerto especializado en manejar objetos de clase Bottle.

Páginas similares y relacionadas