在Simulink®中ROS信息工作万博1manbetx

该实施例说明如何使用在Simulink复杂ROS消息,诸如具有嵌套的子消息和可变长度数组消息工作。万博1manbetx

介绍

在ROS Si万博1manbetxmulink模型,总线信号表示ROS消息。一个ROS消息的每个字段是对应于在Simulink的总线的字段,但有以下限制:万博1manbetx

  • 常量不支持,并从Si万博1manbetxmulink的总线被排除在外。万博1manbetx

  • 64位整数(ROS类型Int64的UINT64)转换到双打在Simulink总线,因为这样的Simul万博1manbetxink本身不支持64位整数数据类型。万博1manbetx

  • 变长数组(ROS类型... [])转换到固定长度的阵列,可定制的最大长度。默认情况下,固定长度是128,用于基本类型(例如,UINT8 []FLOAT32 []),以及16的消息的嵌套的数组(例如,geometry_msgs /点[])。

  • 字符串(ROS类型)转换到固定长度UINT8阵列具有可定制的最大长度,具有128个字符的缺省最大长度。

  • 字符串数组(ROS类型串[])转换成的一个固定长度的阵列std_msgs /字符串用定制的最大长度。默认的最大长度为16名的字符串。

当Simuli万博1manbetxnk的总线转换成ROS消息,该消息字段恢复为原生ROS的类型。例如,ROS消息类型std_msgs /头有一个领域,FrameId,这是一个字符串。在相应的Simulink总线,所述万博1manbetxFrameId字段是UINT8阵列。当总线转换为ROS消息FrameId转换回一个字符串。

模型

下面的模型与Simulink中复杂的ROS信息工作的几个例子。万博1manbetx任务在这个例子集中在特定的场景中休息。

open_system('robotROSMessageUsageExample');

访问数据中的可变长度数组

甲ROS消息可以具有长度的数组(元素的数量)不能被预先确定。例如,位置在一个领域sensor_msgs / JointState消息是64位浮点数一个可变长度的数组。在任何给定的sensor_msgs / JointState消息,所述位置阵列可以具有没有元素或者其可以具有任意大量的元件。在Si万博1manbetxmulink,需要这样的阵列具有最大长度。

打开例如模型和探索如何在ROS消息的可变长度数组在Simulink在下面的步骤进行处理。万博1manbetx

open_system(“具有可变长度数组robotROSMessageUsageExample /工作”);
  • 双击与变长数组工作子系统。注意,订阅块被配置成接收发送到主题的消息/ my_joint_topic如消息类型,sensor_msgs / JointState

  • 在下面造型选项卡,单击更新模型。

  • 在双击总线选择块。有在该消息中三个可变长度数组(位置速度功夫)。

  • 注意,有一个Position_SL_Info在客车领域。Position_SL_Info.ReceivedLength持有的长度位置阵列中的原始接收ROS消息。这个值可以任意大。Position_SL_Info.CurrentLength持有的长度位置阵列在Simulink总线万博1manbetx信号。这可以在0和所述阵列的最大长度(128,在这种情况下)之间变化。

配置ROS网络

  • 在下面模拟选项卡,选中ROS工具箱>ROS网络。如果您没有看到ROS工具箱中选择模型设置在下面造型标签。在里面配置参数对话选择机器人操作系统(ROS)为了硬板落下请点击关闭对话框。

  • 设置网络地址对彼此而言ROS硕士(ROS 1)节点主机(ROS 1)默认

  • 输入rosinit在MATLAB®命令行。

运行仿真

  • 在模拟选项卡,设置停止时间天道酬勤和点击开始模拟。

  • 执行在MATLAB命令行下面。

[酒馆,MSG] = rospublisher('/ my_joint_state''sensor_msgs / JointState');msg.Position = [11:2:25];长度为8的%阵列发送(酒吧,味精);
  • 观察显示在输出与变长数组工作子系统。注意当前长度收到长度是相等的。

  • 执行在MATLAB命令行下面。

msg.Position = 1:130;长度130%阵列发送(酒吧,味精);
  • 观察一会发出警告,指示截断发生。该收到长度就是现在130当前长度128

  • 在下面调试选项卡,选中诊断>诊断查看器。警告通常这里路由到Simulink的诊断查看器(见万博1manbetx查看诊断(万博1manbetxSimulink中))。

一个可变长度数组修改最大尺寸

改变在Simulink可变长度数组的最大大小。万博1manbetx默认最大的位置阵列中的sensor_msgs / JointState消息类型是128。你会改变这个限制256

  • 打开例如模型上,并双击与变长数组工作子系统。

  • 来自模拟选项卡,选中ROS工具箱>可变大小的邮件

  • 从左边的列表框中,点击sensor_msgs / JointState。然后,取消选择使用默认限制该消息类型复选框。最后,输入新的值(256)的行中的位置数组属性,然后单击关闭对话框。

  • 请点击开始模拟。

  • 运行在MATLAB命令行下面。观察到的警告未在发射诊断查看器

