Этот пример иллюстрирует работу со сложными сообщениями 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, в этом случае).

На вкладке 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.
Блок «Назначение шины» в 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) выберите Обновить типы данных.


На вкладке 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 со свойством строковые массивы, отдельные строки в этом массиве также наследуют обновленную максимальную длину.