Работа с ROS обменивается сообщениями в Simulink®

Этот пример иллюстрирует, как работать с комплексными сообщениями ROS в Simulink, такими как сообщения с вложенными подсообщениями и массивами переменной длины.

Введение

В ROS Модели Simulink сигналы шины представляют сообщения ROS. Каждое поле сообщения ROS, соответствует полю в шине Simulink, с нижеследующими ограничениями:

  • Константы не поддерживаются и исключены из шины Simulink.

  • 64-битные Целые числа (ROS вводит int64 и uint64) преобразуйте в, удваивается в шине Simulink, когда Simulink исходно не поддерживает 64-битные целочисленные типы данных.

  • Массивы переменной длины (тип ROS ...[]) преобразуйте в массив фиксированной длины с настраиваемыми максимальными длинами. По умолчанию фиксированная длина 128 для типов примитивов (например, uint8[], float32[]), и 16 для вложенных массивов сообщений (например, geometry_msgs/Point[]).

  • Строки (тип ROS string) преобразуйте в фиксированную длину uint8 массивы с настраиваемыми максимальными длинами, с максимальной продолжительностью по умолчанию 128 символов.

  • Строковые массивы (тип ROS string[]) преобразуйте в массив фиксированной длины std_msgs/String с настраиваемой максимальной длиной. Максимальная длина по умолчанию является 16 строками.

Когда шина Simulink преобразует в сообщение ROS, поля сообщения восстанавливают к их нативным типам ROS. Например, тип сообщения ROS std_msgs/Header имеет поле, FrameId, который является строкой. В соответствующей шине Simulink, FrameId полем является uint8 массив. Когда шина преобразует в сообщение ROS, FrameId преобразует назад в строку.

Модель

Следующая модель имеет несколько примеров работы с комплексными сообщениями ROS в Simulink. Остальная часть задач в этом примере фокусируется на определенных сценариях.

open_system('robotROSMessageUsageExample');

Доступ к данным в массиве переменной длины

Сообщение ROS может иметь массивы, длина которых (число элементов) не может быть предопределена. Например, Position поле в sensor_msgs/JointState сообщение является массивом переменной длины 64-битных плаваний. В любом данном sensor_msgs/JointState обменивайтесь сообщениями, Position массив не может иметь никаких элементов, или он может иметь произвольно большое количество элементов. В Simulink такие массивы требуются, чтобы иметь максимальную длину.

Откройте модель в качестве примера и исследуйте, как массивы переменной длины в сообщениях ROS обработаны в Simulink в следующих шагах.

open_system('robotROSMessageUsageExample/Work with Variable-length Arrays');
  • Дважды кликните работу с подсистемой Переменной длины Массивов. Обратите внимание на то, что блок Subscribe сконфигурирован, чтобы получить сообщения, отправленные в тему /my_joint_topic как тип сообщения, sensor_msgs/JointState.

  • Под вкладкой Modeling нажмите Update Model.

  • Дважды кликните на блоке Селектора Шины. Существует три массива переменной длины в сообщении (Position, Velocity, и Effort).

  • Заметьте, что существует Position_SL_Info поле в шине. Position_SL_Info.ReceivedLength содержит длину Position массив в исходном полученном сообщении ROS. Это значение может быть произвольно большим. Position_SL_Info.CurrentLength содержит длину Position массив в Simulink соединяет шиной сигнал. Это может варьироваться между 0 и максимальная длина массива (128, в этом случае).

Сконфигурируйте сеть ROS

  • Под вкладкой Simulation выберите ROS Toolbox> ROS Network. Если вы не видите ROS Toolbox, выберите Model Settings под вкладкой Modeling. В диалоговом окне Параметров конфигурации выберите Robot Operating System (ROS) для Аппаратного Совета dropdown. Нажмите ОК, чтобы закрыть диалоговое окно.

  • Установите Сетевой Адрес и для Ведущего устройства ROS (ROS 1) и для Хоста Узла (ROS 1) к Default.

  • Введите rosinit в командной строке MATLAB®.

