此示例说明了如何在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类型细绳[]
)转换为固定长度的数组std_msgs / string.
具有可定制的最大长度。默认最大长度为16个字符串。
当Simuli金宝appnk总线转换为ROS消息时,消息字段恢复为其本机ROS类型。例如,ROS消息类型std_msgs /标题
有一个领域,框架
,这是一个字符串。在相应的Simulink总线中金宝app框架
领域是A.uint8
大堆当总线转换为ROS消息时,框架
转换回一个字符串。
这以下模型有几个例子在Simulink中使用复杂的ROS消息。金宝app此示例中的其余任务侧重于特定方案。
开放式系统('robotrosmessageusageexample');
ROS消息可以具有长度(元素数)无法预先确定的数组位置
A.在A.Sensor_msgs / threetstate.
消息是64位浮点数的可变长度阵列。在任何给定Sensor_msgs / threetstate.
讯息位置
数组可以没有元素,也可以有任意多的元素。在Si金宝appmulink中,这样的数组需要具有最大长度。
打开示例模型并探索ROS消息中的变量长度阵列在以下步骤中以Simulink处理。金宝app
开放式系统('robotrosmessageusage排名索取/使用可变长度阵列的工作);
双击使用可变长度阵列子系统。请注意订阅块配置为接收发送到主题的消息/我的共同话题
作为消息类型,Sensor_msgs / threetstate.
.
在下面建模选项卡,单击更新模型。
双击总线选择器块。消息中有三个可变长度阵列(位置
那速度
, 和气力
)。
注意有一个位置信息
公共汽车的领域。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)到默认
.
进来罗斯尼特
在Matlab®命令行。
在“模拟”选项卡下,设置停止时间到正
,然后点击玩开始模拟。
在matlab命令行执行以下内容。
[pub,msg]=rospublisher(' / my_joint_state '那“传感器/连接状态”);msg.position = [11:2:25];%数组8发送(PUB,MSG);
观察陈列输出在使用可变长度阵列子系统。注意现在的
长度
和已收到
长度
他们是平等的。
在matlab命令行执行以下内容。
味精位置=1:130;%长度为130的数组发送(PUB,MSG);
观察到发出警告,表明截断发生了截断。这已收到
长度
现在是130
和现在的
长度
是128
.
在下面调试选项卡,选择诊断学>诊断查看器. 警告通常在此处发送到Simulink诊断查看器(请参阅金宝app查看诊断(金宝appSimulink))。
在Simulink中更改可变长度阵列的最大大小。金宝app默认最大值位置
阵列在Sensor_msgs / threetstate.
消息类型是128
.您将更改此限制为256
.
打开示例模型,双击使用可变长度阵列子系统。
从模拟选项卡,选择ROS工具箱>可变大小消息.
从左侧的列表框中,单击Sensor_msgs / threetstate.
.然后,取消选择使用此消息类型的默认限制复选框。最后,输入新值(256
)连续位置
数组属性,然后单击好的关闭对话框。
点击玩开始模拟。
在MATLAB命令行中运行以下命令。注意,在诊断查看器.
味精位置=1:200;%长度为200的数组发送(PUB,MSG);
在MATLAB命令行中运行以下命令诊断查看器.
消息位置=1:300;%长度为300的数组发送(PUB,MSG);
关闭模型而不保存。
注:
最大大小信息适用于的所有实例Sensor_msgs / threetstate.
消息类型。例如,如果模型中使用的其他消息包括Sensor_msgs / threetstate.
消息,更新的256
也将应用于所有这些嵌套实例。
最大大小信息是特定于模型的,并与模型一起保存。你可以有两个型号打开使用Sensor_msgs / threetstate.
,其中一个模型使用默认限制128
,另一个使用自定义限制256
.
Simulink中的总线分配块不支持分配给总线阵列内的元金宝app素。金宝app
例如,一个geometry_msgs / posearray.
消息有一个姿势
属性,该属性必须是geometry_msgs / pose.
消息。如果要分配给姿势
阵列,总线分配块是不可能的。
探索如何使用MATLAB功能块进行高级消息操作,例如指定嵌套消息。
打开示例模型.选择使用嵌套的消息数组子系统和副本。
打开一个新的Simul金宝appink模型。使用名称将新模型粘贴并保存到临时位置functiontest.slx.
.
关闭所有型号,并通过键入清除基础工作区清晰的
在MATLAB命令行中.
打开FunctionTest.slx模型,双击使用嵌套的消息数组子系统,打开MATLAB功能 - 分配块。观察它使用MATLAB符号在嵌套数组中赋值。
功能块需要总线输出的数据类型(在这种情况下,味精
)明确指定。通过在MATLAB命令行输入以下命令,创建此模型所需的所有总线。注意,总线对象是在MATLAB工作空间中使用名称创建的sl_bus_
(如果模型名称太长,则可能会缩写。)
ROS.Create金宝appsimulinkbus(GCS)
双击MATLAB功能 - 分配在MATLAB编辑器中,单击编辑数据在里面端口和数据管理器选择味精
,并将其类型设置为SL_总线_功能测试_几何体_msgs_POSARRAY
.点击申请和关闭端口和数据管理器.
如果你看不到SL_总线_功能测试_几何体_msgs_POSARRAY
在列表中作为选项列出类型下拉,选择刷新数据类型.
在下面模拟选项卡,选择ROS工具箱>ROS网络.
设定网络地址对彼此而言ROS主管(ROS 1)和节点主机(ROS 1)到默认
.
进来罗斯尼特
在MATLAB命令行中。
在下面模拟标签,设置停止时间到1.0
,然后点击玩运行模拟。验证值中的值陈列块等于PI / 2.
和pi/2+1
.
这ROS.Create金宝appsimulinkbus(GCS)
每次加载模型或者如果工作空间被清除,则必须重新运行语句。为避免这些问题,请在模型的initfcn回调中包含此语句(请参阅模型回调参数(金宝appSimulink))。
ROS消息中的字符串数组在Simulink中表示为金宝appstd_msgs / string.
消息。每个std_msgs / string.
消息有一个数据
字符串中具有实际字符的属性。每个字符串表示为数组uint8
价值观
默认情况下,最大数量std_msgs / string.
字符串数组中的消息是16
,单个字符串的最大长度为128
人物。以下步骤显示如何更改这些默认值:
打开示例模型,并双击使用字符串和字符串数组子系统。
从模拟选项卡,选择ROS工具箱>可变大小消息.
在里面模型中的消息类型列中,单击Sensor_msgs / threetstate.
条目。注意右边的窗格显示了a名称
属于一系列的财产std_msgs / string.
,最大长度为16
。更改中字符串的最大数目名称
,取消选择使用此消息类型的默认限制复选框并输入所需的值。
在里面模型中的消息类型列中,单击std_msgs / string.
条目。注意右边的窗格显示了a数据
属于一系列的财产uint8
,最大长度为128
。若要更改字符串的最大长度,请取消选择使用此消息类型的默认限制复选框并输入所需的值。
更改默认值后,打开使用字符串和字符串数组并对模型进行了仿真陈列块现在应反映更新的最大值。
注:最大长度为数据
适用于的所有实例std_msgs / string.
在模型中。例如,空白字符串块使用字符串和字符串数组子系统使用A.std_msgs / string.
消息,因此这些消息将继承更新后的最大长度。同样,如果模型具有另一个具有字符串数组属性的ROS消息类型,则该数组中的各个字符串也将继承更新后的最大长度。