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

Trabajar con Basic ROS mensajes

Los mensajes son el contenedor principal para intercambiar datos en ROS. Los temas (ver) y los servicios (consulte) utilizan mensajes para transportar datos entre nodos.Intercambiar datos con ROS editores y suscriptoresLlame y proporcione los servicios de ROS

Para identificar su estructura de datos, cada mensaje tiene un.message type Por ejemplo, los datos de los sensores de un escáner láser normalmente se envían en un mensaje de tipo.sensor_msgs/LaserScan Cada tipo de mensaje identifica los elementos de datos contenidos en un mensaje. Cada nombre de tipo de mensaje es una combinación de un nombre de paquete, seguido de una barra inclinada/y un nombre de tipo:

MATLAB® es compatible con muchos tipos de mensajes ROS que se encuentran comúnmente en aplicaciones de robótica. En este ejemplo, examinará algunas de las formas de crear, explorar y rellenar mensajes de ROS en MATLAB.

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

Buscar tipos de mensaje

Inicialice el maestro ROS y el nodo global.

rosinit
Initializing ROS master on http://bat574104glnxa64:33669/. Initializing global node /matlab_global_node_18049 with NodeURI http://bat574104glnxa64:40389/ 

Se utiliza para rellenar la red de ROS con tres nodos adicionales y editores de muestra y suscriptores.exampleHelperROSCreateSampleNetwork

exampleHelperROSCreateSampleNetwork

Hay varios nodos en la red con algunos temas y editores afiliados y suscriptores.

Puede ver la lista completa de temas disponibles mediante una llamada. es uno de los temas enumerados.rostopic list/scan

rostopic list
/pose   /rosout /scan   

Si desea saber más sobre el tipo de datos que se envían a través del tema, utilice el comando para examinarlo. tiene un tipo de mensaje./scanrostopic info /scan/scansensor_msgs/LaserScan

