此示例说明了如何在Simulink中处理复杂的ROS消息,例如具有嵌套子消息和可变长度数组的消息。金宝app
在ROS Si金宝appmulink模型中,总线信号表示ROS消息。ROS消息的每个字段对应于Simulink总线中的一个字段,但有以下限制:
常数不受支持,并且被金宝app排除在Simulink总线之外。金宝app
64位整数(ROS类型int64
和uint64
)在Simulink总线中转换为双精度,因为Simuli金宝appnk本机不支持64位整数数据类型。金宝app
可变长度数组(ROS类型…[]
)转换为具有可自定义最大长度的固定长度数组。默认情况下,基本类型的固定长度是128(例如,uint8[]
,float32 []
),对于嵌套的消息数组(例如。,几何图形\u 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本例中的其余任务集中于特定的场景。
开放式系统(“robotROSMessageUsageExample”);
ROS消息可以具有长度(元素数)无法预先确定的数组位置
在一个sensor_msgs / JointState
Message是一个64位浮点数的变长数组。在任何给定的sensor_msgs / JointState
讯息位置
数组可以没有元素,也可以有任意多的元素。在Si金宝appmulink中,这样的数组需要具有最大长度。
打开示例模型并在下面的步骤中探索如何在Simulink中处理ROS消息中的变长数组。金宝app
开放式系统('robotROSMessageUsageExample/Work with Variable-length Arrays');
双击使用变长数组子系统。请注意订阅块被配置为接收发送到主题的消息/我的共同话题
作为消息类型,sensor_msgs / JointState
.
下建模选项卡上,单击更新模型。
双击总线选择器块。消息中有三个变长数组(位置
,速度
,气力
).
注意有一个位置信息
在公共汽车上。Position_SL_Info。ReceivedLength
的长度位置
原始收到的ROS消息中的数组。此值可以任意大。位置信息当前长度
的长度位置
Simulink总线信号中金宝app的阵列。这可能在0和阵列的最大长度(本例中为128)之间变化。
下模拟选项卡上,选择ROS网络从准备部分.如果没有看到“ROS工具箱”,请选择机器人操作系统(ROS)在“应用程序”选项卡下控制系统在里面the dialog box that opens up, select机器人操作系统(ROS)从ROS网络下拉列表。
设定网络地址对于这两个ROS主管(ROS 1)和节点主机(ROS 1)到默认的
.
进来rosinit
在MATLAB®命令行。
在“模拟”选项卡下设置停止时间到Inf
,然后单击玩开始模拟。
在MATLAB命令行中执行以下命令。
[pub,msg]=rospublisher(' / my_joint_state ',“传感器/连接状态”);味精。位置= [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命令行中运行以下命令诊断查看器.
消息位置=1:300;%长度为300的数组发送(酒吧,味精);
关闭模型而不保存。
注意:
最大大小信息适用于的所有实例sensor_msgs / JointState
消息类型。例如,如果模型中使用的其他消息包括sensor_msgs / JointState
消息,更新的256
也将应用于所有这些嵌套实例。
最大尺寸信息特定于模型,并与模型一起保存。您可以打开两个模型,使用sensor_msgs / JointState
,其中一个模型使用默认限制128
,另一个使用自定义限制256
.
Simulink中的总线分配块不支持分配给总线阵列内的元金宝app素。金宝app
例如,一个geometry_msgs / PoseArray
消息都有一个提出了
属性,该属性必须是geometry_msgs /构成
消息。如果要分配给提出了
数组,这在总线分配块中是不可能的。
探索如何使用MATLAB功能块进行高级消息操作,例如指定嵌套消息。
打开示例模型.选择使用嵌套的消息数组子系统和复制。
打开一个新的Simul金宝appink模型。使用名称将新模型粘贴并保存到临时位置FunctionTest.slx
.
关闭所有模型,并通过键入清除基本工作区清晰的
在MATLAB命令行中.
打开FunctionTest.slx模型,双击使用嵌套的消息数组子系统,打开MATLAB函数-赋值块。观察它使用MATLAB符号在嵌套数组中赋值。
功能块需要总线输出的数据类型(在这种情况下,味精
)明确指定。通过在MATLAB命令行输入以下命令,创建此模型所需的所有总线。注意,总线对象是在MATLAB工作空间中使用名称创建的SL_Bus_ < modelname > _ < messageType >。
(如果模型名称太长,可能会缩写。)
ros.create金宝appSimulinkBus (gcs)
双击MATLAB函数-赋值在MATLAB编辑器中,单击编辑数据在里面端口和数据管理器中,选择味精
,并将其类型设置为SL_总线_功能测试_几何体_msgs_POSARRAY
.点击应用并关闭端口和数据管理器.
如果你看不见SL_总线_功能测试_几何体_msgs_POSARRAY
在列表中作为选项列出类型下拉,选择刷新数据类型.
下模拟选项卡上,选择ROS工具箱>ROS网络.
设定网络地址对于这两个ROS主管(ROS 1)和节点主机(ROS 1)到默认的
.
进来rosinit
在MATLAB命令行中。
下模拟选项卡,设置停止时间到1.0
,然后单击玩来运行模拟。中的值是否正确陈列块等于π/ 2
和pi/2+1
.
的ros.create金宝appSimulinkBus (gcs)
语句必须在每次加载模型或清除工作空间时重新运行。为了避免这些问题,在模型的InitFcn回调中包含这条语句(参见模型回调参数(金宝app模型)).
ROS消息中的字符串数组在Simulink中表示为金宝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消息类型,则该数组中的各个字符串也将继承更新后的最大长度。