这个示例演示了如何在Simulink中处理复杂的ROS消息,比如嵌套子消息和可变长度数组的消息。金宝app
在ROS Si金宝appmulink模型中,总线信号代表ROS消息。一个ROS消息的每个字段对应于Simulink总线中的一个字段,有以下限制:金宝app
常量不受支持,并且被金宝app排除在Simulink总线之外。金宝app
64位的整数(ROS类型int64
和uint64
)在Simulink总线中转换为双精度,因为Simuli金宝appnk本身不支持64位整数数据类型。金宝app
变长数组(ROS类型…[]
)转换为具有可自定义最大长度的固定长度数组。默认情况下,基本类型的固定长度是128(例如,uint8 []
,float32 []
), 16用于嵌套的消息数组(例如,geometry_msgs /点[]
).
字符串(ROS类型字符串
)转换为固定长度uint8
具有可自定义最大长度的数组,默认最大长度为128个字符。
字符串数组(ROS类型string []
)转换为固定长度的数组std_msgs /字符串
具有可定制的最大长度。默认最大长度为16个字符串。
当Simuli金宝appnk总线转换为ROS消息时,消息字段恢复为它们的本地ROS类型。例如,ROS消息类型std_msgs /头
有一个领域,FrameId
,它是一个字符串。在相应的Simulink总线中金宝appFrameId
字段是一个uint8
数组中。当总线转换为ROS消息时,FrameId
转换回字符串。
的以下模型有几个在Simulink中处理复杂ROS消息的示例。金宝app本例中的其余任务集中于特定的场景。
open_system (“robotROSMessageUsageExample”);
一个ROS消息可以有多个不能预先确定长度(即元素个数)的数组。例如,位置
在一个sensor_msgs / JointState
Message是一个64位浮点数的变长数组。在任何给定的sensor_msgs / JointState
消息,位置
数组可以没有元素,也可以有任意多的元素。在Si金宝appmulink中,这样的数组需要具有最大长度。
打开示例模型并在下面的步骤中探索如何在Simulink中处理ROS消息中的变长数组。金宝app
open_system ('robotROSMessageUsageExample/Work with Variable-length Arrays');
双击使用变长数组子系统。请注意,订阅块被配置为接收发送到主题的消息/ my_joint_topic
消息类型,sensor_msgs / JointState
.
下建模选项卡上,单击更新模型。
双击总线选择器块。消息中有三个变长数组(位置
,速度
,努力
).
观察有一个Position_SL_Info
在公共汽车上。Position_SL_Info。ReceivedLength
的长度位置
收到的原始ROS报文中的array。这个值可以任意大。Position_SL_Info。CurrentLength
的长度位置
在Simulink总线信号金宝app。这可以在0和数组的最大长度(在本例中是128)之间变化。
下模拟选项卡上,选择ROS网络从准备部分.如果没有看到“ROS工具箱”,请选择机器人操作系统(ROS)在“应用程序”选项卡下控制系统.在打开的对话框中,选择机器人操作系统(ROS)从ROS网络下拉。
设置网络地址对于这两个活性氧大师(ROS 1)和节点主机(ROS 1)来默认的
.
输入rosinit
在MATLAB®命令行。
在“模拟”选项卡下设置停止时间来正
,然后单击玩开始仿真。
在MATLAB命令行中执行以下命令。
[pub, msg] = ropublisher (' / my_joint_state ',“sensor_msgs / JointState”);味精。位置= [11:2:25];长度为8的数组发送(酒吧,味精);
观察显示输出的使用变长数组子系统。请注意,当前的
长度
和收到了
长度
是相等的。
在MATLAB命令行中执行以下命令。
味精。位置= 1:130;长度为130的数组发送(酒吧,味精);
注意,会发出一个警告,表明发生了截断。的收到了
长度
现在是130
和当前的
长度
是128
.
下调试选项卡上,选择诊断>诊断查看器.警告通常在这里路由到Simulink诊断查看器(参见金宝app视图诊断(金宝app模型)).
在Simulink中更改可变长度数组的最大大小。金宝app的默认最大值位置
数组的sensor_msgs / JointState
消息类型是128
.您将更改此限制为256
.
打开示例模型,双击使用变长数组子系统。
从模拟选项卡上,选择ROS工具箱>可变大小的消息.
从左边的列表框中单击sensor_msgs / JointState
.然后,取消选择对此消息类型使用默认限制复选框。最后,输入新值(256
)在那排位置
属性,单击好吧关闭对话框。
点击玩开始仿真。
在MATLAB命令行中运行以下命令。注意,在诊断查看器.
味精。位置= 1:200;长度为200的数组发送(酒吧,味精);
在MATLAB命令行中运行以下命令。注意,在诊断查看器.
味精。位置=施用;长度为300的数组发送(酒吧,味精);
关闭模型而不保存。
注意:
属性的所有实例都适用最大大小信息sensor_msgs / JointState
消息类型。例如,如果模型中使用的其他消息包括sensor_msgs / JointState
消息,更新的限制256
也适用于所有的嵌套实例。
最大大小信息是特定于模型的,并与模型一起保存。你可以有两个型号打开使用sensor_msgs / JointState
,其中一个模型使用默认限制128
,另一种使用自定义的限制256
.
Simulink中的总线分配块不支持对总线数组中的元素进金宝app行赋值。金宝app
例如,一个geometry_msgs / PoseArray
消息都有一个提出了
属性,该属性必须是数组geometry_msgs /构成
消息。如果你想赋值给提出了
数组,这在总线分配块中是不可能的。
探索如何使用MATLAB函数块进行高级消息操作,如嵌套消息的赋值。
打开示例模型.选择使用嵌套的消息数组子系统和复制。
打开一个新的Simul金宝appink模型。将新模型粘贴并保存到一个带有名称的临时位置FunctionTest.slx
.
关闭所有模型,并通过键入清除基本工作区清晰的
在MATLAB命令行中.
打开FunctionTest。SLX模型,双击使用嵌套的消息数组子系统,打开MATLAB函数-赋值块。观察它使用MATLAB符号在嵌套数组中赋值。
函数块需要总线输出的数据类型(在本例中,味精
)明确指定。通过在MATLAB命令行输入以下命令,创建此模型所需的所有总线。注意,总线对象是在MATLAB工作空间中使用名称创建的SL_Bus_ < modelname > _ < messageType >。
(如果模型名称太长,可能会缩写。)
ros.create金宝appSimulinkBus (gcs)
双击MATLAB函数-赋值块。在MATLAB编辑器中,单击编辑数据.在端口和数据管理器中,选择味精
,并将其类型设置为SL_Bus_FunctionTest_geometry_msgs_PoseArray
.点击应用并关闭端口和数据管理器.
如果你看不见SL_Bus_FunctionTest_geometry_msgs_PoseArray
的选项类型下拉,选择刷新数据类型.
下模拟选项卡上,选择ROS工具箱>ROS网络.
设置网络地址对于这两个活性氧大师(ROS 1)和节点主机(ROS 1)来默认的
.
输入rosinit
在MATLAB命令行。
下模拟选项卡,设置停止时间来1.0
,然后单击玩来运行模拟。中的值是否正确显示块等于π/ 2
和π/ 2 + 1
.
的ros.create金宝appSimulinkBus (gcs)
语句必须在每次加载模型或清除工作空间时重新运行。为了避免这些问题,在模型的InitFcn回调中包含这条语句(参见回调参数模型(金宝app模型)).
在Simulink中,ROS消息中的字符串数组表示为金宝appstd_msgs /字符串
消息。每一个std_msgs /字符串
消息都有一个数据
属性,该属性具有字符串中的实际字符。每个字符串表示为一个数组uint8
值。
缺省情况下,最大数量std_msgs /字符串
字符串数组中的消息为16
,单个字符串的最大长度为128
字符。以下步骤显示如何更改这些默认值:
打开示例模型,然后双击使用字符串和字符串数组子系统。
从模拟选项卡上,选择ROS工具箱>可变大小的消息.
在模型中的消息类型列,单击sensor_msgs / JointState
条目。注意右边的窗格显示了a的名字
属性的数组std_msgs /字符串
,最大长度为16
.中字符串的最大数目的名字
,请取消对此消息类型使用默认限制复选框,并输入所需的值。
在模型中的消息类型列,单击std_msgs /字符串
条目。注意右边的窗格显示了a数据
属性的数组uint8
,最大长度为128
.要更改字符串的最大长度,请取消选择对此消息类型使用默认限制复选框,并输入所需的值。
更改默认值后,打开使用字符串和字符串数组并对模型进行仿真。的显示块现在应该反映更新的最大值。
注:最大长度数据
适用于……的所有实例std_msgs /字符串
在模型中。例如,空字符串块在使用字符串和字符串数组子系统使用std_msgs /字符串
消息,因此这些消息将继承更新后的最大长度。同样,如果模型有另一个带有字符串数组属性的ROS消息类型,该数组中的单个字符串也将继承更新后的最大长度。