主要内容

开始在Simulink®中使用ROS金宝app

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

介绍

金宝appSimu金宝applink对机器人操作系统(ROS)的支持使您能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层,允许机器人系统的不同组件以信息.组件通过出版它对一个特定的主题例如/里程计。其他组件通过以下方式接收消息:订阅关于这个话题。

金宝app对ROS金宝app的Simulink支持包括一个Simulink块库,用于发送和接收指定主题的消息。当您模拟模型时,Simulink连接到一个ROS网络,该网金宝app络可以运行在与Simulink相同的机器上,也可以运行在远程系统上。一旦建立了这个连接,Simulink就会与ROS网络交换消息,直到仿真终止金宝app。如果安金宝app装了Simulink Coder™,您还可以为独立的ROS组件生成c++代码,或节点,来自Simulink金宝app模型。

这个例子展示了如何:

  • 建立ROS环境

  • 创建并运行Simulink模型以发金宝app送和接收ROS消息

  • 处理ROS消息中的数据

先决条件:创建一个简单的模型(金宝appSimulink),从ROS开始吧

模型

您将使用Simulink发金宝app布XY机器人的位置。您还将订阅相同的位置主题并显示收到的内容X,Y的位置。

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

open_system (“robotROSGetStartedExample”);

初始化ROS

每个ROS网络都有一个ROS的主人协调活性氧网络的所有部分。对于本例,使用MATLAB®在您的本地系统上创建一个ROS master。金宝appSimulink自动检测并使用本地ROS主机。

在MATLAB命令行中,执行以下命令:

松香

创建发布者

配置块以发送几何图形\u msgs/点消息到命名的主题/位置(“/是标准的ROS语法)。

  • 从MATLAB工具条,选择>金宝app打开Simuli金宝appnk开始页。

  • 在Si金宝appmulink起始页上的金宝app,点击空白模型创建并打开一个新的Simulink模型。金宝app

  • 从Simulink金宝app Toolstrip中,选择模拟>图书馆浏览器打开Simulink库浏金宝app览器。点击ROS工具箱选项卡(您也可以键入罗斯利布在MATLAB命令窗口中)。选择活性氧图书馆

  • 拖一个出版块到模型。双击该块以配置主题和消息类型。

  • 选择指定您自己的主题源,并输入/位置在里面话题

  • 点击选择旁边消息类型.将出现一个弹出窗口。选择几何图形\u msgs/点并点击好啊关闭弹出窗口。

创建ROS消息

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

一条ROS消息表示为总线信号在仿真金宝app软件。总线信号是一组Simulink信号,也可以包括其他总线信金宝app号(参见探索Simuli金宝appnk总线功能(金宝appSimulink)例如概述)。ROS的空白的信息块输出与ROS消息相对应的Sim金宝appulink总线信号。

  • 点击ROS工具箱选项卡,或输入罗斯利布在MATLAB命令行。选择活性氧图书馆

  • 拖一个空白的信息块到模型。双击块打开块遮罩。

  • 点击选择挨着消息类型框,然后选择几何图形\u msgs/点从生成的弹出窗口中。点击好啊关闭块遮罩。

  • 金宝app>信号路由选项卡,在库浏览器中拖动总线分配块。

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

  • 双击总线分配布洛克,你应该看看X,YZ(信号包括:几何图形\u msgs/点消息)列在左侧。选择??? 信号1在右侧列表框中,单击去除. 选择两者XY信号,然后单击选择点击好啊应用更改。

注意:如果你看不到X,YZ列出,关闭总线分配块的块掩码,并在建模选项卡,点击更新模型确保总线信息正确传播。如果您看到错误,“找不到总线分配块中的选定信号'signal1',则表明总线信息尚未传播。关闭诊断查看器,然后重复上述步骤。

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

  • 金宝app>来源选项卡,在库浏览器中拖动两个正弦波将块插入到模型中。

  • 连接每个端口的输出端口正弦波块的赋值输入端口XY总线分配块。

  • 双击正弦波连接到输入端口的块X. 设定阶段参数-pi/2并点击好啊. 离开正弦波块连接到输入端口Y默认情况下。

您的发布者应如下所示:

此时,该模型被设置为向ROS网络发布消息。您可以通过以下方式进行验证:

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

  • 点击运行开始仿真。金宝appSimulink为模型创建一个专用的ROS节点和相应的ROS发布者出版块。

  • 在模拟运行时,键入rosnode列表在MATLAB命令窗口中。它列出了ROS网络中所有可用的节点,并包括一个名称为/ untitled_81473(模型的名称以及使其唯一的随机数)。

  • 在模拟运行时,键入rostopic列表在MATLAB命令窗口中。它列出了ROS网络中所有可用的主题,包括/位置

观察基本MATLAB工作区有一个或多个变量,其名称以SL_总线_。这些是Simulink创建的临时总线对象,不应修改。但是,可以从工作区中清除它们,因为它金宝app们将在需要时重新创建。

  • 点击停止停止模拟。Simulink将删除ROS节点和RO金宝appS发布服务器。通常,模型的ROS节点以及任何关联发布服务器和订阅服务器将在模拟结束时自动删除;无需执行其他清理步骤。

创建一个用户

使用Si金宝appmulink接收消息发送到/位置的话题。你将提取XY从消息中选择位置并在XY飞机。

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

  • 选择指定您自己的主题源框,然后输入/位置话题盒子。

  • 点击选择挨着消息类型框,然后选择几何图形\u msgs/点从弹出窗口。点击好啊关闭块遮罩。

这个订阅块输出Simulink总线信号,金宝app因此需要提取XY信号。

  • 金宝app>信号路由选项卡,在库浏览器中拖动总线选择器块到模型。

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

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

  • 双击总线选择器块。选择??? 信号1??? 信号2在右侧列表框中,单击去除. 选择两者XY信号,然后单击选择点击好啊

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

  • 金宝app>下沉选项卡,在库浏览器中拖动《终结者》块到模型。

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

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

  • 金宝app>下沉选项卡,在库浏览器中拖动XY图块到模型。连接设备的输出端口总线选择器块的输入端口XY图块。

  • 金宝app>下沉选项卡,在库浏览器中拖动两个显示块到模型。连接每个输出端总线选择器块之间显示块。

  • 保存您的模型。

你的整个模型应该是这样的:

配置并运行模型

  • 建模选项卡,选择模型设置.在解算器窗格,集合类型固定步长固定的大小0.01

  • 将模拟停止时间设置为10

  • 点击运行开始仿真。一个XY情节就会出现。

当您第一次在Simulink中运行模型时金宝appXY由于加载ROS库造成的延迟,plot可能看起来比上面的更紧张。一旦你重新运行模拟几次,情节应该看起来更流畅。

注意,模拟在实际或“实时”工作。模型中的块是在一个循环中评估的,该循环只模拟时间的进展,而不打算跟踪实际的时钟时间(有关详细信息,请参阅)模拟循环阶段(金宝appSimulink)).

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

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

在本任务中,您将修改模型以使用启用子系统,以便仅在收到新消息时绘制位置(有关更多信息,请参阅使用启用子系统(金宝appSimulink)).A预配置模型是为了你的方便。

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

  • 金宝app>港口和子系统选项卡,在库浏览器中拖动启用阻塞到新创建的子系统中。

  • 连接IsNew输出订阅阻止子系统的启用输入,如下图所示。删除《终结者》块。请注意,IsNew只有在前一个时间步骤中接收到新消息时,输出才为真。

  • 保存您的模型。

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

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