Mensajes y Topics en ROS
¿Qué son los mensajes en ROS?
Los mensajes en ROS (Robot Operating System) son estructuras de datos utilizadas para intercambiar información entre nodos. ROS permite que los nodos se comuniquen a través de topics, y los datos enviados a través de estos topics son los mensajes.
Cada mensaje puede contener distintos tipos de datos: enteros, cadenas, flotantes, arreglos, estructuras más complejas, etc.
Categoría |
Comando |
Descripción |
|---|---|---|
Mensajes |
|
Muestra la estructura de un mensaje. |
|
Lista todos los tipos de mensajes disponibles. |
|
|
Lista los mensajes definidos en un paquete. |
¿Qué son los topics?
Un topic en ROS es un canal de comunicación por el cual los nodos pueden enviar o recibir mensajes. Los nodos pueden:
Publicar información en un topic.
Suscribirse a un topic para recibir la información.
Los topics son anónimos y no requieren que el publicador conozca a los suscriptores o viceversa. Esto permite una comunicación desacoplada y flexible.
Comandos principales
Categoría |
Comando |
Descripción |
|---|---|---|
Topics |
|
Muestra todos los topics activos. |
|
Muestra los mensajes publicados en un topic. |
|
|
Muestra información del topic (tipo, publishers, subscribers). |
|
|
Publica un mensaje manual en un topic. |
|
|
Mide la frecuencia de publicación de un topic. |
Uso de mensajes y topics
Tipos comunes de mensajes en ROS
Tipo de Mensaje |
Descripción |
|---|---|
|
|
|
Números enteros de 32 bits. |
|
Números decimales. |
|
Representa velocidad lineal y angularusado en robótica móvil |
|
|
|
Posición y orientación de un objeto. |
|
Estructura básica de nodos publicadores y suscriptores
Un nodo publicador envía mensajes en un topic específico.
Un nodo suscriptor escucha un topic y procesa los mensajes entrantes.
También es posible tener nodos publicador-suscriptor que reciben mensajes, los procesan y responden.
Los nodos pueden ser escritos en Python o C++. A continuación se definen ejemplos teóricos que utilizan tipos de mensajes como std_msgs/String.
Ejemplo
Nodo publicador
#!/usr/bin/env python3
import rospy
# Importo el tipo de mensaje a utilizar.
from std_msgs.msg import String, Int64
def talker():
# Nombre Topico, Tipo de msg, Tama;o de cola de mensaje
pub = rospy.Publisher('Topic_mensaje', Int64 , queue_size=1)
rospy.init_node('Nodo_publicador',anonymous=True)
# Bucle
rate = rospy.Rate(10) # 10 Hz
while not rospy.is_shutdown():
pub.publish(0)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
Nodo Suscriptor
#!/usr/bin/env python3
import rospy
from std_msgs.msg import String,Int64
def callback(dato):
print("El mensaje recibido es: ")
mensaje = dato.data + 1
print(mensaje)
def funcion_principal():
rospy.Subscriber("Topic_mensaje" , Int64 , callback)
rospy.init_node('Nodo_suscriptor',anonymous=True)
rospy.spin()
if __name__=='__main__':
try:
funcion_principal()
except rospy.ROSInterruptException:
pass
Creación de mensajes personalizados en ROS
Cuando los mensajes estándar no son suficientes, ROS permite crear mensajes propios personalizados. A continuación, se detallan los pasos:
Pasos para crear mensajes personalizados
Crear un nuevo paquete que contenga los mensajes:
catkin_create_pkg [Nombre_del_paquete] roscpp rospy std_msgs message_generation
Crear la carpeta
msgdentro del paquete:mkdir msgCrear un archivo
.msgdentro de esa carpeta:gedit MensajePersonalizado.msgEjemplo de contenido:
string Palabra1 string Palabra2
Configurar el archivo
CMakeLists.txt:Agregar
message_generationenfind_package.Descomentar y agregar el nombre del archivo
.msgenadd_message_files.Descomentar
generate_messages.Agregar
message_runtimeencatkin_package.
Configurar
package.xml: Agregar las dependencias correspondientes:<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
Compilar el paquete:
cd ~/catkin_ws catkin_make
Importar y usar el mensaje personalizado en los nodos:
from [nombre_del_paquete].msg import MensajePersonalizado
Ahora puedes usar tus propios tipos de mensaje como si fueran parte de los mensajes estándar. Esta capacidad es muy útil para estructuras de datos específicas como múltiples sensores, comandos de robots, o datos combinados.