Запустите симуляцию

  • Под вкладкой Simulation, Временем остановки набора к Inf, и нажмите Play, чтобы запустить симуляцию.

  • Выполните следующее в командной строке MATLAB.

[pub, msg] = rospublisher('/my_joint_state', 'sensor_msgs/JointState');
msg.Position = [11:2:25]; % array of length 8
send(pub, msg);
  • Наблюдайте Отображаемые выводы в работе с подсистемой Переменной длины Массивов. Обратите внимание на то, что Current Length и Received Length равны.

  • Выполните следующее в командной строке MATLAB.

msg.Position = 1:130; % array of length 130
send(pub, msg);
  • Заметьте, что предупреждение испускается, указывая, что усечение произошло. Received Length теперь 130 и Current Length 128.

  • Под вкладкой Debug выберите Diagnostics> Diagnostic Viewer. Предупреждения обычно направляются здесь к Средству просмотра Диагностики Simulink (Диагностика вида на море (Simulink)).

Измените максимальный размер массива переменной длины

Измените максимальный размер массива переменной длины в Simulink. Максимум по умолчанию Position массив в sensor_msgs/JointState типом сообщения является 128. Вы измените этот предел 256.

  • Откройте модель в качестве примера и дважды кликните на работе с подсистемой Переменной длины Массивов.

  • От вкладки Simulation выберите ROS Toolbox> Variable Size Messages.

  • От поля списка слева, нажмите на sensor_msgs/JointState. Затем отменяйте пределы значения по умолчанию Использования для этого флажка типа сообщения. Наконец, введите новое значение (256) в строке для Position свойство массива, и нажимает ОК, чтобы закрыть диалоговое окно.

  • Нажмите Play, чтобы запустить симуляцию.

  • Запустите следующее в командной строке MATLAB. Заметьте, что предупреждение не испускается в Диагностическом Средстве просмотра.

msg.Position = 1:200; % array of length 200
send(pub, msg);
  • Запустите следующее в командной строке MATLAB. Заметьте, что предупреждение испускается в Диагностическом Средстве просмотра.

msg.Position = 1:300; % array of length 300
send(pub, msg);
  • Закройте модель без сохранения.

Примечание:

  • Максимальная информация о размере применяется ко всем экземплярам sensor_msgs/JointState тип сообщения. Например, если другие сообщения, используемые в модели, включают sensor_msgs/JointState обменивайтесь сообщениями, обновленный предел 256 применится ко всем тем вложенным экземплярам также.

  • Максимальная информация о размере характерна для модели и сохранена с моделью. У вас может быть две модели, открытые то использование sensor_msgs/JointState, с одной моделью с помощью предела по умолчанию 128, и другое использование пользовательского предела 256.

Работа с сообщениями Используя блок MATLAB function

Блок Bus Assignment в Simulink не поддерживает присвоение элементу в массиве шин.

Например, geometry_msgs/PoseArray сообщение имеет Poses свойство, которое требуется, чтобы быть массивом geometry_msgs/Pose сообщения. Если вы хотите присвоить определенным элементам Poses массив, который не возможен с блоком Bus Assignment.

Исследуйте, как использовать блок MATLAB function для усовершенствованной манипуляции с сообщениями, такой как присвоение вложенных сообщений.

  • Откройте модель в качестве примера. Выберите работу с Вложенными массивами подсистемы сообщений и копии.

  • Откройте новую модель Simulink. Вставьте и сохраните новую модель во временное местоположение с именем FunctionTest.slx.

  • Закройте все модели и очистите базовое рабочее пространство путем ввода clear в команде MATLAB line.

