Home » ROS与Matlab入门教程 » ROS与Matlab语言入门教程-在Simulink中使用ROS消息

ROS与Matlab语言入门教程-在Simulink中使用ROS消息

ROS消息在Simulink中被表示为总线信号,每一个ROS消息都被映射为Simulink总线中对应的域,具有如下限制:

不支持常量,常量被Simulink总线排除在外;

不支持字符串数组(ROS type string[]),被Simulink总线排斥在外;

64位整型数(ROS types int64 and uint64)在Simulink总线中被转换为双精度,因为Simulink本身不支持64位的整型数据类型;

可变长度数组(ROS type ...[])被转换为固定长度数组且最大长度可定制。默认情况下,原始类型(e.g., uint8[], float32[])的固定长度为128位,嵌入消息数组16位。

字符串(ROS type string)被转换为固定长度的uint8数组,最大长度可定制。

模型

Simulink中使用复杂ROS消息的若干例程,在MATLAB命令行中输入“robotExROSMessageUsageExample”并回车可看到如下图所示。本任务的余下部分,主要焦点是特殊场景。

请输入图片描述

任务1-访问可变长度数组的数据

ROS消息的数组的长度不能够预先知道。例如,“sensor_msgs/JointState”消息中的“Position”域是一个64位浮点可变长度数组,在任何给定的“sensor_msgs/JointState”消息,“Position”域可能有0个元素也可能具有任意多的元素。在Simulink中,要求这样的数组具有最大长度。

在本任务中,用户将会探索ROS消息中的可变长度数组在Simulink中是如何处理的。

(1)双击图14.1中的“Work with Variable-length Arrays”子系统,如下图所示。,注意,订阅器模块定义为接收发布到“my_joint_topic”话题的“sensor_msgs/JointState”类型。

请输入图片描述

(2)点击“Simulation > Update Diagram”并双击“Bus Selector”模块,消息中有三个可变长度的数组(Position、Velocity和Effort)。观察到在总线中有一个“Position_SL_Info”域。

“Position_SL_Info.ReceivedLength”保存从ROS消息接收的“Position”数组原始数据的长度,该值可为任意大。

“Position_SL_Info.CurrentLength”保存Simulink总线中“Position”数组长度,该值可为0至数组的最大值(此处128)。

请输入图片描述
(3)点击“Tools > ROS > Configure Network Addresses”,并设置ROS主控节点和“Node Host”网络地址为默认值;

(4)在MATLAB命令行中输入“rosinit”;

(5)设置仿真停止时间为“inf”,点击“Play”按钮开始仿真;

(6)在MATLAB命令行中执行如下代码:

[pub, msg] = rospublisher('/my_joint_state', 'sensor_msgs/JointState');
msg.Position = [11:2:25]; % array of length 8
send(pub, msg);

在Simulink模型中,观察“Work with Variable-length Arrays”子系统中的显示输出,注意,当前长度和接收长度是相等的。

(7)在MATLAB命令行中执行如下代码:

msg.Position = 1:130; % array of length 130
send(pub, msg);

观察到发出了警告,说明发生了截断。在Simulink模型中,观察到接收长度是130,而当前长度是128。

截断警告在命令行中显示,因为该警告消息以内部交互的形式发送。通常情况下,这些警告信息被发送到“Simulink Diagnostic Viewer”(参阅View Errors and Warnings)。

修改可变长度数组的最大尺寸

本任务中,用户将会改变Simulink中可变长度数组的最大尺寸,正如在任务1中所显示,“sensor_msgs/JointState”消息中的“Position”的默认最大长度是128,用户可以改变该限制为256。

(1)切换到“Work with Variable-length Arrays”子系统中;

(2)点击“Click on Tools > Robot Operating System (ROS) > Manage Array Sizes”;

请输入图片描述

(3)在左侧列表中点击“sensor_msgs/JointState”,然后不勾选复选框“Use default limits for this message type”,最后在“Position”数组属性对应的行输入新的值(256),点击“OK”关闭对话框。

请输入图片描述

(4)在Simulink中点击“Play”按钮开始仿真;

(5)复制下面的代码并粘贴到MATLAB命令行,观察到不再出现警告;
msg.Position = 1:200; % array of length 200
send(pub, msg);

(6)复制下面的代码并粘贴到MATLAB命令行,观察到出现警告;
msg.Position = 1:300; % array of length 300
send(pub, msg);

(7)关闭模型,不保存。

注意:

最大尺寸应用到所有“sensor_msgs/JointState”消息类型的实例,例如,如果模型中的其它消息包含“sensor_msgs/JointState”消息,那么更新的256限制也将应用到所有嵌入的实例中。

最大尺寸信息为模型中特有的,并保存在该模型中。用户可以打开两个模型且都有“sensor_msgs/JointState”消息,其中一个使用默认的128位限制,另一个使用用户的256位限制。

应用MATLAB函数模块使用消息

Simulink中的“Bus Assignment”模块不支持分配嵌入总线、分配到总线数组的元素。

例如,“geometry_msgs/Pose message”消息包含“Position”域,该域要求是“geometry_msgs/Point”类型的消息。如果用户拥有一个“geometry_msgs/Point”总线,想要分配到“geometry_msgs/Pose”总线下的“Position”域,在“Bus Assignment”模块中是无法实现的。

(1)在MATLAB命令行中运行“robotExROSMessageUsageExample”指令,选择“Work with Nested Arrays of Messages”子系统,选择“Edit > Copy”;

(2)打开一个新的Simulink模型,选择“Edit > Paste”,保存新模型到一个临时位置,命名为“FunctionTest.slx”;

(3)关闭所有模型,通过输入“clear”指令清除基本工作空间;

(4)打开“FunctionTest.slx”模型,双击“Work with Nested Arrays of Messages”子系统,打开“MATLAB Function - Assign”模块,观察到使用MATLAB符号分配值到嵌套数组中。

(5)函数模块需要明确指定总线输出的数据类型(此处,msg)。首先,通过在MATLAB命令行输入下面的代码,创建模型中需要的所有总线。注意,在MATLAB工作空间中使用“SLBus_”(如果模型名称太长则可能用缩写)命名创建的总线对象。
robotics.ros.createSimulinkBus(gcs)

(6)双击“MATLAB Function - Assign”模块,在MATLAB编辑窗口点击“Edit Data”。在“Ports and Data Manager”中,选择“msg”,下拉列表并设置类型为“SL_Bus_FunctionTest_geometry_msgs_PoseArray”,点击“Apply”并关闭“Ports and Data Manager”。

如果在数据类型下拉列表中看不到“SL_Bus_FunctionTest_geometry_msgs_PoseArray”,则选择“--Refresh data types--”。

请输入图片描述

(7)点击“Tools > ROS > Configure Network Addresses”,并设置“ROS Master”和“Node Host”的网络地址为“Default”;

(8)在MATLAB命令行中输入“rosinit”;

(9)设置仿真停止时间为1.0,并点击“Play”按钮开始仿真,确认“Display”模块中的数值为pi/2 和 pi/2 + 1。

每次模型重新载入或者工作空间被清除,“robotics.ros.createSimulinkBus(gcs)”必须重新执行一次。为防止这样的问题,可以将该语句包含到模型的回调函数“InitFcn”中(参阅Model Callback Parameters)。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与matlab语言入门教程