Сообщения являются основным контейнером для обмена данными в ROS. Темы и службы используют сообщения для переноса данных между узлами. (Смотрите Exchange Data with ROS Publishers and Subscribers and Call and Supply ROS Services для получения дополнительной информации по темам и услугам)
Для идентификации структуры данных каждое сообщение имеет тип сообщения. Для примера данные датчика от лазерного сканера обычно отправляются в сообщении типа sensor_msgs/LaserScan. Каждый тип сообщения определяет элементы данных, содержащиеся в сообщении. Каждое имя типа сообщения представляет собой комбинацию имени пакета, за которой следует косая черта/и имя типа:

MATLAB ® поддерживает многие типы сообщений ROS, которые обычно встречаются в приложениях робототехники. В этом примере показаны некоторые способы создания, исследования и заполнения сообщений ROS в MATLAB.
Необходимые условия: Запуск с ROS, подключение к сети ROS
Инициализируйте основной и глобальный узлы ROS.
rosinit
Launching ROS Core... Done in 0.68556 seconds. Initializing ROS master on http://192.168.0.10:52182. Initializing global node /matlab_global_node_57880 with NodeURI http://bat6315glnxa64:43565/
Использование exampleHelperROSCreateSampleNetwork для заполнения сети ROS тремя дополнительными узлами и образцами издателей и подписчиков.
exampleHelperROSCreateSampleNetwork
В сети есть различные узлы с несколькими темами и аффилированные издатели и подписчики.
Полный список доступных тем вы можете увидеть по телефону rostopic list.
rostopic list/pose /rosout /scan /tf
Если вы хотите узнать больше о типе данных, которые отправляются через /scan topic, используйте rostopic info команда, чтобы изучить его. /scan имеет тип сообщения sensor_msgs/LaserScan.
rostopic info /scan
Type: sensor_msgs/LaserScan Publishers: * /node_3 (http://bat6315glnxa64:35933/) Subscribers: * /node_1 (http://bat6315glnxa64:37711/) * /node_2 (http://bat6315glnxa64:42175/)
Командный выход также сообщает, какие узлы публикуются и подписываются на тему. Для получения информации о издателях и подписчиках см. раздел «Вызов и предоставление услуг ROS».
Чтобы узнать больше о типе сообщения темы, создайте пустое сообщение того же типа с помощью rosmessage функция. rosmessage поддерживает заполнение клавишей Tab для типа сообщения. Чтобы заполнить имена типов сообщений, введите первые несколько символов имени, которое вы хотите заполнить, и нажмите клавишу 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
Созданное сообщение scandata имеет много свойств, сопоставленных с данными, обычно принимаемыми от лазерного сканера. Для примера минимальное расстояние измерения сохранено в RangeMin свойство, и максимальное расстояние измерения в RangeMax.
Чтобы просмотреть полный список всех типов сообщений, доступных для тем и служб, используйте rosmsg list.
Сообщения ROS являются объектами, и данные сообщения хранятся в свойствах. MATLAB предлагает удобные способы поиска и исследования содержимого сообщений.
Если вы подписываетесь на /pose Вы можете получать и просматривать отправленные сообщения.
posesub = rossubscriber('/pose')posesub =
Subscriber with properties:
TopicName: '/pose'
LatestMessage: [0x1 Twist]
MessageType: 'geometry_msgs/Twist'
BufferSize: 1
NewMessageFcn: []
DataFormat: 'object'
Использовать receive для получения данных от абонента. После получения нового сообщения функция вернёт его и сохранит в 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
Сообщение имеет тип geometry_msgs/Twist. В сообщении есть два других свойства: Linear и Angular. Значения этих свойств сообщения можно увидеть при непосредственном доступе к ним:
posedata.Linear
ans =
ROS Vector3 message with properties:
MessageType: 'geometry_msgs/Vector3'
X: 0.0093
Y: 0.0453
Z: 0.0084
Use showdetails to show the contents of the message
posedata.Angular
ans =
ROS Vector3 message with properties:
MessageType: 'geometry_msgs/Vector3'
X: 0.0878
Y: -0.0210
Z: 0.0068
Use showdetails to show the contents of the message
Каждое из значений этих полей сообщения фактически само по себе является сообщением. Тип сообщения для них geometry_msgs/Vector3. geometry_msgs/Twist является составным сообщением, состоящим из двух geometry_msgs/Vector3 сообщений.
Доступ к данным для этих вложенных сообщений работает в точности так же, как и доступ к данным в других сообщениях. Доступ к X компонент Linear сообщение с помощью этой команды:
xpos = posedata.Linear.X
xpos = 0.0093
Если необходимо получить краткие сводные данные всех данных, содержащихся в сообщении, вызовите rosShowDetails функция. showdetails работает с сообщениями любого типа и рекурсивно отображает все свойства данных сообщений.
showdetails(posedata)
Linear
X : 0.00932219052602273
Y : 0.04526734562806031
Z : 0.008449365172780367
Angular
X : 0.08782643913382959
Y : -0.02100276720970422
Z : 0.006813318676002524
showdetails помогает вам во время отладки и когда вы хотите быстро исследовать содержимое сообщения.
Можно также задать значения свойств сообщения. Создайте сообщение с типом 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
Числовые свойства этого сообщения инициализируются в 0 по умолчанию. Можно изменить любые свойства этого сообщения. Установите Linear.Y запись, равная 5.
twist.Linear.Y = 5;
Просмотрите данные сообщения, чтобы убедиться, что ваше изменение вступило в эффект.
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
Как только сообщение заполнено вашими данными, вы можете использовать его с издателями, подписчиками и сервисами. См. примеры Exchange Data with ROS Publishers and Subscribers и Call and Supply ROS Services.
Существует два способа копирования содержимого сообщения:
Можно создать копию ссылки, и исходные сообщения будут использовать одни и те же данные.
Вы можете создать глубокий копий. глубокая копия, в которой каждая копия и оригинальные сообщения имеют свои данные.
Ссылочная копия полезна, если необходимо обмениваться данными сообщений между различными функциями или объектами, в то время как глубокая копия необходима, если требуется независимая копия сообщения.
Создайте ссылку на сообщение при помощи = знак. Это создает переменную, которая ссылается на то же содержимое сообщения, что и исходная переменная.
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
Измените Linear.Z область twistCopyRef. Это также изменяет содержимое twist.
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
Сделайте глубокую копию twist чтобы можно было изменять его содержимое, не влияя на исходные данные. Сделайте новое сообщение, twistCopyDeep, с использованием copy функция:
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
Измените Linear.X свойство twistCopyDeep. Содержимое twist оставить без изменений.
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
Можно сохранять сообщения и хранить содержимое для дальнейшего использования.
Получите новое сообщение от абонента.
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
Сохраните данные положения в файл MAT с помощью MATLAB save функция.
save('posedata.mat','posedata')
Перед загрузкой файла обратно в рабочую область очистите posedata переменная.
clear posedataТеперь вы можете загрузить данные сообщения, позвонив load функция. Это загружает posedata сверху в messageData структура. posedata - поле данных struct.
messageData = load('posedata.mat')messageData = struct with fields:
posedata: [1x1 Twist]
Исследуйте 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
Теперь можно удалить файл MAT.
delete('posedata.mat')Некоторые сообщения от ROS хранятся в массивах объектов. Они должны обрабатываться по-другому по сравнению с типичными массивами данных.
В вашей рабочей области переменная tf содержит пример сообщения. (The exampleHelperROSCreateSampleNetwork скрипт создал переменную.) В этом случае это сообщение типа tf/tfMessage используется для координатных преобразований.
tf
tf =
ROS tfMessage message with properties:
MessageType: 'tf/tfMessage'
Transforms: [53x1 TransformStamped]
Use showdetails to show the contents of the message
tf имеет два поля: MessageType содержит стандартный массив данных и Transforms содержит объектный массив. В Transforms хранятся 53 объектаи все они имеют одинаковую структуру.
Разверните tf в Transforms для просмотра структуры:
tf.Transforms
ans =
53x1 ROS TransformStamped message array with properties:
MessageType
Header
Transform
ChildFrameId
Каждый объект в Transforms имеет четыре свойства. Вы можете развернуть, чтобы увидеть Transform область Transforms.
tformFields = tf.Transforms.Transform
Примечание: Выходные данные команды возвращают 53 отдельных ответа, поскольку каждый объект оценивается и возвращает значение своего Transform поле. Этот формат не всегда полезен, поэтому можно преобразовать его в массив ячеек с помощью следующей команды:
cellTransforms = {tf.Transforms.Transform}cellTransforms=1×53 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}
Это помещает все 53 записи объекта в массив ячеек, позволяя вам получить доступ к ним с индексацией.
В сложение вы можете получить доступ к объектному массиву элементам так же, как и к стандартным векторам MATLAB:
tf.Transforms(5)
ans =
ROS TransformStamped message with properties:
MessageType: 'geometry_msgs/TransformStamped'
Header: [1x1 Header]
Transform: [1x1 Transform]
ChildFrameId: '/imu_link'
Use showdetails to show the contents of the message
Доступ к компоненту перевода пятого преобразования в списке 53:
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
Удалите примеры узлов, издателей и подписчиков из сети ROS.
exampleHelperROSShutDownSampleNetwork
Завершите работу хозяина ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_57880 with NodeURI http://bat6315glnxa64:43565/ Shutting down ROS master on http://192.168.0.10:52182.
Примеры обработки изображений, облаков точек и сообщений лазерного скана см. в разделе «Работа со специализированными сообщениями ROS».
Примеры приложений см. в Запуск с Gazebo и моделируемым TurtleBot или Запуском с реальным TurtleBot примерами.