Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Intercambiar datos con ROS editores y suscriptores

El mecanismo principal para que los nodos ROS intercambien datos es enviar y recibir.messages Los mensajes se transmiten en un y cada tema tiene un nombre único en la red de ROS.topic Si un nodo desea compartir información, usará una para enviar datos a un tema.publisher Un nodo que desea recibir esa información usará un a ese mismo tema.subscriber Además de su nombre único, cada tema también tiene un, que determina los tipos de mensajes que se pueden transmitir.message type

Esta comunicación de publicador/suscriptor tiene las siguientes características:

  • Los temas se utilizan para la comunicación de varios a varios. Muchos editores pueden enviar mensajes al mismo tema y muchos suscriptores pueden recibirlos.

  • El publicador y los suscriptores se desacoplan a través de temas y se pueden crear y destruir en cualquier orden. Un mensaje se puede publicar en un tema incluso si no hay suscriptores activos.

El concepto de temas, editores y suscriptores se ilustra en la siguiente imagen:

Este ejemplo muestra cómo publicar y suscribirse a temas en una red de ROS. También muestra cómo:

  • Espere hasta que se reciba un nuevo mensaje o

  • Utilice devoluciones de llamada para procesar nuevos mensajes en segundo plano

Requisitos previos:Empiece con ROSConéctese a una red de ROS

Suscribirse y esperar mensajes

Inicie el Master de ROS en MATLAB® y cree una red de ROS de muestra con varios editores y suscriptores.

rosinit
Initializing ROS master on http://bat572107glnxa64:33207/. Initializing global node /matlab_global_node_23546 with NodeURI http://bat572107glnxa64:40387/ 
exampleHelperROSCreateSampleNetwork

Se usa para ver qué temas están disponibles.rostopic list Supongamos que desea suscribirse al tema./scan

rostopic list
/pose   /rosout /scan   

Se usa para comprobar si algún nodo está publicando en el tema.rostopic info/scan El comando siguiente muestra que está publicando en él.node_3