Сконфигурируйте блок присвоения MATLAB

  • Откройте модель FunctionTest.slx, дважды кликните на работе с Вложенными массивами подсистемы сообщений и откройте блок MATLAB Function - Assign. Заметьте, что это использует обозначение MATLAB, чтобы присвоить значения во вложенном массиве.

  • Функциональный блок требует типа данных шины выходные параметры (в этом случае, msg) быть явным образом заданным. Создайте все шины, требуемые для этой модели путем ввода следующего в командной строке MATLAB. Обратите внимание на то, что объекты шины создаются в рабочем пространстве MATLAB с помощью имени SL_Bus_<modelname>_<messageType>. (Это может быть сокращено, если имя модели слишком длинное.)

ros.createSimulinkBus(gcs)
  • Дважды кликните блок MATLAB Function - Assign. В редакторе MATLAB нажмите Edit Data. В Портах и Менеджере данных, выберите msg, и набор его тип к SL_Bus_FunctionTest_geometry_msgs_PoseArray. Нажмите Apply и закройте Порты и Менеджер данных.

  • Если вы не видите SL_Bus_FunctionTest_geometry_msgs_PoseArray перечисленный как опция в выпадающем списке Типа, выберите типы данных Refresh.

Сконфигурируйте сеть ROS

  • Под вкладкой Simulation выберите ROS Toolbox> ROS Network.

  • Установите Сетевой Адрес и для Ведущего устройства ROS (ROS 1) и для Хоста Узла (ROS 1) к Default.

  • Введите rosinit в командной строке MATLAB.

Запустите симуляцию

  • Под вкладкой Simulation, Временем остановки набора к 1.0, и нажмите Play, чтобы запустить симуляцию. Проверьте, что значения в блоках Отображения равны pi/2 и pi/2 + 1.

  • ros.createSimulinkBus(gcs) оператор должен быть повторно выполнен каждый раз, когда модель загружается или если рабочая область очищена. Чтобы избежать этих проблем, включайте этот оператор в коллбэк InitFcn для модели (см. Параметры Коллбэка Модели (Simulink)).

Работа со строковыми массивами

Массив строк в сообщении ROS представлен в Simulink как массив std_msgs/String сообщения. Каждый std_msgs/String сообщение имеет Data свойство, которое имеет фактические символы в строке. Каждая строка представлена как массив uint8 значения.

По умолчанию, максимальное количество std_msgs/String сообщениями в массиве строк является 16, и максимальной длиной отдельной строки является 128 'characters'. Следующие шаги показывают, как изменить эти значения по умолчанию:

Откройте модель в качестве примера и дважды кликните работу с подсистемой Строк и Строковых массивов.

Измените максимальные длины массива

  • От вкладки Simulation выберите ROS Toolbox> Variable Size Messages.

  • В Типах сообщений в столбце модели нажмите на sensor_msgs/JointState запись. Заметьте, что правая панель показывает Name свойство, которое является массивом std_msgs/String, длина имеющая 16. Изменить максимальное количество строк в Name, отмените выбор пределов значения по умолчанию Использования для этого флажка типа сообщения и введите требуемое значение.

  • В Типах сообщений в столбце модели нажмите на std_msgs/String запись. Заметьте, что правая панель показывает Data свойство, которое является массивом uint8, длина имеющая 128. Чтобы изменить максимальную длину строки, отмените выбор пределов значения по умолчанию Использования для этого флажка типа сообщения и введите требуемое значение.

  • Если вы изменяете значения по умолчанию, открываете работу с подсистемой Строк и Строковых массивов и симулируете модель. Блоки Отображения должны теперь отразить обновленные максимальные значения.

Примечание: максимальная длина Data применяется ко всем экземплярам std_msgs/String в модели. Например, блок Blank String в работе с подсистемой Строк и Строковых массивов использует std_msgs/String обменивайтесь сообщениями, таким образом, эти сообщения наследовали бы обновленную максимальную длину. Аналогично, если модель будет иметь другой тип сообщения ROS со свойством массива строк, отдельные строки в том массиве также наследуют обновленную максимальную длину.