主要内容

在仿真软件与ROS消息金宝app

这个例子演示了如何使用复杂的ROS消息在仿真软件中,如消息和嵌套sub-messages变长数组。金宝app

介绍

在ROS仿真软金宝app件模型,代表ROS消息总线信号。每个字段的ROS在仿真软件总线消息对应一个字段,用以下限制:金宝app

  • 常量不支持,被排除在金宝app模型汽车。金宝app

  • 变长数组(ROS类型…[]和可定制的最大长度)转换成固定长度的数组。默认情况下,固定长度是128原始类型(例如,uint8 [],float32 []嵌套的数组的消息),16(例如,geometry_msgs /点[])。

  • 字符串(ROS类型字符串)转换为固定长度的uint8数组可定制的最大长度,默认的最大长度为128个字符。

  • 字符串数组(ROS类型string [])转换为一个固定长度的数组std_msgs /字符串一个可定制的最大长度。默认的最大长度是16字符串。

当仿真软件总线金宝app转换ROS消息,消息字段恢复故土ROS类型。例如,ROS消息类型std_msgs /头有一个领域,FrameId,这是一个字符串。在相应的仿真软件总线,金宝appFrameId字段是一个uint8数组中。当ROS的总线转换消息时,FrameId转换回一个字符串。

模型

以下模型有几个例子仿真软件的处理复杂ROS的消息。金宝app剩下的任务在这个例子中专注于特定的场景。

open_system (“robotROSMessageUsageExample”);

变长数组访问数据

ROS消息可以有数组的长度()的元素数量不能预先确定的。例如,位置在一个sensor_msgs / JointState消息是一个变长数组的64位浮点数。在任何给定的sensor_msgs / JointState消息,位置数组可以没有元素也可以有任意多的元素。在仿真金宝app软件,这样的数组是需要有一个最大长度。

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

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

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

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

  • 观察到有一个Position_SL_Info在公共汽车。Position_SL_Info.ReceivedLength持有的长度位置数组在最初收到ROS的信息。这个值可以任意大。Position_SL_Info.CurrentLength持有的长度位置阵列的仿真软件总线信号。金宝app这可以改变介于0和数组的最大长度(128年,在这种情况下)。

配置ROS网络

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

  • 设置网络地址对于这两个活性氧(ROS大师1)节点主机(ROS 1)默认的

  • 输入rosinit在MATLAB®命令行。

运行仿真

  • 根据模拟选项卡,设置停止时间,然后单击开始仿真。

  • 在MATLAB命令行执行以下。

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

  • 在MATLAB命令行执行以下。

味精。位置= 1:130;130年%的数组长度发送(酒吧,味精);
  • 观察发出一个警告,表明发生了截断。的收到了长度现在是130年当前的长度128年

  • 调试选项卡上,选择诊断>诊断查看器。警告通常路由模型诊断查看器(见金宝app视图诊断(金宝app模型))。

修改变长数组的最大大小

改变模型的变长数组的最大大小。金宝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函数处理消息块

仿真软件不支持的总线分配块分配的数组内元素的公交车。金宝app金宝app

例如,一个geometry_msgs / PoseArray消息都有一个提出了房地产,这是需要的数组geometry_msgs /构成消息。如果你想分配给特定的元素提出了与总线数组,这是不可能的任务。

探索如何使用MATLAB等高级消息操作的功能块任务嵌套的消息。

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

  • 打开一个新的仿真软件模金宝app型。粘贴,将新模型保存到一个临时位置的名称FunctionTest.slx

  • 关闭所有模型,通过输入和明确的基本工作空间清晰的在MATLAB命令行

配置MATLAB分配块

  • 打开FunctionTest。基金模型,双击使用嵌套数组的消息子系统,并打开MATLAB函数——分配块。观察到它使用MATLAB符号赋值在一个嵌套的数组。

  • 功能块需要总线输出的数据类型(在这个例子中,味精)显式地指定。创建所有巴士需要这个模型通过输入下面的MATLAB命令行。注意,总线对象创建使用这个名字SL_Bus_ < modelname > _ < messageType >并存储在模型数据字典金宝approbotlib。你可以找到这些数据字典外部数据>从库模型浏览器。(总线名称可能是缩写如果模型名称太长。)

ros.create金宝appSimulinkBus (gcs)
  • 双击MATLAB函数——分配块。在MATLAB将来发布编辑建模选项卡上,单击符号面板。然后右键单击味精中,选择检查并设置其类型SL_Bus_FunctionTest_geometry_msgs_PoseArray。点击应用并关闭港口和数据管理器

  • 如果您没有看到SL_Bus_FunctionTest_geometry_msgs_PoseArray上市作为一个选项类型下拉,选择刷新数据类型

  • 如果您使用的是适应信息在MATLAB函数块,您必须启用动态内存分配在MATLAB函数设置下模型设置>模拟目标>高级参数

配置ROS网络

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

  • 设置网络地址对于这两个活性氧(ROS大师1)节点主机(ROS 1)默认的

  • 输入rosinit在MATLAB命令行。

运行仿真

  • 模拟选项卡,设置停止时间1.0,然后单击运行仿真。验证中的值显示块等于π/ 2π/ 2 + 1

  • ros.create金宝appSimulinkBus (gcs)声明必须重新运行每次加载模型。为了避免这些问题,包括该语句(参见InitFcn回调的模型回调参数模型(金宝app模型))。

使用字符串数组

一个字符串数组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消息类型字符串数组属性,单个字符串数组也将继承更新的最大长度。