主要内容

在Simulink®中开始使用ROS万博1manbetx

这个例子展示了如何使用Simulink块为ROS发送和接收来万博1manbetx自本地ROS网络的消息。

介绍

万博1manbet万博1manbetxx对机器人操作系统(ROS)的Simulink支持使您能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层,允许机器人系统的不同组件以的形式交换信息消息.组件通过出版这是一个特殊的问题主题,如/里程计.其他组件接收消息订阅这个话题。

万博1manbet万博1manbetxx对ROS的Simulink支持包括一个Simulink块库,用于发送和接收指定主题的消息。模拟模型时,Simulink连接到ROS网络,该网络可以与Simulink在同一台机器上运行,也可以在远程系统上运行。一旦建立此连接,Simulink将与ROS网络交换消息,直到模拟终止。中频Simulink编码器™ 安装后,还可以为独立的ROS组件生成C++代码,或者节点,来自Simulink万博1manbetx模型。

此示例显示了如何:

  • 搭建ROS环境

  • 创建并运行Simulink模型来发万博1manbetx送和接收ROS消息

  • 处理ROS消息中的数据

先决条件:创建一个简单的模型(万博1manbetx模型)开始使用ROS

模型

您将使用Simulink发万博1manbetx布XY机器人的位置。您还将订阅相同的位置主题并显示收到的位置信息XY的位置。

输入以下命令以打开已完成的模型中创建的例子。

open_system (“robotROSGetStartedExample”);

初始化ROS

每个ROS网络都有一个罗斯大师协调ROS网络的所有部分。对于本例,请使用MATLAB®在本地系统上创建ROS主机。Simulink自动检测并使用本地ROS主机。万博1manbetx

在MATLAB命令行上,执行以下操作:

rosinit

创建一个出版商

配置块以发送geometry_msgs /点将消息发送到名为的主题/位置(“/“是标准的ROS语法)。

  • 从MATLAB Toolstrip中,选择首页>万博1manbetx打开Simuli万博1manbetxnk开始页。

  • 在Si万博1manbetxmulink开始页,在万博1manbetx点击空白模型创建并打开新的Simulink模型。万博1manbetx

  • 从Simulink万博1manbetx工具条中选择模拟>库浏览器打开Simulink库浏万博1manbetx览器。点击ROS工具箱TAB(你也可以输入roslib在MATLAB命令窗口)。选择ROS图书馆。

  • 发布块到模型。双击该块以配置主题和消息类型。

  • 选择指定您自己的课题来源,然后进入/位置主题

  • 点击选择旁边消息类型. 将出现一个弹出窗口。挑选geometry_msgs /点点击好吧关闭弹出窗口。

创建ROS消息

创建一条空白ROS消息,并用XY机器人路径的位置。然后将更新的ROS消息发布到ROS网络。

一条ROS消息表示为总线信号在Si万博1manbetxmulink中,总线信号是一组Simulink信号,也可以包括其他总线信号(参见探索Simuli万博1manbetxnk总线功能(万博1manbetx模型)概述示例)。罗斯空白信息模块输出对应于ROS消息的Sim万博1manbetxulink总线信号。

  • 点击ROS工具箱选项卡,或键入roslib在MATLAB命令行。选择ROS图书馆。

  • 空白信息块到模型。双击块以打开块掩码。

  • 点击选择旁边的消息类型框,并选择geometry_msgs /点从结果弹出窗口。点击好吧关闭块掩码。

  • 万博1manbetx>信号路由选项卡,在库浏览器中拖动公交车分配块。

  • 连接设备的输出端口空白信息块到的总线输入端口公交车分配块连接设备的输出端口公交车分配块的输入端口ROS发布块。

  • 双击公交车分配块。您应该看到XYZ(信号由ageometry_msgs /点信息)列在左边。选择???signal1在右侧列表框中单击删除.选择两个XY信号,然后单击选择.点击好吧应用更改。

注意:如果你看不到XYZ,关闭总线分配块的块掩码,并在建模选项卡点击更新模型以确保总线信息被正确传播。如果您看到错误,“在总线分配块中无法找到Selected signal 'signal1'”,这表明总线信息尚未传播。关闭诊断查看器,并重复上述步骤。

现在,您可以使用机器人位置填充总线信号。

  • 万博1manbetx>来源选项卡中,拖动两个正弦波块到模型中。

  • 连接每个输出端口正弦波块到分配输入端口XY公交车分配块。

  • 双击正弦波连接到输入端口的块X.设置阶段参数到-pi/2点击好吧.离开正弦波连接到输入端口的块Y为默认。

你的发行商应该是这样的:

