该实施例说明如何使用在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 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
。
在Simulink所述总线分配块不支持总线的阵列内分配给万博1manbetx一个元素。万博1manbetx
例如,geometry_msgs / PoseArray
消息有一个姿势
属性,该属性要求为阵列geometry_msgs /姿势
消息。如果你想分配给的特定元素姿势
阵列,这是不可能与总线分配块。
探索如何使用高级消息操纵MATLAB功能块如嵌套消息的分配。
打开例如模型。选择有消息嵌套数组工作子系统和复制。
打开一个新的Simul万博1manbetxink模型。膏和新的模式保存到一个临时位置,名称FunctionTest.slx
。
关闭所有车型,并通过键入清基工作区明确
在MATLAB命令行。
打开上的FunctionTest.slx模式,双击有消息嵌套数组工作子系统,并打开MATLAB功能 - 分配块。观察到,它使用MATLAB符号来分配的值嵌套数组内。
功能块所需总线输出的数据类型(在这种情况下,味精
)被明确指定。通过输入在MATLAB命令行下面创建此模型所需的所有公交车。注意,总线对象在工作区MATLAB使用的名称创建SL_Bus_
(如果模型名称过长,有时简称。)
ros.create万博1manbetxSimulinkBus(GCS)
双击MATLAB功能 - 分配块。在MATLAB编辑器,单击编辑数据。在端口和数据管理, 选择味精
和其类型设置为SL_Bus_FunctionTest_geometry_msgs_PoseArray
。请点击应用并关闭端口和数据管理。
如果您没有看到SL_Bus_FunctionTest_geometry_msgs_PoseArray
列为选项类型下拉列表中,选择刷新的数据类型。
在下面模拟选项卡,选中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消息类型,即阵列中的个别字符串将也继承更新最大长度。