Iniciar sesión en el programa ROS

Buenas tardes, queridos lectores! Continúo hablando sobre varias características interesantes y útiles de la plataforma robótica Robot Operation System (ROS). En este breve tutorial, hablaré sobre las posibilidades de iniciar sesión utilizando ROS cuando se programa en C ++. Creo que muchos estarán de acuerdo en que la salida de mensajes durante la ejecución del programa es de gran importancia al desarrollar programas, especialmente al depurar. ROS proporciona una API conveniente para enviar varios tipos de mensajes al terminal con la capacidad de visualizar y filtrar mensajes en herramientas especiales de ROS. ¡Empecemos!

Uso de los métodos de la biblioteca console.h para mostrar mensajes en un nodo


Entonces, escribamos un nodo simple, al que llamaremos logging_tutorial:

catkin_create_pkg logging_tutorial roscpp std_msgs 

Añadir a CMakeLists.txt:

 add_executable(logging_node src/main.cpp) target_link_libraries(logging_node ${catkin_LIBRARIES} ) 

Ahora comencemos a escribir el código main.cpp. Importamos en el encabezado del archivo un archivo de encabezado especial console.h con la definición de las funciones de registro:

 #include <ros/console.h> 

Agregue un mensaje simple al método principal:

 int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ROS_INFO("logging_node start"); return 0; } 

Compile el paquete y ejecútelo:

 cd ~/catkin_ws catkin_make source devel/setup.bash rosrun logging_tutorial logging_node 

La salida será así:

 [ INFO] [1492194213.009783103]: logging_node start 

Al comienzo del mensaje se agrega un "nivel" o tipo y marca de tiempo en segundos y nanosegundos desde el 1 de enero de 1970. En este caso, tenemos un mensaje con un nivel INFO.

Podemos pasar parámetros al mensaje de manera similar al método printf:

 int val = 5; ROS_INFO("message with argument: %d", val); 

Puede crear un mensaje como una secuencia estándar como std :: cout:

 ROS_INFO_STREAM("message with argument: " << val); 

ROS admite los siguientes "niveles de detalle" (en orden creciente de relevancia):

  • DEPURACIÓN
  • INFORMACIÓN
  • ADVERTENCIA
  • Error
  • Fatal

Para mostrar un mensaje de cierto nivel, la función correspondiente se utiliza en el formato: ROS _ \ <NIVEL \>. Los mensajes de varios tipos se muestran con un color determinado: DEPURACIÓN - verde, INFORMACIÓN - blanco, AVISO - amarillo, ERROR - rojo, FATAL - púrpura. El propósito de cada tipo de mensaje es fácil de adivinar por su nombre. Por ejemplo, los mensajes DEBUG son útiles para la depuración.

Agregue algunos mensajes diferentes y ejecute todo en un bucle. Tengo el siguiente archivo:

 #include <ros/ros.h> #include <ros/console.h> int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ros::Rate rate (1); while(ros::ok()) { ROS_DEBUG("debug message"); ROS_INFO("logging_node start"); int val = 5; ROS_INFO("message with argument: %d", val); ROS_INFO_STREAM("stream message with argument: " << val); ROS_WARN("My warning"); ROS_ERROR("Some error"); ROS_FATAL("Fatal error"); ros::spinOnce(); rate.sleep(); } return 0; } 

Por defecto, se muestran mensajes de todo tipo, excepto DEPURACIÓN, durante la ejecución del programa. Esto está determinado por el nivel mínimo, el llamado "nivel de importancia", utilizando el parámetro ROSCONSOLE_MIN_SEVERITY. El parámetro ROSCONSOLE_MIN_SEVERITY limita la salida de mensajes de tal manera que se muestran todos los mensajes con un nivel igual o superior al mínimo. Por defecto, el nivel mínimo está establecido en DEBUG. Puede cambiar el nivel mínimo estableciendo ROSCONSOLE_MIN_SEVERITY en uno de los niveles de mensaje (ROSCONSOLE_SEVERITY_DEBUG, ROSCONSOLE_SEVERITY_INFO, etc.) o en ninguno de ellos (ROSCONSOLE_SEVERITY_NONE) utilizando la macro al comienzo del archivo de nodo:

 #define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG 

