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