Сообщения являются первичным контейнером для обмена данными в ROS. Темы и сервисы используют сообщения, чтобы нести данные между узлами. (См., обмениваются Данными с ROS Publishers and Subscribers and Call and Provide ROS Services для получения дополнительной информации о темах и службами),
Чтобы идентифицировать его структуру данных, каждое сообщение имеет тип сообщения. Например, данные о датчике из лазерного сканера обычно отправляются в сообщении типа sensor_msgs/LaserScan
. Каждый тип сообщения идентифицирует элементы данных, которые содержатся в сообщении. Каждое имя типа сообщения является комбинацией имени пакета, сопровождаемого наклонной чертой вправо/, и имя типа:
MATLAB® поддерживает много типов сообщений ROS, с которыми обычно сталкиваются в приложениях робототехники. Этот пример показывает некоторые способы создать, исследовать, и заполнить сообщения ROS в MATLAB.
Необходимые условия: Начало работы с ROS, подключением к сети ROS
Инициализируйте ведущее устройство ROS и глобальный узел.
rosinit
Launching ROS Core... Done in 0.824 seconds. Initializing ROS master on http://192.168.0.10:50625. Initializing global node /matlab_global_node_24525 with NodeURI http://bat1071901glnxa64:33953/
Используйте 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://bat1071901glnxa64:40149/) Subscribers: * /node_1 (http://bat1071901glnxa64:33181/) * /node_2 (http://bat1071901glnxa64:43959/)
Выход команды также говорит вам, которых узлы публикуют и подписывают на тему. Чтобы узнать об издателях и подписчиках, смотрите Call and Provide ROS Services.
Чтобы узнать больше о типе сообщения темы, создайте пустое сообщение того же типа с помощью 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 с примерами ROS Publishers and Subscribers and Call and Provide 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
содержит демонстрационное сообщение. (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_24525 with NodeURI http://bat1071901glnxa64:33953/ Shutting down ROS master on http://192.168.0.10:50625.
Смотрите работу со Специализированными сообщениями ROS для примеров обработки изображений, облаков точек и лазерных сообщений скана.
Для примеров приложения смотрите Начало работы с Gazebo и Симулированным TurtleBot или Начало работы с Действительным TurtleBot примеры.