msg.Position = 1:200;长度200的阵列%发送(酒吧,味精);
  • 运行在MATLAB命令行下面。观察曾提出警告,在发射诊断查看器

msg.Position = 1:300;长度300的阵列%发送(酒吧,味精);
  • 关闭模型而不保存。

注意:

  • 最大尺寸信息适用于的所有实例sensor_msgs / JointState消息类型。例如,如果在模型中使用的其它消息包括sensor_msgs / JointState消息的更新的限额256将适用于所有这些嵌套的情况下也是如此。

  • 最大大小的信息是特定于模型,并保存与模型。你可以有两种模式打开使用sensor_msgs / JointState,用一个模式的默认限制128,另一个使用的自定义限制256

与邮件使用MATLAB功能块的工作

在Simulink所述总线分配块不支持总线的阵列内分配给万博1manbetx一个元素。万博1manbetx

例如,geometry_msgs / PoseArray消息有一个姿势属性,该属性要求为阵列geometry_msgs /姿势消息。如果你想分配给的特定元素姿势阵列,这是不可能与总线分配块。

探索如何使用高级消息操纵MATLAB功能块如嵌套消息的分配。

  • 打开例如模型。选择有消息嵌套数组工作子系统和复制。

  • 打开一个新的Simul万博1manbetxink模型。膏和新的模式保存到一个临时位置,名称FunctionTest.slx

  • 关闭所有车型,并通过键入清基工作区明确在MATLAB命令行

配置MATLAB分配块

  • 打开上的FunctionTest.slx模式,双击有消息嵌套数组工作子系统,并打开MATLAB功能 - 分配块。观察到,它使用MATLAB符号来分配的值嵌套数组内。

  • 功能块所需总线输出的数据类型(在这种情况下,味精)被明确指定。通过输入在MATLAB命令行下面创建此模型所需的所有公交车。注意,总线对象在工作区MATLAB使用的名称创建SL_Bus_ _ <为messageType>。(如果模型名称过长,有时简称。)

ros.create万博1manbetxSimulinkBus(GCS)
  • 双击MATLAB功能 - 分配块。在MATLAB编辑器,单击编辑数据。在端口和数据管理, 选择味精和其类型设置为SL_Bus_FunctionTest_geometry_msgs_PoseArray。请点击应用并关闭端口和数据管理

  • 如果您没有看到SL_Bus_FunctionTest_geometry_msgs_PoseArray列为选项类型下拉列表中,选择刷新的数据类型

配置ROS网络

  • 在下面模拟选项卡,选中ROS工具箱>ROS网络

  • 设置网络地址对彼此而言ROS硕士(ROS 1)节点主机(ROS 1)默认

  • 输入rosinit在MATLAB命令行。

运行仿真

  • 在下面模拟选项卡,设置停止时间1.0和点击运行模拟。验证在值显示块是等于Pi / 2相PI / 2 + 1

  • ros.create万博1manbetxSimulinkBus(GCS)声明必须在模型每次被加载,或者如果工作空间被清除后,重新运行。为了避免这些问题,包括在InitFcn回调模型这个声明(见模型的参数回调(万博1manbetxSimulink中))。

与字符串数组工作

在ROS消息的字符串阵列在Simulink表示为阵列万博1manbetxstd_msgs /字符串消息。每std_msgs /字符串消息有一个数据具有字符串中的实际字符属性。每个串被表示为阵列UINT8值。

默认情况下,最大数量std_msgs /字符串在一个字符串数组消息是16以及个别字符串的最大长度是128字符。下列步骤显示了如何更改这些默认值:

打开例如模型,并双击用字符串和字符串数组工作子系统。

变化最大的数组长度

  • 来自模拟选项卡,选中ROS工具箱>可变大小的邮件

  • 在里面消息类型模型列,点击sensor_msgs / JointState条目。观察到右侧窗格显示名称属性,该属性是阵列std_msgs /字符串,具有一个最大长度16。要更改字符串的最大数量名称,取消选择使用默认限制该消息类型复选框并输入所需的值。

  • 在里面消息类型模型列,点击std_msgs /字符串条目。观察到右侧窗格显示数据属性,该属性是阵列UINT8,具有一个最大长度128。要改变字符串的最大长度,取消选择使用默认限制该消息类型复选框并输入所需的值。

  • 一旦你更改默认值,开用字符串和字符串数组工作子系统和模拟模型。该显示块现在应该反映更新后的最大值。

注:最大长度数据适用于所有实例std_msgs /字符串在模型中。例如,空字符串阻断用字符串和字符串数组工作子系统使用一std_msgs /字符串消息,所以这些消息将继承更新最大长度。同样地,如果模型具有一个字符串数组属性另一个ROS消息类型,即阵列中的个别字符串将也继承更新最大长度。