rostopic info /scan
Type: sensor_msgs/LaserScan   Publishers: * /node_3 (http://bat574104glnxa64:40111/)   Subscribers: * /node_2 (http://bat574104glnxa64:36811/) * /node_1 (http://bat574104glnxa64:38529/) 

La salida de comando también le indica qué nodos están publicando y suscribiéndose al tema. Para obtener información sobre editores y suscriptores, consulte.Intercambiar datos con ROS editores y suscriptores

  • Para obtener más información sobre el tipo de mensaje del tema, cree un mensaje vacío del mismo tipo. Utilice la función. admite la finalización de tabulación para el tipo de mensaje.rosmessagerosmessage Para completar los nombres de tipo de mensaje, escriba los primeros caracteres del nombre que desea completar y, a continuación, presione la tecla.Tab

scandata = rosmessage('sensor_msgs/LaserScan')
scandata =    ROS LaserScan message with properties:         MessageType: 'sensor_msgs/LaserScan'             Header: [1x1 Header]           AngleMin: 0           AngleMax: 0     AngleIncrement: 0      TimeIncrement: 0           ScanTime: 0           RangeMin: 0           RangeMax: 0             Ranges: [0x1 single]        Intensities: [0x1 single]    Use showdetails to show the contents of the message  

El mensaje creado tiene muchas propiedades asociadas con los datos normalmente recibidos de un escáner láser.scandata Por ejemplo, la distancia de detección mínima se almacena en la propiedad y la distancia de detección máxima en.RangeMinRangeMax

Para ver una lista completa de todos los tipos de mensajes disponibles para los temas y servicios, utilice.rosmsg list

Explore estructura de mensajes y obtener datos de mensaje

Los mensajes ROS son objetos y los datos del mensaje se almacenan en propiedades. MATLAB® ofrece formas convenientes de encontrar y explorar el contenido de los mensajes.

  • Si se suscribe al tema, puede recibir y examinar los mensajes que se envían./pose

posesub = rossubscriber('/pose')
posesub =    Subscriber with properties:          TopicName: '/pose'       MessageType: 'geometry_msgs/Twist'     LatestMessage: [0x1 Twist]        BufferSize: 1     NewMessageFcn: []  
  • Se utiliza para adquirir datos del suscriptor.receive Una vez que se recibe un nuevo mensaje, la función lo devolverá y lo almacenará en la variable (el segundo argumento es un tiempo de salida en segundos).posedata

posedata = receive(posesub, 10)
posedata =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

El mensaje tiene un tipo de.geometry_msgs/Twist Hay otros dos campos en el mensaje: y.LinearAngular Puede ver los valores de estos campos de mensaje accediendo directamente a ellos:

posedata.Linear
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0.0315               Y: 0.0406               Z: -0.0373    Use showdetails to show the contents of the message  
posedata.Angular
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0.0413               Y: 0.0132               Z: -0.0402    Use showdetails to show the contents of the message  

Puede ver que cada uno de los valores de estos campos de mensaje es en realidad un mensaje en sí mismo. El tipo de mensaje es. es un mensaje compuesto formado por dos mensajes.geometry_msgs/Vector3geometry_msgs/Twistgeometry_msgs/Vector3

El acceso a los datos para estos mensajes anidados funciona exactamente igual que tener acceso a los datos de otros mensajes. Acceda el componente del mensaje usando este comando:XLinear

xpos = posedata.Linear.X
xpos = 0.0315 

Si desea un resumen rápido de todos los datos contenidos en un mensaje, puede llamar a la función. funciona en mensajes de cualquier tipo y mostrará de forma recursiva todas las propiedades de datos del mensaje.showdetailsshowdetails

showdetails(posedata)
  Linear          X :  0.03147236863931789     Y :  0.04057919370756193     Z :  -0.03730131837064939   Angular         X :  0.04133758561390194     Y :  0.01323592462254095     Z :  -0.04024595950005905 

le ayuda durante la depuración y cuando desea explorar rápidamente el contenido de un mensaje.showdetails

Establecer datos de mensaje

También puede establecer valores de propiedad de mensaje. Cree un mensaje con el tipo.geometry_msgs/Twist

twist = rosmessage('geometry_msgs/Twist')
twist =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

Las propiedades numéricas de este mensaje se inicializan en "0" de forma predeterminada. Puede modificar cualquiera de las propiedades de este mensaje. Haga la entrada igual a 5.Linear.Y

twist.Linear.Y = 5;

Puede ver los datos del mensaje para asegurarse de que el cambio ha tenido efecto.

twist.Linear
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0               Y: 5               Z: 0    Use showdetails to show the contents of the message  

Una vez que un mensaje se rellena con los datos, puede utilizarlo con editores, suscriptores y servicios. Vea los ejemplos.Intercambiar datos con ROS editores y suscriptoresLlame y proporcione los servicios de ROS

Copiar mensajes

Hay dos formas de copiar el contenido de un mensaje:

  • Puede crear una en la que la copia y los mensajes originales compartan los mismos datosreference copy

  • Puede crear una en la que la copia y los mensajes originales tengan sus propios datos.deep copy

Una copia de referencia es útil si desea compartir datos de mensajes entre diferentes funciones u objetos, mientras que una copia profunda es necesaria si desea una copia independiente de un mensaje.

Haga un mensaje usando el signo ' = '.reference copy Esto crea una variable que hace referencia al mismo contenido de mensaje que la variable original.

twistCopyRef = twist
twistCopyRef =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

Modifique el campo de, y vea que cambia el contenido de también:Linear.ZtwistCopyReftwist

twistCopyRef.Linear.Z = 7; twist.Linear
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0               Y: 5               Z: 7    Use showdetails to show the contents of the message  

Haga una de modo que pueda cambiar su contenido sin afectar a los datos originales.deep copytwist Haz un nuevo mensaje, usando la función:twistCopyDeepcopy

twistCopyDeep = copy(twist)
twistCopyDeep =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

Modifique la propiedad de y observe que el contenido de permanecen sin cambios.Linear.XtwistCopyDeeptwist

twistCopyDeep.Linear.X = 100; twistCopyDeep.Linear
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 100               Y: 5               Z: 7    Use showdetails to show the contents of the message  
twist.Linear
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0               Y: 5               Z: 7    Use showdetails to show the contents of the message  

Guardar y cargar mensajes

Puede guardar los mensajes y almacenar el contenido para su uso posterior.

Obtenga un nuevo mensaje del suscriptor.

posedata = receive(posesub,10)
posedata =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

Guarde los datos de pose en un archivo. MAT utilizando la función de MATLAB.save

save('posedata.mat','posedata')

Antes de volver a cargar el archivo en el espacio de trabajo, borre la variable.posedata

clear posedata

Ahora puede cargar los datos del mensaje llamando a la función.load Esto carga desde arriba en la estructura. es un campo de datos de la estructura.posedatamessageDataposedata

messageData = load('posedata.mat')
messageData = struct with fields:
    posedata: [1x1 Twist]

Examine para ver el contenido del mensaje.messageData.posedata

messageData.posedata
ans =    ROS Twist message with properties:      MessageType: 'geometry_msgs/Twist'          Linear: [1x1 Vector3]         Angular: [1x1 Vector3]    Use showdetails to show the contents of the message  

Ahora puede eliminar el archivo MAT.

delete('posedata.mat')

Matrices de objetos en mensajes

Algunos mensajes de ROS se almacenan en.Arreglos de objetos (MATLAB) Estos deben controlarse de forma diferente a las matrices de datos típicas.

En el área de trabajo, la variable contiene un mensaje de ejemplo (el script creó la variable).tfexampleHelperROSCreateSampleNetwork En este caso, es un mensaje de tipo utilizado para las transformaciones de coordenadas.tf/tfMessage

tf
tf =    ROS tfMessage message with properties:      MessageType: 'tf/tfMessage'      Transforms: [53x1 TransformStamped]    Use showdetails to show the contents of the message  

tiene dos campos: contiene una matriz de datos estándar y contiene una matriz de objetos.tfMessageTypeTransforms Hay 53 objetos almacenados en, y todos ellos tienen la misma estructura.Transforms

Amplíe para ver la estructura:tfTransforms

tf.Transforms
ans =    53x1 ROS TransformStamped message array with properties:      MessageType     Header     ChildFrameId     Transform  

Cada objeto en tiene cuatro propiedades.Transforms Puede expandir para ver el campo de.TransformTransforms

tformFields = tf.Transforms.Transform

La salida del comando devuelve 53 respuestas individuales, ya que cada objeto se evalúa y devuelve el valor de su campo.Note:Transform Este formato no siempre es útil, por lo que puede convertirlo a una matriz de celdas con el siguiente comando:

cellTransforms = {tf.Transforms.Transform}
cellTransforms = 1x53 cell array
  Columns 1 through 4

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 5 through 8

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 9 through 12

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 13 through 16

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 17 through 20

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 21 through 24

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 25 through 28

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 29 through 32

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 33 through 36

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 37 through 40

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 41 through 44

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 45 through 48

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 49 through 52

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Column 53

    {1x1 Transform}

Esto coloca todas las entradas de objeto 53 en una matriz de celdas, lo que le permite acceder a ellas con la indexación.

Además, puede acceder a los elementos de la matriz de objetos del mismo modo que accede a los vectores de MATLAB estándar:

tf.Transforms(5)
ans =    ROS TransformStamped message with properties:       MessageType: 'geometry_msgs/TransformStamped'           Header: [1x1 Header]     ChildFrameId: '/imu_link'        Transform: [1x1 Transform]    Use showdetails to show the contents of the message  

Acceder a las propiedades de los elementos individuales de la matriz:

tf.Transforms(5).Transform.Translation
ans =    ROS Vector3 message with properties:      MessageType: 'geometry_msgs/Vector3'               X: 0.0599               Y: 0               Z: -0.0141    Use showdetails to show the contents of the message  

Esto expone el componente de traducción de la quinta transformación en la lista de 53.

Apague la red ROS

Quite los nodos de muestra, los editores y los suscriptores de la red de ROS.

exampleHelperROSShutDownSampleNetwork

Apague el maestro ROS y borre el nodo global.

rosshutdown
Shutting down global node /matlab_global_node_18049 with NodeURI http://bat574104glnxa64:40389/ Shutting down ROS master on http://bat574104glnxa64:33669/. 

Próximos pasos