主要内容

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

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

简介

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

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

这个例子展示了如何:

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

  • 处理ROS 2消息中的数据

先决条件:创建一个简单的模型从ROS 2开始

模型

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

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

open_system (“ros2GetStartedExample”);

创建发布者

配置一个块发送geometry_msgs /点消息发送给一个名为/位置(“/是标准的ROS语法)。

  • 从MATLAB工具条中,选择首页>>金宝app仿真软件模型打开一个新的Simulink金宝app模型。

  • 从“Simulin金宝appk工具条”中选择模拟>库浏览器打开Simulink L金宝appibrary浏览器。点击ROS工具箱TAB(你也可以输入roslib在MATLAB命令窗口中)。选择ROS 2图书馆。

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

  • 选择指定你自己的课题来源,并进入/位置主题

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

创建一个ROS 2消息

创建一个空白的ROS 2消息,并用机器人路径的x和y位置填充它。然后将更新后的ROS 2消息发布到ROS 2网络。

ROS 2消息表示为总线信号在仿真金宝app软件。总线信号是一组Simulink信号,还可以包括其他总线信金宝app号(请参阅探索Simuli金宝appnk总线功能(金宝app模型)概述示例)。ROS 2空白的信息block输出一个与ROS 2消金宝app息相对应的Simulink总线信号。

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

  • 拖一个空白的信息块到模型。双击该块以打开块掩码。

  • 点击选择旁边是消息类型框,并选择geometry_msgs /点从产生的弹出窗口。集样品时间到0.01。点击好吧关闭块掩码。

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

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

  • 双击总线分配块。你应该看到x, y和z(信号组成ageometry_msgs /点Message)列在左边。选择???signal1在右侧列表框中单击删除.选择两个X而且Y信号在左侧列表框中,单击选择.点击好吧应用更改。

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

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

  • 金宝app>来源选项卡,拖动二正弦波块放入模型中。

  • 连接每个输出端口正弦波的分配输入端口x和y总线分配块。

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

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

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

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

  • 点击运行开始模拟。金宝appSimulink为模型创建了一个专用的ROS 2节点,并创建了与之对应的ROS 2发布者发布块。

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

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

  • 点击停止停止模拟。金宝appSimulink删除ROS 2节点和发布者。一般来说,模型的ROS 2节点以及任何相关的发布者和订阅者在模拟结束时会自动删除;不需要额外的清理步骤。

创建订阅者

使用Si金宝appmulink接收发送到/位置的话题。您将从消息中提取x和y位置,并将其绘制在xy平面上。

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

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

  • 点击选择旁边是消息类型框,并选择geometry_msgs /点从弹出窗口。集样品时间到0.01。点击好吧关闭块掩码。

订阅block输出一个Simulin金宝appk总线信号,所以你需要从中提取x和y信号。

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

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

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

  • 双击总线选择器块。选择???signal1而且???signal2在右侧列表框中单击删除.在左侧列表框中选择x和y信号并单击选择.点击好吧

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

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

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

其余步骤配置所提取的内容的显示X而且Y信号。

  • 金宝app>选项卡,拖动XY图块到模型。连接接口的输出端口总线选择器块的输入端口XY图块。

  • 金宝app>选项卡,拖动二显示块到模型。连接的每个输出总线选择器Block到每个显示块。

  • 保存您的模型。

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

配置并运行模型

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

  • 设置模拟停止时间为10.0

  • 点击运行开始模拟。一个XY图将出现。

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

注意模拟在实际或“实际”时间内工作。模型中的块在一个循环中计算,该循环仅模拟时间的进展,并不打算跟踪实际的时钟时间(有关详细信息,请参阅模拟回路阶段(金宝app模型)).

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

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

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

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

  • 金宝app>端口与子系统选项卡,拖动启用块到新创建的子系统中。

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

  • 保存您的模型。

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

激活的子系统中的块仅在接收到新的ROS 2消息时执行订阅块。因此,首字母(0,0)属性中,将不会显示XY情节。