Этот пример иллюстрирует, как работать с комплексными сообщениями ROS в Simulink, такими как сообщения с вложенными подсообщениями и массивами переменной длины.
Сообщения ROS представлены, когда шина сигнализирует в Simulink. Каждое поле сообщения 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, массив Положения не может иметь никаких элементов, или это может иметь произвольно большое количество элементов. В Simulink такие массивы требуются, чтобы иметь максимальную длину.
В этой задаче вы исследуете, как массивы переменной длины в сообщениях ROS обработаны в Simulink.
1. Откройте модель в качестве примера и дважды кликните на работе с подсистемой Переменной длины Массивов. Обратите внимание на то, что блок Subscribe сконфигурирован, чтобы получить сообщения, отправленные в тему "my_joint_topic" типа "sensor_msgs/JointState".
open_system('robotROSMessageUsageExample/Work with Variable-length Arrays');
2. Нажмите на Simulation> Update Diagram, затем дважды кликните на блоке Селектора Шины. Существует три массива переменной длины в сообщении (Положение, Скорость и Усилие). Заметьте, что существует поле Position_SL_Info в шине.
Position_SL_Info. ReceivedLength содержит длину массива Положения в исходном полученном сообщении ROS. Это значение может быть произвольно большим.
Position_SL_Info. CurrentLength содержит длину массива Положения в сигнале шины Simulink. Это может отличаться между 0 и максимальная длина массива (128, в этом случае).
3. Нажмите на Tools> ROS> Configure Network Addresses и установите адреса сети ROS Master и Node Host Принимать значение по умолчанию.
4. Введите rosinit
в командной строке MATLAB®.
5. Установите время остановки симуляции на inf
и кликните по кнопке воспроизведения, чтобы запустить симуляцию.
6. Выполните следующее в командной строке MATLAB.
[pub, msg] = rospublisher('/my_joint_state', 'sensor_msgs/JointState'); msg.Position = [11:2:25]; % array of length 8 send(pub, msg);
В модели Simulink наблюдайте Display выходные параметры в работе с подсистемой Переменной длины Массивов. Обратите внимание на то, что Текущая Длина и Полученная Длина равны.
7. Выполните следующее в командной строке MATLAB.
msg.Position = 1:130; % array of length 130
send(pub, msg);
Заметьте, что предупреждение испускается, указывая, что усечение произошло. В модели Simulink заметьте, что Полученная Длина равняется теперь 130, и Текущая Длина равняется 128.
Усечение, предупреждающее, показывают в командной строке, потому что сообщение отправляется в интерактивном режиме. В целом эти предупреждения направляются к Средству просмотра Диагностики Simulink (Диагностика вида на море (Simulink)).
В этой задаче вы измените максимальный размер массива переменной длины в Simulink. Как показано в Задаче 1, максимум по умолчанию массива Положения в sensor_msgs/JointState типе сообщения равняется 128. Вы измените этот предел 256.
1. Откройте модель в качестве примера и дважды кликните на работе с подсистемой Переменной длины Массивов.
2. Нажмите на Tools> Robot Operating System> Manage Array Sizes.
3. От поля списка слева, нажмите на sensor_msgs/JointState. Затем снимите флажок для пределов значения по умолчанию Использования для этого типа сообщения. Наконец, введите новое значение (256
) в строку для свойства массива Положения и нажмите ОК, чтобы закрыть диалоговое окно.
4. Кликните по кнопке воспроизведения в Simulink, чтобы запустить симуляцию.
5. Скопируйте и вставьте следующее в командной строке MATLAB. Заметьте, что предупреждение не испускается.
msg.Position = 1:200; % array of length 200
send(pub, msg);
6. Скопируйте и вставьте следующее в командной строке MATLAB. Заметьте, что предупреждение испускается.
msg.Position = 1:300; % array of length 300
send(pub, msg);
7. Закройте модель без сохранения.
Примечание:
Максимальная информация о размере применяется ко всем экземплярам sensor_msgs/JointState типа сообщения. Например, если другие сообщения, используемые в модели, будут включать сообщение sensor_msgs/JointState, обновленный предел 256 применится ко всем тем вложенным экземплярам также.
Максимальная информация о размере характерна для модели и сохранена с моделью. У вас может быть две модели, открытые, которые используют sensor_msgs/JointState с одной моделью с помощью предела по умолчанию 128, и другое использование пользовательского предела 256.
Блок Bus Assignment в Simulink не поддерживает присвоение элементу в массиве шин.
Например, сообщение geometry_msgs/PoseArray имеет свойство Poses, которое требуется, чтобы быть массивом сообщений geometry_msgs/Pose. Если вы хотите присвоить определенным элементам массива Положений, который не возможен с блоком Bus Assignment.
В этой задаче вы исследуете, как использовать блок MATLAB function для усовершенствованной манипуляции с сообщениями, такой как присвоение вложенных сообщений.
1. Откройте модель в качестве примера. Выберите работу с Вложенными массивами подсистемы сообщений и выберите Edit> Copy.
2. Откройте новую модель Simulink. Выберите Edit> Paste. Сохраните новую модель во временное местоположение с именем FunctionTest.slx
.
3. Закройте все модели и очистите базовое рабочее пространство путем ввода clear
4. Откройте модель FunctionTest.slx, дважды кликните на работе с Вложенными массивами подсистемы сообщений и откройте блок MATLAB Function - Assign. Заметьте, что это использует обозначение MATLAB, чтобы присвоить значения во вложенном массиве.
5. Функциональный блок требует, чтобы тип данных шины выходные параметры (в этом случае, сообщение) был явным образом задан. Сначала создайте все шины, требуемые для этой модели путем ввода следующего в командной строке MATLAB. Обратите внимание на то, что объекты шины создаются в рабочем пространстве MATLAB с помощью имени SL_Bus_<modelname>_<messageType>
(это может быть сокращено, если имя модели слишком длинное).
robotics.ros.createSimulinkBus(gcs)
6. Дважды кликните на блоке MATLAB Function - Assign. В редакторе MATLAB нажмите на Edit Data. В Портах и Менеджере данных, выберите сообщение, установите его тип на SL_Bus_FunctionTest_geometry_msgs_PoseArray. Нажмите Apply и закройте Порты и Менеджер данных.
Если вы не видите, что SL_Bus_FunctionTest_geometry_msgs_PoseArray, перечисленные как опция в выпадающем типе данных, выбирают - типы данных Обновления-.
7. Нажмите на Tools> ROS> Configure Network Addresses и установите адреса сети ROS Master и Node Host Принимать значение по умолчанию.
8. Введите rosinit
в командной строке MATLAB.
9. Установите время остановки симуляции на 1.0
и кликните по кнопке воспроизведения, чтобы запустить симуляцию. Проверьте, что значения в блоках Отображения равны пи/2 и пи/2 + 1.
Оператор robotics.ros.createSimulinkBus(gcs)
должен быть повторно выполнен каждый раз, когда модель загружается или если рабочая область очищена. Чтобы избежать этих проблем, включайте этот оператор в коллбэк InitFcn для модели (см. Образцовые Параметры Коллбэка (Simulink)).
Массив строк в сообщении ROS представлен в Simulink как массив сообщений std_msgs/String. Каждое сообщение std_msgs/String имеет Свойство данных, которое имеет фактические символы в строке. Каждая строка представлена как массив значений uint8
.
По умолчанию максимальное количество сообщений std_msgs/String в массиве строк равняется 16, и максимальная длина отдельной строки является 128 символами. Следующие шаги показывают, как изменить эти значения по умолчанию:
1. Откройте модель в качестве примера и дважды кликните на работе с подсистемой Строк и Строковых массивов.
2. Нажмите на Tools> Robot Operating System> Manage Array Sizes.
3. В "Типах сообщений в модели" столбец, нажмите на sensor_msgs/JointState запись. Заметьте, что правая панель показывает свойство Name, которое является массивом std_msgs/String, длиной имеющей 16. Чтобы изменить максимальное количество строк на Имя, снимите флажок "Use default limits for this message type" и введите требуемое значение.
4. В "Типах сообщений в модели" столбец, нажмите на std_msgs/String запись. Заметьте, что правая панель показывает Свойство данных, которое является массивом uint8, длиной имеющей 128. Чтобы изменить максимальную длину строки, снимите флажок "Use default limits for this message type" и введите требуемое значение.
5. Если вы изменяете значения по умолчанию, открываете работу с подсистемой Строк и Строковых массивов и моделируете модель. Блоки Отображения должны теперь отразить обновленные максимальные значения.
ПРИМЕЧАНИЕ: максимальная длина Данных применяется ко всем экземплярам std_msgs/String в модели. Например, блок Blank String в работе с подсистемой Строк и Строковых массивов использует сообщение std_msgs/String, таким образом, эти сообщения наследовали бы обновленную максимальную длину. Аналогично, если модель будет иметь другой тип сообщения ROS со свойством массива строк, отдельные строки в том массиве также наследуют обновленную максимальную длину.
Этот пример показал вам, как извлечь сигналы из комплексного сообщения ROS и как присвоить сигналы ему. Это также показало вам, как данные об извлечении из массивов переменной длины и обновляют максимальные размеры массивов.