Сообщения являются основным контейнером для обмена данными в ROS. Разделы и службы используют сообщения для переноса данных между узлами. (Для получения дополнительной информации по темам и услугам см. раздел Обмен данными с издателями и подписчиками ROS и Услуги по вызову и предоставлению ROS)
Для идентификации структуры данных каждое сообщение имеет тип сообщения. Например, данные датчика от лазерного сканера обычно посылаются в сообщении типа 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 раздел, используйте 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.
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
После заполнения сообщения данными его можно использовать с издателями, подписчиками и службами. См. примеры обмена данными с издателями и подписчиками ROS и вызовов и предоставления услуг ROS.
Существует два способа копирования содержимого сообщения:
Можно создать ссылочную копию, и исходные сообщения будут совместно использовать одни и те же данные.
Вы можете создать глубокий копи.Глубокая копия, в которой копия и исходные сообщения имеют свои собственные данные.
Ссылочная копия полезна при необходимости совместного использования данных сообщения различными функциями или объектами, тогда как при необходимости независимой копии сообщения необходима глубокая копия.
Создание ссылочной копии сообщения с помощью = знак. При этом создается переменная, которая ссылается на то же содержимое сообщения, что и исходная переменная.
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 - поле данных структуры.
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 содержит образец сообщения. ( 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 содержит массив объектов. Существует 53 объекта, хранящихся в Transformsи все они имеют одинаковую структуру.
Расшириться 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.
Примеры применения см. в разделе Начало работы с беседкой и смоделированным TurtleBot или Начало работы с реальным TurtleBot.