Работа с сообщениями 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 message является массивом переменной длины из 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).

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

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

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

  • На вкладке Simulation выберите ROS Network в разделе Prepare. Если вы не видите ROS Toolbox, выберите Robot Operating System (ROS) на вкладке Apps в разделе Control Systems. В открывшемся диалоговом окне выберите Robot Operating System (ROS) из раскрывающегося списка ROS Network.

  • Установите сетевой адрес для ROS Master (ROS 1) и узла (ROS 1) на Default.

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

Выполняйте симуляцию

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

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

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

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

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

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

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

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

  • Откройте пример модели и дважды щелкните по Подсистеме «Работа с массивами переменной длины».

  • На вкладке Simulation выберите ROS Toolbox > Сообщения о размере переменной.

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

  • Щелкните Воспроизведение (Play), чтобы начать симуляцию.

  • Выполните следующее в командной строке MATLAB. Обратите внимание, что предупреждение не выдается в Diagnostic Viewer.

msg.Position = 1:200; % array of length 200
send(pub, msg);
  • Выполните следующее в командной строке MATLAB. Обратите внимание, что предупреждение выдается в Diagnostic Viewer.

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

Блок «Назначение шины» в Simulink не поддерживает назначение элемента в массиве шин.

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

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

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

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

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

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

  • Откройте модель FunctionTest.slx, дважды кликните по Подсистеме Работа Nested Arrays of Messages и откройте блок Функция MATLAB - присвоение. Обратите внимание, что он использует обозначение MATLAB для назначения значений внутри вложенного массива.

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

ros.createSimulinkBus(gcs)
  • Дважды кликните Функцию MATLAB - Присвоение блока. В редакторе MATLAB нажмите Edit Data. В Ports and Data Manager выберите msg, и установите его тип SL_Bus_FunctionTest_geometry_msgs_PoseArray. Щелкните Применить (Apply) и закройте Диспетчер портов и данных (Ports and Data manag

  • Если вы не видите SL_Bus_FunctionTest_geometry_msgs_PoseArray в качестве опции в выпадающий список Тип (Type) выберите Обновить типы данных.

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

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

  • Установите сетевой адрес для ROS Master (ROS 1) и узла (ROS 1) на Default.

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

Выполняйте симуляцию

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

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

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

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

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

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

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

  • На вкладке Simulation выберите ROS Toolbox > Сообщения о размере переменной.

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

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

  • Если вы измените значения по умолчанию, откройте Подсистему «Работа со строками Строковых массивов и» и симулируйте модель. Теперь блоки Display должны отражать обновленные максимальные значения.

Примечание: Максимальная длина Data применяется ко всем образцам std_msgs/String в модели. Для примера блок Blank String в Work with Strings и Строковые массивы подсистеме использует std_msgs/String сообщение, таким образом эти сообщения наследуют обновленную максимальную длину. Точно так же, если у модели есть другой тип сообщения ROS со свойством строковые массивы, отдельные строки в этом массиве также наследуют обновленную максимальную длину.