Efetuando Login no Programa ROS

Boa tarde, queridos leitores! Continuo falando sobre vários recursos interessantes e úteis da plataforma robótica Robot Operation System (ROS). Neste breve tutorial, falarei sobre as possibilidades de fazer logon usando o ROS ao programar em C ++. Eu acho que muitos concordam que a saída de mensagens durante a execução do programa é de grande importância no desenvolvimento de programas, especialmente na depuração. O ROS fornece uma API conveniente para a saída de vários tipos de mensagens para o terminal, com a capacidade de visualizar e filtrar mensagens em ferramentas especiais do ROS. Vamos começar!

Usando métodos da biblioteca console.h para exibir mensagens em um nó


Então, vamos escrever um nó simples, que chamaremos de log_tutorial:

catkin_create_pkg logging_tutorial roscpp std_msgs 

Adicione ao CMakeLists.txt:

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

Agora vamos começar a escrever o código main.cpp. Importamos no cabeçalho do arquivo um arquivo de cabeçalho especial console.h com a definição das funções de log:

 #include <ros/console.h> 

Adicione uma mensagem simples ao 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 o pacote e execute-o:

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

A saída será assim:

 [ INFO] [1492194213.009783103]: logging_node start 

No início da mensagem, é adicionado um "nível" ou tipo e carimbo de data e hora em segundos e nanossegundos a partir de 1º de janeiro de 1970. Nesse caso, temos uma mensagem com um nível INFO.

Podemos passar parâmetros para a mensagem de maneira semelhante ao método printf:

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

Você pode criar uma mensagem como um fluxo padrão como std :: cout:

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

O ROS suporta os seguintes "níveis de detalhe" (em ordem crescente de relevância):

  • DEBUG
  • INFO
  • WARN
  • Erro
  • Fatal

Para exibir uma mensagem de um determinado nível, a função correspondente é usada no formato: ROS _ \ <LEVEL \>. Mensagens de vários tipos são exibidas com uma determinada cor: DEBUG - verde, INFO - branco, WARN - amarelo, ERRO - vermelho, FATAL - roxo. A finalidade de cada tipo de mensagem é fácil de adivinhar pelo nome. Por exemplo, as mensagens DEBUG são úteis para depuração.

Adicione algumas mensagens diferentes e execute tudo em um loop. Eu tenho o seguinte arquivo:

 #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 padrão, mensagens de todos os tipos, exceto DEBUG, são exibidas durante a execução do programa. Isso é determinado pelo nível mínimo, o chamado "nível de importância", usando o parâmetro ROSCONSOLE_MIN_SEVERITY. O parâmetro ROSCONSOLE_MIN_SEVERITY limita a saída de mensagens de forma que todas as mensagens com um nível igual ou superior ao mínimo sejam exibidas. Por padrão, o nível mínimo é definido como DEBUG. Você pode alterar o nível mínimo atribuindo a ROSCONSOLE_MIN_SEVERITY o valor de um dos níveis de mensagem (ROSCONSOLE_SEVERITY_DEBUG, ROSCONSOLE_SEVERITY_INFO etc.) ou a qualquer um deles (ROSCONSOLE_SEVERITY_NONE), usando a macro no início do arquivo do nó:

 #define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG 

Você também pode definir o nível de gravidade para todos os nós no pacote no arquivo CMakeLists.txt:

 add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR) 

Este método tem uma limitação: somente mensagens de nível superior a DEBUG serão exibidas, mesmo se especificarmos diretamente ROSCONSOLE_SEVERITY_DEBUG. Esse problema pode ser resolvido usando um arquivo de configuração especial. Crie uma pasta de configuração e dentro dela um arquivo custom_rosconsole.conf com o seguinte conteúdo:

 log4j.logger.ros.logging_tutorial=DEBUG 

Em seguida, crie o arquivo logging.launch de inicialização e especifique o caminho para o arquivo custom_rosconsole.conf na variável 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> 

Aqui nós adicionamos o parâmetro output = "screen", que permite enviar mensagens de nível começando com INFO.

Compile e execute nosso iniciador:

 cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch 

Temos uma conclusão semelhante:

imagem

O ROS tem a capacidade de nomear mensagens. Por padrão, as mensagens obtêm o nome do host. Os usuários podem atribuir nomes a várias mensagens através da função ROS _ \ <LEVEL \> [_ STREAM] _NAMED:

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


Os nomes permitem atribuir diferentes níveis mínimos a cada mensagem nomeada no arquivo de configuração e alterá-los individualmente. O nome da mensagem é indicado após o nome do pacote:

 log4j.logger.ros.logging_tutorial.named_msg = ERROR 


Mensagens condicionais executadas sob uma determinada condição também podem ser úteis. Para fazer isso, use a função ROS _ \ <LEVEL \> [_ STREAM] _COND [_NAMED]:

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


As mensagens podem ser enviadas em uma frequência específica usando a função ROS _ \ <LEVEL \> [_ STREAM] _THROTTLE [_NAMED]. O primeiro parâmetro define a frequência em segundos:

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


Usando rqt_console para exibir mensagens


Execute o utilitário rqt_console:

 rosrun rqt_console rqt_console 

E inicie nosso nó usando launch:

 roslaunch logging_tutorial logging.launch 

A janela rqt_console ficará assim:

imagem

Aqui na tabela para cada mensagem, seu nível, nome do nó, nome do arquivo e linha de código onde é gerado são exibidos.

Ao clicar duas vezes em uma mensagem, você pode obter informações detalhadas sobre ela:

imagem

Você pode filtrar mensagens excluindo todas as mensagens de erro. Para fazer isso, adicione um filtro clicando no sinal de adição ao lado da tabela Excluir mensagens e selecionando a opção "... contendo":

imagem

Ou exclua mensagens com o nível Informações:

imagem

Além disso, as mensagens de um determinado nível podem ser distinguidas entre todos os que utilizam os filtros na seção Realçar Mensagens:

imagem

Assim, rqt_console permite configurar de forma flexível a exibição de mensagens de vários nós e simplificar os programas de depuração no ROS.

Espero que este guia seja útil no trabalho e simplifique a solução de problemas que surjam durante a programação. Desejo a todos sucesso em trabalhar com a ROS e até breve!

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


All Articles