在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 / JointState
Message是一个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消息类型,则该数组中的单个字符串也将继承更新后的最大长度。