主要内容

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

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

介绍

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

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

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

  • 设置网络地址对于这两个活性氧大师(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

使用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_Bus_FunctionTest_geometry_msgs_PoseArray.点击应用并关闭端口和数据管理器

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

配置ROS网络

  • 模拟选项卡上,选择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消息类型,该数组中的单个字符串也将继承更新后的最大长度。