Сообщения являются первичным контейнером для обмена данными в ROS. Темы (см., обмениваются Данными с Издателями ROS и Подписчиками), и сервисы (см. Call and Provide ROS Services), сообщения использования, чтобы нести данные между узлами.
Чтобы идентифицировать его структуру данных, каждое сообщение имеет тип сообщения. Например, данные о датчике из лазерного сканера обычно отправляются в сообщении типа sensor_msgs/LaserScan
. Каждый тип сообщения идентифицирует элементы данных, которые содержатся в сообщении. Каждое имя типа сообщения является комбинацией имени пакета, сопровождаемого наклонной чертой вправо/, и имя типа:
MATLAB® поддерживает много типов сообщений ROS, с которыми обычно сталкиваются в приложениях робототехники. В этом примере вы исследуете некоторые способы создать, исследовать, и заполнить сообщения ROS в MATLAB.
Предпосылки: Запуск с ROS, соединитесь с сетью ROS
Инициализируйте ведущее устройство ROS и глобальный узел.
rosinit
Initializing ROS master on http://bat6230glnxa64:35493/. Initializing global node /matlab_global_node_51580 with NodeURI http://bat6230glnxa64:40883/
Используйте exampleHelperROSCreateSampleNetwork
, чтобы заполнить сеть ROS с тремя дополнительными узлами и демонстрационными издателями и подписчиками.
exampleHelperROSCreateSampleNetwork
Существуют различные узлы в сети с несколькими темами и аффилированными издателями и подписчиками.
Вы видите полный список доступных тем путем вызова rostopic
list
. /scan
является одной из тем, которая перечислена.
rostopic list
/pose /rosout /scan
Если вы хотите знать больше о типе данных, которые отправляются через тему /scan
, используйте команду
rostopic
info /scan
, чтобы исследовать его. /scan
имеет тип сообщения sensor_msgs/LaserScan
.
rostopic info /scan
Type: sensor_msgs/LaserScan Publishers: * /node_3 (http://bat6230glnxa64:41037/) Subscribers: * /node_2 (http://bat6230glnxa64:42225/) * /node_1 (http://bat6230glnxa64:44645/)
Вывод команды также говорит вам, которых узлы публикуют и подписывают на тему. Чтобы узнать об издателях и подписчиках, смотрите, обмениваются Данными с Издателями 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' MessageType: 'geometry_msgs/Twist' LatestMessage: [0x1 Twist] BufferSize: 1 NewMessageFcn: []
Используйте 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.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
Вы видите, что каждое из значений этих полей сообщения является на самом деле сообщением сам по себе. Типом сообщения для них является geometry_msgs/Vector3
. geometry_msgs/Twist
является составным сообщением, составленным из двух сообщений geometry_msgs/Vector3
.
Доступ к данным для этих вложенных сообщений работает точно то же самое доступом к данным в других сообщениях. Доступ к компоненту X
сообщения Linear
с помощью этой команды:
xpos = posedata.Linear.X
xpos = 0.0315
Если вы хотите быстрые сводные данные всех данных, содержавшихся в сообщении, можно вызвать showdetails
функцию. showdetails
работает над сообщениями любого типа и рекурсивно отобразит все свойства данных сообщения.
showdetails(posedata)
Linear X : 0.03147236863931789 Y : 0.04057919370756193 Z : -0.03730131837064939 Angular X : 0.04133758561390194 Y : 0.01323592462254095 Z : -0.04024595950005905
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 функции
save
MATLAB использования файла.
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 хранятся в Массивах объектов (MATLAB). Они должны быть обработаны по-другому по сравнению с типичными массивами данных.
В вашей рабочей области переменная 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 ChildFrameId Transform
Каждый объект в Transforms
имеет четыре свойства. Можно расшириться, чтобы видеть поле Transform
Transforms
.
tformFields = tf.Transforms.Transform
Примечание: команда, вывод дает 53 отдельных ответа, начиная с каждого объекта, оценена и возвращает значение своего поля Transform
. Этот формат не всегда полезен, таким образом, можно преобразовать его в массив ячеек со следующей командой:
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}
Это помещает все 53 объектных записи в массив ячеек, который позволяет вам получать доступ к ним с индексацией.
Кроме того, можно получить доступ к элементам объектного массива тем же путем, вы получаете доступ к стандартным векторам MATLAB:
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
Доступ к свойствам отдельных элементов массива:
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
Это представляет компонент перевода пятого преобразования в списке 53.
Удалите демонстрационные узлы, издателей и подписчиков от сети ROS.
exampleHelperROSShutDownSampleNetwork
Закройте ведущее устройство ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_51580 with NodeURI http://bat6230glnxa64:40883/ Shutting down ROS master on http://bat6230glnxa64:35493/.
Смотрите работу со Специализированными сообщениями ROS для примеров обработки изображений, облак точек и лазерных сообщений сканирования.
Для примеров приложения см. Запуск с Gazebo и Моделируемым TurtleBot или Запуск с Действительным TurtleBot примеры.