exponenta event banner

Работа с сообщениями 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 (ROS Network) в разделе Подготовка (Prepare). Если ROS Toolbox не отображается, выберите Robot Operating System (ROS) на вкладке Apps (Приложения) в разделе Control Systems (Системы управления). В открывшемся диалоговом окне выберите Robot Operating System (ROS) в раскрывающемся списке ROS Network.

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

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

Запустить моделирование

  • На вкладке Моделирование (Simulation) установите для параметра Время остановки (Stop Time) значение Infи нажмите кнопку «Воспроизведение», чтобы начать моделирование.

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

  • На вкладке Отладка выберите Диагностика > Средство просмотра диагностики. Предупреждения обычно направляются в средство просмотра диагностики Simulink (см. Просмотр диагностики (Simulink)).

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

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

  • Откройте пример модели и дважды щелкните подсистему Работа с массивами переменной длины (Work with Variable-length Arrays).

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

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

  • Нажмите кнопку «Воспроизведение», чтобы начать моделирование.

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

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

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

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

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

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

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

Конфигурирование блока назначения MATLAB

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

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

ros.createSimulinkBus(gcs)
  • Дважды щелкните по блоку MATLAB Function - Assign. В редакторе MATLAB нажмите «Редактировать данные». В окне «Ports and Data Manager» выберите msgи задайте для его типа значение SL_Bus_FunctionTest_geometry_msgs_PoseArray. Нажмите Применить и закройте Диспетчер портов и данных.

  • Если вы не видите SL_Bus_FunctionTest_geometry_msgs_PoseArray в раскрывающемся списке Тип выберите Обновить типы данных.

Конфигурирование сети ROS

  • На вкладке «Моделирование» выберите «Панель инструментов ROS» > «Сеть ROS».

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

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

Запустить моделирование

  • На вкладке Моделирование (Simulation) установите для параметра Время остановки (Stop Time) значение 1.0и нажмите кнопку «Воспроизведение» для запуска моделирования. Убедитесь, что значения в блоках отображения равны 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 персонажи. Следующие шаги показывают, как изменить эти значения по умолчанию:

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

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

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

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

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

  • После изменения значений по умолчанию откройте подсистему Работать со строками и строковыми массивами (Work with Strings and String Arrays) и смоделируйте модель. Блоки отображения теперь должны отражать обновленные максимальные значения.

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