ROS custom messages

As mensagens personalizadas no ROS (ROS custom messages) são constituidas a partir das  mensagens préviamente disponiveis.

Para criar novas mensagens personalizadas (custom messages) deveremos proceder do seguinte modo:

Primeiro deveremos definir o novo tipo de mensagem num ficheiro que tem de ser criado dentro da pasta msg do respectivo pacote.

Preferencialmente deve existir um pacote exclusivo para as mensagens pois assim elas são mais facilmente reutilizaveis.

# MyCustomMsg.msg

Header header
float64 data

Para criar as mensagens, quer seja num pacote dedicado quer sejam incluidas num outro pacote em que convivem com outras funcionalidades, as instruções de compilação tem de obedecer a alguns requisitos:

O ficheiro package.xml deve conter:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

No ficheiro CMakeLists.txt, tem de incluir vários blocos de texto:

Incluir o pacote message_generation na entrada find_package, no ficheiro CMakeLists.txt, como no exemplo abaixo:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

Exportar a dependência em tempo de execução incluindo a seguinte entrada no ficheiro CMakeLists.txt:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...
)

Declarar o ficheiro com a mensagem personalizada com a seguinte entrada no ficheiro  CMakeLists.txt.

add_message_files(
  FILES
  MyCustomMsg.msg
)

Se existirem mais mensagens será é uma por linha. Adequar o nome do ficheiro(s) indicado nesta entrada.

Fica assim completa a parte dos requisitos para a nossa mensagem personalizada ser compilada e disponivel para ser usada.

Caso esta mensagem esteja num pacote diferente daquele onde vai ser usadas, por exemplo um pacote dedicado a mensagens, para usar esta mensagem é necessário incluir as seguintes entradas nos ficheiros package.xlm e CMakeLists.txt.

No ficheiro package.xlm incluir o nome do pacote (substituir pelo nome correcto do pacote), conforme o exemplo abaixo:

<depend package="message_package" />

No ficheiro CMakeLists.txt, incluir message_package (substituir pelo nome correcto do pacote) na entrada adequada (ver exemplo abaixo).

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_package
)

No que respeita ao inclusão e utilização da mensagem personalizada no código C++, é necessário proceder da seguinte forma:

Importar para o código C++ code.

#include <message_package/MyCustomMsg.h>

Declarar o topic  publisher:

my_msg_pub_ = n.advertise<message_package::MyCustomMsg>("topic", 10);

Criar uma instancia da mensagem numa variavel:

message_package::MyCustomMsg msg;

Atribuir o(s) valor(es) e publicar a mensagem.

msg.header.stamp = ros::Time::now();
msg.header.frame_id = "/world";
msg.data = 0.0;

my_msg_pub_.publish(msg);

Que me lembre é tudo.

Fontes:

  • http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv
  • http://wiki.ros.org/ROS/Tutorials/DefiningCustomMessages