主要内容

在Simulink®中使用ROS消息金宝app

此示例说明了如何在Simulink中处理复杂的ROS消息,例如具有嵌套子消息和可变长度数组的消息。金宝app

介绍

在ROS Si金宝appmulink模型中,总线信号表示ROS消息。ROS消息的每个字段对应于Simulink总线中的一个字段,但有以下限制:

  • 常数不受支持,并且被金宝app排除在Simulink总线之外。金宝app

  • 64位整数(ROS类型int64uint64)在Simulink总线中转换为双精度,因为Simuli金宝appnk本机不支持64位整数数据类型。金宝app

  • 可变长度数组(ROS类型…[])转换为具有可自定义最大长度的固定长度数组。默认情况下,基本类型的固定长度是128(例如,uint8[]float32 []),对于嵌套的消息数组(例如。,几何图形\u 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本例中的其余任务集中于特定的场景。

开放式系统(“robotROSMessageUsageExample”);

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

ROS消息可以具有长度(元素数)无法预先确定的数组位置在一个sensor_msgs / JointStateMessage是一个64位浮点数的变长数组。在任何给定的sensor_msgs / JointState讯息位置数组可以没有元素,也可以有任意多的元素。在Si金宝appmulink中,这样的数组需要具有最大长度。

打开示例模型并在下面的步骤中探索如何在Simulink中处理ROS消息中的变长数组。金宝app

开放式系统('robotROSMessageUsageExample/Work with Variable-length Arrays');
  • 双击使用变长数组子系统。请注意订阅块被配置为接收发送到主题的消息/我的共同话题作为消息类型,sensor_msgs / JointState

  • 建模选项卡上,单击更新模型。

  • 双击总线选择器块。消息中有三个变长数组(位置速度,气力).

  • 注意有一个位置信息在公共汽车上。Position_SL_Info。ReceivedLength的长度位置原始收到的ROS消息中的数组。此值可以任意大。位置信息当前长度的长度位置Simulink总线信号中金宝app的阵列。这可能在0和阵列的最大长度(本例中为128)之间变化。

配置ROS网络

  • 模拟选项卡上,选择ROS网络准备部分如果没有看到“ROS工具箱”,请选择机器人操作系统(ROS)在“应用程序”选项卡下控制系统在里面the dialog box that opens up, select机器人操作系统(ROS)ROS网络下拉列表。

  • 设定网络地址对于这两个ROS主管(ROS 1)节点主机(ROS 1)默认的

  • 进来rosinit在MATLAB®命令行。

运行仿真

  • 在“模拟”选项卡下设置停止时间Inf,然后单击开始模拟。

  • 在MATLAB命令行中执行以下命令。

[pub,msg]=rospublisher(' / my_joint_state '“传感器/连接状态”);味精。位置= [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命令行中运行以下命令诊断查看器

消息位置=1:300;%长度为300的数组发送(酒吧,味精);
  • 关闭模型而不保存。

注意:

  • 最大大小信息适用于的所有实例sensor_msgs / JointState消息类型。例如,如果模型中使用的其他消息包括sensor_msgs / JointState消息,更新的256也将应用于所有这些嵌套实例。

  • 最大尺寸信息特定于模型,并与模型一起保存。您可以打开两个模型,使用sensor_msgs / JointState,其中一个模型使用默认限制128,另一个使用自定义限制256

使用MATLAB函数块处理消息

Simulink中的总线分配块不支持分配给总线阵列内的元金宝app素。金宝app

例如,一个geometry_msgs / PoseArray消息都有一个提出了属性,该属性必须是geometry_msgs /构成消息。如果要分配给提出了数组,这在总线分配块中是不可能的。

探索如何使用MATLAB功能块进行高级消息操作,例如指定嵌套消息。

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

  • 打开一个新的Simul金宝appink模型。使用名称将新模型粘贴并保存到临时位置FunctionTest.slx

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

配置MATLAB分配块

  • 打开FunctionTest.slx模型,双击使用嵌套的消息数组子系统,打开MATLAB函数-赋值块。观察它使用MATLAB符号在嵌套数组中赋值。

  • 功能块需要总线输出的数据类型(在这种情况下,味精)明确指定。通过在MATLAB命令行输入以下命令,创建此模型所需的所有总线。注意,总线对象是在MATLAB工作空间中使用名称创建的SL_Bus_ < modelname > _ < messageType >。(如果模型名称太长,可能会缩写。)

ros.create金宝appSimulinkBus (gcs)
  • 双击MATLAB函数-赋值在MATLAB编辑器中,单击编辑数据在里面端口和数据管理器中,选择味精,并将其类型设置为SL_总线_功能测试_几何体_msgs_POSARRAY.点击应用并关闭端口和数据管理器

  • 如果你看不见SL_总线_功能测试_几何体_msgs_POSARRAY在列表中作为选项列出类型下拉,选择刷新数据类型

配置ROS网络

  • 模拟选项卡上,选择ROS工具箱>ROS网络

  • 设定网络地址对于这两个ROS主管(ROS 1)节点主机(ROS 1)默认的

  • 进来rosinit在MATLAB命令行中。

运行仿真

  • 模拟选项卡,设置停止时间1.0,然后单击来运行模拟。中的值是否正确陈列块等于π/ 2pi/2+1

  • ros.create金宝appSimulinkBus (gcs)语句必须在每次加载模型或清除工作空间时重新运行。为了避免这些问题,在模型的InitFcn回调中包含这条语句(参见模型回调参数(金宝app模型)).

使用字符串数组

ROS消息中的字符串数组在Simulink中表示为金宝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消息类型,则该数组中的各个字符串也将继承更新后的最大长度。