这个例子展示了如何使用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消息中的数据
您将使用Simulink发金宝app布X
而且Y
机器人的位置。您还将订阅同一位置的主题并显示收到的内容X
,Y
的位置。
输入以下命令打开已完成的模型在示例中创建。
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消息,并用机器人路径的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
情节。