В этом примере показано, как работать со сложными сообщениями 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).

На вкладке Моделирование (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.
Блок назначения шины в Simulink не поддерживает назначение элемента внутри массива шин.
Например, geometry_msgs/PoseArray сообщение имеет Poses свойство, которое должно быть массивом geometry_msgs/Pose сообщения. Если требуется назначить определенным элементам Poses массив, что невозможно при использовании блока Bus Assignment.
Узнайте, как использовать функциональный блок MATLAB для расширенной обработки сообщений, например назначения вложенных сообщений.
Откройте пример модели. Выберите подсистему Работа с вложенными массивами сообщений и скопируйте.
Откройте новую модель Simulink. Вставка и сохранение новой модели во временное расположение с именем FunctionTest.slx.
Закройте все модели и очистите базовую рабочую область, введя clear в командной строке 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 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, отдельные строки в этом массиве также наследуют обновленную максимальную длину.