此时,模型被设置为将消息发布到ROS网络。你可以通过以下方式验证:

  • 模拟选项卡,设置模拟停止时间为

  • 点击开始仿真。万博1manbetxSimulink为模型创建一个专用的ROS节点和相应的ROS发布者发布块。

  • 当模拟运行时,输入罗斯诺德列表在MATLAB命令窗口中。这将列出ROS网络中可用的所有节点,并包括一个名称如下的节点/ untitled_81473(模型的名字加上一个随机数使它唯一)。

  • 当模拟运行时,输入罗斯托普列表在MATLAB命令窗口中。这列出了ROS网络中可用的所有主题,包括/位置

观察基本MATLAB工作区有一个或多个变量,其名称以SL_Bus_.这些是Simulink创建的临时总线对象,不应该修改。万博1manbetx但是,将它们从工作空间中清除是安全的,因为如果需要,它们将被重新创建。

  • 点击停止停止模拟。Simulink删除ROS节点和ROS万博1manbetx发布服务器。通常,模型的ROS节点以及任何相关发布者和订阅者会在模拟结束时自动删除;不需要额外的清理步骤。

创建订阅服务器

使用Si万博1manbetxmulink接收发送到的消息/位置话题。您将提取XY定位信息,然后把它画在XY-飞机。

  • ROS工具箱选项卡,在库浏览器中拖动订阅块到模型。双击该块。

  • 选择指定您自己的课题来源框,并输入/位置主题盒子。

  • 点击选择旁边的消息类型框,并选择geometry_msgs /点从弹出窗口。点击好吧关闭块掩码。

订阅块输出Simulink总线信号,万博1manbetx因此需要提取XY它发出的信号。

  • 万博1manbetx>信号路由选项卡,在库浏览器中拖动总线选择器块到模型。

  • 连接味精的输出订阅块的输入端口总线选择器块。

  • 建模选项卡上,选择更新模型以确保总线信息被传播。你可能会得到一个错误,“在总线选择器块'untitled/Bus Selector'不能在输入总线信号中找到选定的信号'signal1'”。这个错误是预期的,将在下一步解决。

  • 双击总线选择器阻止。选择???signal1???signal2在右侧列表框中单击删除.选择两个XY信号,然后单击选择.点击好吧

订阅块将在每个时间步上为主题输出最近收到的消息IsNew输出指示在前一个时间步骤中是否收到消息。对于当前任务,IsNew不需要输出,所以执行以下操作:

  • 万博1manbetx>选项卡,在库浏览器中拖动终结者块到模型。

  • 连接IsNew的输出订阅块的输入终结者块。

其余步骤配置提取的数据的显示XY信号。

  • 万博1manbetx>选项卡中,拖动XY图块到模型。连接模型的输出端口总线选择器块的输入端口XY图块。

  • 万博1manbetx>选项卡中,拖动两个展示块到模型。连接的每个输出总线选择器各就各位展示块。

  • 保存您的模型。

您的整个模型应如下所示:

配置并运行模型

  • 建模选项卡上,选择模型设置.在解算器窗格中,设置类型固定步固定步长0.01

  • 设置模拟停止时间为10.0

  • 点击开始仿真。一个XY绘图将出现。

第一次在Simulink中运行模型时万博1manbetxXY由于加载ROS库造成的延迟,绘图可能比上面的更不稳定。重新运行模拟几次后,绘图应该更平滑。

请注意,模拟实际或“实时”工作。模型中的块在循环中进行评估,该循环仅模拟时间的进程,不用于跟踪实际时钟时间(有关详细信息,请参阅模拟环路相位(万博1manbetx模型)).

修改模型以只对新消息作出反应

在上述模型中订阅块在每个时间步长上输出一个消息(总线信号);如果根本没有接收到任何消息,则输出一个空消息(即零值消息)。因此,XY坐标最初绘制在(0,0)

在本任务中,您将修改模型以使用启用子系统,以便它只在接收到新消息时绘制位置(有关更多信息,请参见使用启用子系统(万博1manbetx模型)).一个预先配置的模型为了您的方便包括在内。

  • 在模型中,单击并拖动以选择总线选择器块和XY图块。右键单击所选内容并选择从选择中创建子系统

  • 万博1manbetx>端口和子系统模块库选项卡中,拖动使可能块插入新创建的子系统。

  • 连接IsNew的输出订阅块到子系统的启用输入,如下图所示。删除终结者块。请注意IsNew仅当在上一时间步中收到新消息时,输出才为真。

  • 保存您的模型。

  • 点击开始仿真。您应该看到以下内容XY情节。

启用的子系统中的块仅在接收到新的ROS消息时执行订阅块。因此,初始(0,0)值将不会显示在XY情节。