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