主要内容

在Simulink®中使用ROS消息万博1manbetx

这个示例演示了如何在Simulink中处理复杂的ROS消息,比如嵌套子消息和可变长度数组的消息。万博1manbetx

介绍

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

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

  • 64位的整数(ROS类型int64uint64)在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网络下拉。

  • 设置网络地址两者皆有活性氧大师(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

使用MATLAB功能块处理消息

Simulink中的总线分配块不支持对总线数组中的元素进万博1manbetx行赋值。万博1manbetx

例如,一个几何图形\u msgs/posarray消息有一个摆姿势属性,该属性必须是数组几何图形/姿势消息。如果你想赋值给摆姿势阵列,这在总线分配块中是不可能的。

探索如何使用MATLAB函数块进行高级消息操作,如嵌套消息的赋值。

  • 打开示例模型. 选择使用嵌套的消息数组子系统和副本。

  • 打开一个新的Simul万博1manbetxink模型。将新模型粘贴并保存到一个带有名称的临时位置FunctionTest.slx

  • 关闭所有模型,然后键入以清除基本工作区清晰的在MATLAB命令行中

配置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网络

  • 设置网络地址两者皆有活性氧大师(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消息类型,该数组中的单个字符串也将继承更新后的最大长度。