Сообщения являются основным контейнером для обмена данными в 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 примерами.