rostopic info /scan
Type: sensor_msgs/LaserScan   Publishers: * /node_3 (http://bat572107glnxa64:37989/)   Subscribers: * /node_2 (http://bat572107glnxa64:40339/) * /node_1 (http://bat572107glnxa64:42273/) 

Utilíbase para suscribirse al tema.rossubscriber/scan Si el tema ya existe en la red de ROS (como es el caso aquí), detecta su tipo de mensaje automáticamente, por lo que no es necesario especificarlo.rossubscriber

laser = rossubscriber('/scan')
laser =    Subscriber with properties:          TopicName: '/scan'       MessageType: 'sensor_msgs/LaserScan'     LatestMessage: [0x1 LaserScan]        BufferSize: 1     NewMessageFcn: []  

Se usa para esperar un nuevo mensaje (el segundo argumento es un tiempo de espera en segundos).receive La salida contiene los datos del mensaje recibido.scandata

scandata = receive(laser,10)
scandata =    ROS LaserScan message with properties:         MessageType: 'sensor_msgs/LaserScan'             Header: [1x1 Header]           AngleMin: -0.5216           AngleMax: 0.5243     AngleIncrement: 0.0016      TimeIncrement: 0           ScanTime: 0.0330           RangeMin: 0.4500           RangeMax: 10             Ranges: [640x1 single]        Intensities: [0x1 single]    Use showdetails to show the contents of the message  

Algunos tipos de mensaje tienen visualizadores convenientes asociados con ellos. Para el mensaje LaserScan, traza los datos de escaneo. El par nombre-valor especifica el rango de trazado máximo.MaximumRange

figure plot(scandata,'MaximumRange',7)

Suscribirse mediante funciones de devolución de llamada

En lugar de usar para obtener datos, puede especificar una función que se llamará cuando se recibe un nuevo mensaje.receive Esto permite que otro código de MATLAB se ejecute mientras el suscriptor espera nuevos mensajes. Las devoluciones de llamada son esenciales si desea utilizar varios suscriptores.

  • Suscríbase al tema mediante la función de devolución de llamada./poseexampleHelperROSPoseCallback Una forma de compartir datos entre el espacio de trabajo principal y la función de devolución de llamada es utilizar variables globales. Defina también dos variables globales y.posorient

robotpose = rossubscriber('/pose',@exampleHelperROSPoseCallback)
robotpose =    Subscriber with properties:          TopicName: '/pose'       MessageType: 'geometry_msgs/Twist'     LatestMessage: [0x1 Twist]        BufferSize: 1     NewMessageFcn: @exampleHelperROSPoseCallback  
global pos global orient

Las variables globales y se asignan en la función cuando se reciben nuevos datos de mensaje sobre el tema.posorientexampleHelperROSPoseCallback/pose

Espere unos segundos para asegurarse de que el suscriptor puede recibir mensajes. Los datos de posición y orientación más actuales siempre se almacenarán en las variables y.posorient

pause(2)  pos
pos = 1×3

    0.1151    0.0436   -0.0411

orient
orient = 1×3

    0.0303   -0.0253    0.1623

Si escribe y un par de veces en la línea de comandos, puede ver que los valores se actualizan continuamente.posorient

Detenga el suscriptor de pose desactivando la variable de suscriptor

clear robotpose

:Note Hay otras formas de extraer información de funciones de devolución de llamada además de usar Globals. Por ejemplo, puede pasar un objeto de identificador como argumento adicional a la función de devolución de llamada. Consulte la documentación para obtener más información sobre cómo definir funciones de devolución de llamada.Definición de devolución de llamada (MATLAB)

Publicar mensajes

Cree un publicador que envíe mensajes de cadena de ROS al tema (consulte)./chatterTrabajar con Basic ROS mensajes

chatterpub = rospublisher('/chatter', 'std_msgs/String')
chatterpub =    Publisher with properties:           TopicName: '/chatter'         IsLatching: 1     NumSubscribers: 0        MessageType: 'std_msgs/String'  
pause(2) % Wait to ensure publisher is registered

Cree y rellene un mensaje de ROS para enviarlo al tema./chatter

chattermsg = rosmessage(chatterpub); chattermsg.Data = 'hello world'
chattermsg =    ROS String message with properties:      MessageType: 'std_msgs/String'            Data: 'hello world'    Use showdetails to show the contents of the message  

Se utiliza para verificar que el tema está disponible en la red de ROS.rostopic list/chatter

rostopic list
/chatter /pose    /rosout  /scan    

Defina un suscriptor para el tema. se llama cuando se recibe un nuevo mensaje y muestra el contenido de la cadena en el mensaje./chatterexampleHelperROSChatterCallback

chattersub = rossubscriber('/chatter', @exampleHelperROSChatterCallback)
chattersub =    Subscriber with properties:          TopicName: '/chatter'       MessageType: 'std_msgs/String'     LatestMessage: [0x1 String]        BufferSize: 1     NewMessageFcn: @exampleHelperROSChatterCallback  

Publique un mensaje en el tema./chatter Observe que la cadena se muestra mediante la devolución de llamada del suscriptor.

send(chatterpub,chattermsg) pause(2)
ans =  'hello world' 

La función se llamó tan pronto como se publicó el mensaje de cadena.exampleHelperROSChatterCallback

Apague la red ROS

Quite los nodos de muestra, los editores y los suscriptores de la red de ROS. También borre las variables globales yposorient

exampleHelperROSShutDownSampleNetwork clear global pos orient

Apague el maestro ROS y borre el nodo global.

rosshutdown
Shutting down global node /matlab_global_node_23546 with NodeURI http://bat572107glnxa64:40387/ Shutting down ROS master on http://bat572107glnxa64:33207/. 

Próximos pasos