这个示例演示了如何在Simulink中处理复杂的ROS消息,比如嵌套子消息和可变长度数组的消息。万博1manbetx
在ROS Si万博1manbetxmulink模型中,总线信号代表ROS消息。一个ROS消息的每个字段对应于Simulink总线中的一个字段,有以下限制:万博1manbetx
常量不支持,并从Si万博1manbetxmulink总线中排除。万博1manbetx
64位的整数(ROS类型int64
和uint64
)在Simulink总线中转换为双精度,因为Simuli万博1manbetxnk本身不支持64位整数数据类型。万博1manbetx
变长数组(ROS类型...[]
)转换为具有可自定义最大长度的固定长度数组。默认情况下,基元类型的固定长度为128(例如。,uint8 []
,浮动32[]
), 16用于嵌套的消息数组(例如,geometry_msgs /点[]
).
串(ROS类型字符串
)转换为固定长度uint8
具有可自定义最大长度的数组,默认最大长度为128个字符。
字符串数组(ROS类型字符串[]
)转换为的固定长度数组标准msgs/字符串
具有可自定义的最大长度。默认最大长度为16个字符串。
当Simuli万博1manbetxnk总线转换为ROS消息时,消息字段恢复为它们的本地ROS类型。例如,ROS消息类型标准msgs/收割台
有一个领域,框架ID
,它是一个字符串。在相应的Simulink总线中万博1manbetx框架ID
字段是一个uint8
数组中。当总线转换为ROS消息时,框架ID
转换回字符串。
这个仿效有几个在Simulink中处理复杂ROS消息的示例。本例中的其余任务侧重于特定场景。万博1manbetx
open_system (“robotROSMessageUsageExample”);
一个ROS消息可以有多个不能预先确定长度(即元素个数)的数组。例如,位置
田野传感器\u msgs/接头状态
消息是一个64位浮点的可变长度数组。无论如何传感器\u msgs/接头状态
消息,位置
数组可以没有元素,也可以有任意多的元素。在Si万博1manbetxmulink中,这样的数组需要具有最大长度。
打开示例模型并在以下步骤中探索如何在Simulink中处理ROS消息中的可变长度数组。万博1manbetx
open_system ('robotROSMessageUsageExample/使用可变长度数组');
双击使用可变长度数组子系统。请注意,订阅块配置为接收发送到主题的消息/ my_joint_topic
消息类型,传感器\u msgs/接头状态
.
在建模选项卡,单击更新模型。
双击总线选择器块消息中有三个可变长度数组(位置
,速度
和努力
).
观察有一个Position_SL_Info
在公共汽车上。位置\u SL\u信息接收长度
保持数据的长度位置
收到的原始ROS报文中的array。这个值可以任意大。Position_SL_Info。CurrentLength
保持数据的长度位置
在Simulink总线信号万博1manbetx。这可以在0和数组的最大长度(在本例中是128)之间变化。
在模拟选项卡,选择ROS网络从准备部分.如果没有看到“ROS工具箱”,请选择机器人操作系统(ROS)在“应用程序”选项卡上的控制系统. 在打开的对话框中,选择机器人操作系统(ROS)从ROS网络下拉。
设置网络地址两者皆有活性氧大师(ROS 1)和节点主机(ROS 1)来违约
.
输入松香
在MATLAB®命令行中。
在“模拟”选项卡下,设置停止时间来正
,然后单击玩开始仿真。
在MATLAB命令行中执行以下操作。
[pub, msg] = ropublisher (' / my_joint_state ',“sensor_msgs / JointState”); 消息位置=[11:2:25];%长度为8的数组发送(发布,消息);
遵守显示世界银行的产出使用可变长度数组子系统。请注意,当前的
长
和收到
长
是相等的。
在MATLAB命令行中执行以下操作。
味精。位置= 1:130;长度为130的数组发送(发布,消息);
观察是否发出警告,指示已发生截断收到
长
现在是130
和当前的
长
是128
.
在调试选项卡,选择诊断>诊断查看器.警告通常在这里路由到Simulink诊断查看器(参见万博1manbetx视图诊断(万博1manbetxSimulink)).
更改Simulink中可变长度数组的最大大小。默认值为万博1manbetx位置
数组中的传感器\u msgs/接头状态
消息类型为128
.您将更改此限制为256
.
打开示例模型,然后双击使用可变长度数组子系统。
从模拟选项卡,选择ROS工具箱>可变大小消息.
从左边的列表框中单击传感器\u msgs/接头状态
.然后,取消选择对此消息类型使用默认限制复选框。最后,输入新值(256
)排在第一排位置
属性,然后单击好啊关闭对话框。
点击玩开始仿真。
在MATLAB命令行中运行以下命令。注意,在诊断查看器.
味精。位置= 1:200;长度为200的数组发送(发布,消息);
在MATLAB命令行中运行以下命令。注意,在诊断查看器.
味精。位置=施用;长度为300的数组发送(发布,消息);
关闭模型而不保存。
注意:
属性的所有实例都适用最大大小信息传感器\u msgs/接头状态
消息类型。例如,如果模型中使用的其他消息包括传感器\u msgs/接头状态
消息,更新的限制256
也适用于所有的嵌套实例。
最大大小信息是特定于模型的,并与模型一起保存。你可以有两个型号打开使用传感器\u msgs/接头状态
,其中一个模型使用默认限制128
,另一种使用自定义的限制256
.
Simulink中的总线分配块不支持对总线数组中的元素进万博1manbetx行赋值。万博1manbetx
例如,一个几何图形\u msgs/posarray
消息有一个摆姿势
属性,该属性必须是数组几何图形/姿势
消息。如果你想赋值给摆姿势
阵列,这在总线分配块中是不可能的。
探索如何使用MATLAB函数块进行高级消息操作,如嵌套消息的赋值。
打开示例模型. 选择使用嵌套的消息数组子系统和副本。
打开一个新的Simul万博1manbetxink模型。将新模型粘贴并保存到一个带有名称的临时位置FunctionTest.slx
.
关闭所有模型,然后键入以清除基本工作区清晰的
在MATLAB命令行中.
打开FunctionTest。SLX模型,双击使用嵌套的消息数组子系统,并打开MATLAB函数分配块。观察它使用MATLAB符号在嵌套数组中赋值。
函数块需要总线输出的数据类型(在本例中,味精
)明确指定。通过在MATLAB命令行输入以下命令,创建此模型所需的所有总线。注意,总线对象是在MATLAB工作空间中使用名称创建的SL_总线
(如果模型名称太长,则可以缩写。)
ros.create万博1manbetxSimulinkBus(地面军事系统)
双击MATLAB函数分配块。在MATLAB编辑器中,单击编辑数据.在端口和数据管理器中,选择味精
,并将其类型设置为SL_Bus_FunctionTest_geometry_msgs_PoseArray
. 点击申请接近端口和数据管理器.
如果你没有看到SL_Bus_FunctionTest_geometry_msgs_PoseArray
的选项类型下拉列表,选择刷新数据类型.
在模拟选项卡,选择ROS工具箱>ROS网络.
设置网络地址两者皆有活性氧大师(ROS 1)和节点主机(ROS 1)来违约
.
输入松香
在MATLAB命令行。
在模拟选项卡,设置停止时间来1
,然后单击玩要运行模拟,请验证显示块等于pi/2
和π/ 2 + 1
.
这个ros.create万博1manbetxSimulinkBus(地面军事系统)
语句必须在每次加载模型或清除工作区时重新运行。为避免这些问题,请将此语句包含在模型的InitFcn回调中(请参阅回调参数模型(万博1manbetxSimulink)).
在Simulink中,ROS消息中的字符串数组表示为万博1manbetx标准msgs/字符串
信息。每个标准msgs/字符串
消息有一个数据
属性,该属性在字符串中包含实际字符。每个字符串表示为uint8
值。
默认情况下,最大的标准msgs/字符串
字符串数组中的消息是16
,单个字符串的最大长度为128
人物。以下步骤显示了如何更改这些默认值:
打开示例模型,然后双击使用字符串和字符串数组子系统。
从模拟选项卡,选择ROS工具箱>可变大小消息.
在模型中的消息类型列,单击传感器\u msgs/接头状态
条目。注意右边的窗格显示了a的名字
属性的数组标准msgs/字符串
,最大长度为16
.中字符串的最大数目的名字
,取消选择对此消息类型使用默认限制复选框,并输入所需的值。
在模型中的消息类型列,单击标准msgs/字符串
条目。注意右边的窗格显示了a数据
属性的数组uint8
,最大长度为128
.要更改字符串的最大长度,请取消选择对此消息类型使用默认限制复选框,并输入所需的值。
更改默认值后,打开使用字符串和字符串数组并对模型进行仿真。这个显示块现在应该反映更新的最大值。
注:最大长度数据
适用于……的所有实例标准msgs/字符串
在模型中。例如空白字符串阻挡使用字符串和字符串数组子系统使用标准msgs/字符串
消息,因此这些消息将继承更新后的最大长度。同样,如果模型有另一个带有字符串数组属性的ROS消息类型,该数组中的单个字符串也将继承更新后的最大长度。