主要内容

在Simulink中使用ROS消息金宝app

这个例子说明了如何在Simulink中处理复杂的ROS消息,例如带有嵌套子消息和变长数组的消息。金宝app

简介

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

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

  • 64位的整数(ROS类型int64而且uint64)在Simulink总线中转换为双精度数据类型,因为Si金宝appmulink本身不支持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 / JointStateMessage是一个64位浮点数的变长数组。在任何给定条件下sensor_msgs / JointState消息,位置数组可以没有元素,也可以有任意数量的元素。在Si金宝appmulink中,这样的数组需要有一个最大长度。

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

open_system (“robotROSMessageUsageExample/使用变长数组”);
  • 双击使用可变长度数组子系统。注意订阅块被配置为接收发送到主题的消息/ my_joint_topic作为消息类型,sensor_msgs / JointState

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

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

  • 观察到有一个Position_SL_Info场在大巴上。Position_SL_Info。ReceivedLength对象的长度位置原始接收到的ROS消息中的数组。这个值可以任意大。Position_SL_Info。CurrentLength对象的长度位置Simulink总线信号中金宝app的数组。这可以在0到数组的最大长度之间变化(在本例中为128)。

配置ROS网络

  • 模拟选项卡上,选择ROS网络准备部分如果没有看到ROS工具箱,请选择机器人操作系统(ROS)在应用程序选项卡,下面控制系统.在打开的对话框中,选择机器人操作系统(ROS)ROS网络下拉。

  • 设置网络地址对于这两个ROS Master (ROS 1)而且节点主机(ROS 1)默认的

  • 输入rosinit在MATLAB®命令行。

运行仿真

  • 在Simulation选项卡下,设置停止时间,并单击开始模拟。

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

[pub, msg] = rospublisher(' / my_joint_state '“sensor_msgs / JointState”);味精。位置= [11:2:25];%长度为8的数组发送(酒吧,味精);
  • 观察显示输出使用可变长度数组子系统。请注意,当前的长度而且收到了长度是相等的。

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

味精。位置= 1:30 0;%长度为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命令行中输入以下命令,创建此模型所需的所有总线。注意,总线对象是使用名称创建的SL_Bus_ < modelname > _ < messageType >并存储在Simulink数据字典中金宝approbotlib.您可以在下面找到这个数据字典来自库的外部数据>模型浏览器.(如果模型名称太长,总线名称可以缩写。)

ros.create金宝appSimulinkBus (gcs)
  • 双击MATLAB函数-赋值块。在MATLAB编辑器工具条中,在建模选项卡上,单击符号面板.然后右键点击味精中,选择检查并设置其类型为SL_Bus_FunctionTest_geometry_msgs_PoseArray.点击应用并关闭端口和数据管理器

  • 如果你看不见SL_Bus_FunctionTest_geometry_msgs_PoseArray中列出的选项类型下拉,选择刷新数据类型

配置ROS网络

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

  • 设置网络地址对于这两个ROS Master (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条目。注意,右边窗格显示了一个的名字属性的数组std_msgs /字符串,最大长度为16.更改中的最大字符串数的名字,取消选择对此消息类型使用默认限制复选框并输入所需的值。

  • 模型中的消息类型列,单击std_msgs /字符串条目。注意,右边窗格显示了一个数据属性的数组uint8,最大长度为128.要更改字符串的最大长度,请取消选择对此消息类型使用默认限制复选框并输入所需的值。

  • 更改默认值后,打开使用字符串和字符串数组子系统,并对模型进行仿真。的显示块现在应该反映更新的最大值。

注:最大长度数据的所有实例std_msgs /字符串在模型中。例如,空字符串块在使用字符串和字符串数组子系统使用std_msgs /字符串消息,因此这些消息将继承更新后的最大长度。同样,如果模型具有另一个具有字符串数组属性的ROS消息类型,则该数组中的单个字符串也将继承更新后的最大长度。