También puede establecer el nivel de gravedad para todos los nodos en el paquete en el archivo CMakeLists.txt:

 add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR) 

Este método tiene una limitación: solo se mostrarán los mensajes de un nivel superior a DEBUG, incluso si especificamos directamente ROSCONSOLE_SEVERITY_DEBUG. Este problema se puede resolver utilizando un archivo de configuración especial. Cree una carpeta de configuración y dentro de ella un archivo custom_rosconsole.conf con el siguiente contenido:

 log4j.logger.ros.logging_tutorial=DEBUG 

A continuación, cree el archivo de inicio de sesión logging.launch y especifique la ruta al archivo custom_rosconsole.conf en la variable ROSCONSOLE_CONFIG_FILE:

 <launch> <env name="ROSCONSOLE_CONFIG_FILE" value="$(find logging_tutorial)/config/custom_rosconsole.conf"/> <node pkg="logging_tutorial" type="logging_node" name="logging_node" output="screen"/> </launch> 

Aquí agregamos el parámetro output = "screen", que permite enviar mensajes de nivel que comienzan con INFO.

Compila y ejecuta nuestro lanzador:

 cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch 

Tenemos una conclusión similar:

imagen

ROS tiene la capacidad de nombrar mensajes. Por defecto, los mensajes obtienen el nombre del host. Los usuarios pueden dar nombres a varios mensajes a través de la función ROS _ \ <LEVEL \> [_ STREAM] _NAMED:

 ROS_INFO_STREAM_NAMED("named_msg", "named info stream message with argument: " << val); 


Los nombres le permiten asignar diferentes niveles mínimos a cada mensaje con nombre en el archivo de configuración y cambiarlos individualmente. El nombre del mensaje se indica después del nombre del paquete:

 log4j.logger.ros.logging_tutorial.named_msg = ERROR 


Los mensajes condicionales ejecutados bajo una determinada condición también pueden ser útiles. Para hacer esto, use la función ROS _ \ <NIVEL \> [_ STREAM] _COND [_NAMED]:

 ROS_INFO_STREAM_COND(val < 2, "conditional stream message shown when val (" << val << ") < 2"); 


Los mensajes pueden enviarse a una frecuencia específica utilizando la función ROS _ \ <NIVEL \> [_ STREAM] _THROTTLE [_NAMED]. El primer parámetro establece la frecuencia en segundos:

 ROS_INFO_THROTTLE(3, "throttled message with period 3 seconds"); 


Usando rqt_console para mostrar mensajes


Ejecute la utilidad rqt_console:

 rosrun rqt_console rqt_console 

Y comience nuestro nodo usando el lanzamiento:

 roslaunch logging_tutorial logging.launch 

La ventana rqt_console se verá así:

imagen

Aquí en la tabla para cada mensaje se muestra su nivel, nombre de nodo, nombre de archivo y línea de código donde se genera.

Al hacer doble clic en un mensaje, puede obtener información detallada al respecto:

imagen

Puede filtrar mensajes excluyendo todos los mensajes de error. Para hacer esto, agregue un filtro haciendo clic en el signo más al lado de la tabla Excluir mensajes y seleccionando la opción "... que contiene":

imagen

O excluya mensajes con el nivel de información:

imagen

Además, los mensajes de un nivel dado se pueden distinguir entre todos los que usan los filtros en la sección Resaltar mensajes:

imagen

Por lo tanto, rqt_console le permite configurar de manera flexible la visualización de mensajes de varios nodos y simplificar los programas de depuración en ROS.

Espero que esta guía sea útil en el trabajo y simplifique la solución de los problemas que surjan durante la programación. ¡Les deseo mucho éxito trabajando con ROS y hasta pronto!

Source: https://habr.com/ru/post/es403191/


All Articles