Этот пример иллюстрирует, как работать с комплексными сообщениями 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 Network из раздела Prepare. Если вы не видите ROS Toolbox, выберите Robot Operating System (ROS) на вкладке Apps под Системами управления. В диалоговом окне, которое открывается, выберите Robot Operating System (ROS) из выпадающей Сети ROS.
Установите Сетевой Адрес и для Ведущего устройства ROS (ROS 1) и для Хоста Узла (ROS 1) к Default
.
Введите rosinit
в командной строке MATLAB®.
Под вкладкой Simulation, Временем остановки набора к Inf
, и нажмите Play, чтобы запустить симуляцию.
Выполните следующее в командной строке 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
.
Под вкладкой Debug выберите Diagnostics> Diagnostic Viewer. Предупреждения обычно направляются здесь к Средству просмотра Диагностики Simulink (Диагностика вида на море (Simulink)).
Измените максимальный размер массива переменной длины в Simulink. Максимум по умолчанию Position
массив в sensor_msgs/JointState
типом сообщения является 128
. Вы измените этот предел 256
.
Откройте модель в качестве примера и дважды кликните на работе с подсистемой Переменной длины Массивов.
От вкладки Simulation выберите ROS Toolbox> Variable Size Messages.
От поля списка слева, нажмите на sensor_msgs/JointState
. Затем отменяйте пределы значения по умолчанию Использования для этого флажка типа сообщения. Наконец, введите новое значение (256
) в строке для Position
свойство массива, и нажимает ОК, чтобы закрыть диалоговое окно.
Нажмите Play, чтобы запустить симуляцию.
Запустите следующее в командной строке MATLAB. Заметьте, что предупреждение не испускается в Диагностическом Средстве просмотра.
msg.Position = 1:200; % array of length 200
send(pub, msg);
Запустите следующее в командной строке MATLAB. Заметьте, что предупреждение испускается в Диагностическом Средстве просмотра.
msg.Position = 1:300; % array of length 300
send(pub, msg);
Закройте модель без сохранения.
Примечание:
Максимальная информация о размере применяется ко всем экземплярам sensor_msgs/JointState
тип сообщения. Например, если другие сообщения, используемые в модели, включают sensor_msgs/JointState
обменивайтесь сообщениями, обновленный предел 256
применится ко всем тем вложенным экземплярам также.
Максимальная информация о размере характерна для модели и сохранена с моделью. У вас может быть две модели, открытые то использование sensor_msgs/JointState
, с одной моделью с помощью предела по умолчанию 128
, и другое использование пользовательского предела 256
.
Блок Bus Assignment в Simulink не поддерживает присвоение элементу в массиве шин.
Например, geometry_msgs/PoseArray
сообщение имеет Poses
свойство, которое требуется, чтобы быть массивом geometry_msgs/Pose
сообщения. Если вы хотите присвоить определенным элементам Poses
массив, который не возможен с блоком Bus Assignment.
Исследуйте, как использовать блок MATLAB function для усовершенствованной манипуляции с сообщениями, такой как присвоение вложенных сообщений.
Откройте модель в качестве примера. Выберите работу с Вложенными массивами подсистемы сообщений и копии.
Откройте новую модель Simulink. Вставьте и сохраните новую модель во временное местоположение с именем FunctionTest.slx
.
Закройте все модели и очистите базовое рабочее пространство путем ввода clear
в команде MATLAB line.
Откройте модель FunctionTest.slx, дважды кликните на работе с Вложенными массивами подсистемы сообщений и откройте блок MATLAB Function - Assign. Заметьте, что это использует обозначение MATLAB, чтобы присвоить значения во вложенном массиве.
Функциональный блок требует типа данных шины выходные параметры (в этом случае, msg
) быть явным образом заданным. Создайте все шины, требуемые для этой модели путем ввода следующего в командной строке MATLAB. Обратите внимание на то, что объекты шины создаются в рабочем пространстве MATLAB с помощью имени SL_Bus_<modelname>_<messageType>.
(Это может быть сокращено, если имя модели слишком длинное.)
ros.createSimulinkBus(gcs)
Дважды кликните блок MATLAB Function - Assign. В редакторе MATLAB нажмите Edit Data. В Портах и Менеджере данных, выберите msg
, и набор его тип к SL_Bus_FunctionTest_geometry_msgs_PoseArray
. Нажмите Apply и закройте Порты и Менеджер данных.
Если вы не видите SL_Bus_FunctionTest_geometry_msgs_PoseArray
перечисленный как опция в выпадающем списке Типа, выберите типы данных Refresh.
Под вкладкой Simulation выберите ROS Toolbox> ROS Network.
Установите Сетевой Адрес и для Ведущего устройства ROS (ROS 1) и для Хоста Узла (ROS 1) к Default
.
Введите rosinit
в командной строке MATLAB.
Под вкладкой Simulation, Временем остановки набора к 1.0
, и нажмите Play, чтобы запустить симуляцию. Проверьте, что значения в блоках Отображения равны 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
'characters'. Следующие шаги показывают, как изменить эти значения по умолчанию:
Откройте модель в качестве примера и дважды кликните работу с подсистемой Строк и Строковых массивов.
От вкладки Simulation выберите ROS Toolbox> Variable Size Messages.
В Типах сообщений в столбце модели нажмите на sensor_msgs/JointState
запись. Заметьте, что правая панель показывает Name
свойство, которое является массивом std_msgs/String
, длина имеющая 16
. Изменить максимальное количество строк в Name
, отмените выбор пределов значения по умолчанию Использования для этого флажка типа сообщения и введите требуемое значение.
В Типах сообщений в столбце модели нажмите на std_msgs/String
запись. Заметьте, что правая панель показывает Data
свойство, которое является массивом uint8
, длина имеющая 128
. Чтобы изменить максимальную длину строки, отмените выбор пределов значения по умолчанию Использования для этого флажка типа сообщения и введите требуемое значение.
Если вы изменяете значения по умолчанию, открываете работу с подсистемой Строк и Строковых массивов и симулируете модель. Блоки Отображения должны теперь отразить обновленные максимальные значения.
Примечание: максимальная длина Data
применяется ко всем экземплярам std_msgs/String
в модели. Например, блок Blank String в работе с подсистемой Строк и Строковых массивов использует std_msgs/String
обменивайтесь сообщениями, таким образом, эти сообщения наследовали бы обновленную максимальную длину. Аналогично, если модель будет иметь другой тип сообщения ROS со свойством массива строк, отдельные строки в том массиве также наследуют обновленную максимальную длину.