此示例显示如何使用ROS 2的Simulink块从本地ROS万博1manbetx 2网络发送和接收消息。
万博1manbet万博1manbetxx对机器人操作系统2 (ROS 2)的Simulink支持使您能够创建与ROS 2网络工作的Simulink模型。ROS 2是一个通信层,允许机器人系统的不同组件以形式交换信息信息.组件通过以下方式发送消息:出版这是一个特殊的问题话题,如/里程计
。其他组件通过以下方式接收消息:订阅这个话题。
万博1manbet万博1manbetxx对ROS 2的Simulink支持包括一个Simulink块库,用于发送和接收指定主题的消息。模拟模型时,Simulink连接到ROS 2网络,该网络可以与Simulink在同一台机器上运行,也可以在远程系统上运行。一旦建立此连接,Simulink将与ROS 2网络交换消息,直到模拟终止。中频Simulink编码器™ 安装后,还可以从Simulink模型生成独立ROS 2节点的C++代码。
这个例子展示了如何:
创建并运行Simulink模型以发万博1manbetx送和接收ROS 2消息
处理ros2消息中的数据
您将使用Simulink发万博1manbetx布X
和Y
机器人的位置。您还将订阅相同的位置主题并显示收到的内容X
,Y
地点。
输入以下命令以打开已完成的模型中创建的例子。
开放式系统(“ros2GetStartedExample”);
配置块以发送几何图形\u msgs/点
将消息发送到名为的主题/位置
(修订)"/
“是标准的ROS语法)。
从MATLAB工具条,选择家>新的>万博1manbetx仿真软件模型打开一个新的Simulink万博1manbetx模型。
从Simulink万博1manbetx工具条中选择模拟>图书馆浏览器打开Simulink库浏万博1manbetx览器。点击ROS工具箱选项卡(您也可以键入roslib
在MATLAB命令窗口)。选择活性氧2图书馆。
拖发表块到模型。双击块以配置主题和消息类型。
选择指定您自己的对于主题源,然后进入/位置
在里面话题.
点击选择旁边消息类型.将出现一个弹出窗口。选择几何图形\u msgs/点
点击好啊关闭弹出窗口。
创建一个空白的ROS 2消息,并用机器人路径的x和y位置填充它。然后将更新后的ROS 2消息发布到ROS 2网络。
ROS 2消息表示为总线信号在Si万博1manbetxmulink中,总线信号是一组Simulink信号,也可以包括其他总线信号(参见探索Simuli万博1manbetxnk总线功能(万博1manbetx模型)概述示例)。ROS 2空白信息块输出与ROS 2消息相对应的S万博1manbetximulink总线信号。
点击ROS工具箱选项卡,或输入roslib
在MATLAB命令行中,选择活性氧2图书馆。
拖空白信息块到模型。双击块打开块遮罩。
点击选择挨着消息类型框,并选择几何图形\u msgs/点
从结果弹出窗口。集样品时间至0.01。单击好啊关闭块掩码。
从万博1manbetx>信号路由选项卡,在库浏览器中拖动公交车分配块。
连接设备的输出端口空白信息块到的总线输入端口公交车分配块。连接设备的输出端口公交车分配块的输入端口发表块。
双击公交车分配块。你应该看到x, y和z(信号包括a几何图形\u msgs/点
消息)列在左侧。选择???signal1
在右侧列表框中,单击去除.选择两者X
和Y
在左侧列表框中显示信号,然后单击选择点击好啊应用更改。
注意:如果您没有看到列出的x、y和z,请关闭总线分配块的块掩码,并在建模标签,点击更新模型以确保总线信息被正确传播。如果您看到错误,“在总线分配块中无法找到Selected signal 'signal1'”,这表明总线信息尚未传播。关闭诊断查看器,并重复上述步骤。
现在,您可以使用机器人位置填充总线信号。
从万博1manbetx>来源选项卡,在库浏览器中拖动两个正弦波块到模型中。
连接每个输出端口正弦波块的赋值输入端口x和y公交车分配块。
双击正弦波连接到输入端口的块X
.设置阶段参数-pi/2
点击好啊.离开正弦波连接到输入端口的块Y
为默认。
你的发行商应该是这样的:
此时,将模型设置为将消息发布到ROS 2网络。您可以通过以下方式进行验证:
在模拟选项卡,将模拟停止时间设置为inf
.
点击运行开始仿真。万博1manbetxSimulink为模型创建了一个专用的ROS 2节点和对应的ROS 2发布者发表块。
当模拟运行时,输入ros2节点
列表
在MATLAB命令窗口中。它列出了ROS网络中所有可用的节点,并包括一个名称为/ untitled_90580
(模型的名称以及使其唯一的随机数)。
当模拟运行时,输入ros2主题
列表
在MATLAB命令窗口中。这列出了ROS 2网络中可用的所有主题,包括/位置
.
点击停止停止模拟。万博1manbetxSimulink删除ROS 2节点和发布者。通常,模型的ROS 2节点以及任何相关的发布者和订阅者在模拟结束时被自动删除;不需要额外的清理步骤。
使用Si万博1manbetxmulink接收发送到的消息/位置
主题。您将从消息中提取x和y位置,并在xy平面中绘制。
从ROS工具箱选项卡,在库浏览器中拖动订阅块到模型。双击该块。
选择指定您自己的在主题源框,然后输入/位置
在话题盒子。
点击选择挨着消息类型框,并选择几何图形\u msgs/点
从弹出窗口。集样品时间至0.01。单击好啊关闭块掩码。
的订阅块输出Simulink总线信号,万博1manbetx因此需要从中提取x和y信号。
从万博1manbetx>信号路由选项卡,在库浏览器中拖动总线选择器块到模型。
连接味精输出订阅块的输入端口总线选择器块。
从建模选项卡,选择更新模型以确保总线信息得到传播。您可能会得到一个错误,“在输入总线信号中找不到总线选择器块“无标题/总线选择器”中的选定信号“信号1”。此错误是预期的,将在下一步解决。
双击总线选择器阻止。选择???signal1
和???signal2
在右侧列表框中,单击去除。在左侧列表框中选择x和y信号,然后单击选择点击好啊.
的订阅块将在每个时间步骤上输出最近接收到的主题消息。的是新的输出指示是否在上一个时间步长内接收到消息。对于当前任务是新的不需要输出,请执行以下操作:
从万博1manbetx>下沉选项卡,在库浏览器中拖动终结者块到模型。
连接是新的输出订阅块的输入终结者块。
其余的步骤配置显示提取的信息X
和Y
信号。
从万博1manbetx>下沉选项卡,在库浏览器中拖动XY图块到模型。连接设备的输出端口总线选择器块的输入端口XY图块。
从万博1manbetx>下沉选项卡,在库浏览器中拖动两个显示块到模型。连接模型的每个输出总线选择器各就各位显示块。
保存您的模型。
你的整个模型应该是这样的:
从建模选项卡,选择模型设置.在解算器窗格中,设置类型来固定步和固定步长来0.01
.
设置模拟停止时间为10.0
.
点击运行开始模拟XY
绘图将出现。
第一次在Simulink中运行模型时万博1manbetxXY
由于加载ROS库造成的延迟,plot可能看起来比上面的更紧张。一旦你重新运行模拟几次,情节应该看起来更流畅。
注意,模拟不在实际或“实时”工作。模型中的块是在一个循环中评估的,该循环只模拟时间的进展,而不打算跟踪实际的时钟时间(有关详细信息,请参阅)模拟环路相位(万博1manbetx模型)).
在上述模型中订阅块在每个时间步长上输出一条消息(总线信号);如果根本没有收到任何消息,则输出一条空白消息(即,一条具有零值的消息)。因此XY
坐标最初绘制在(0,0)
.
在本任务中,您将修改模型以使用启用子系统,以便仅在收到新消息时绘制位置(有关更多信息,请参阅使用启用的子系统(万博1manbetx模型)).一个预配置模型是为了你的方便。
在模型中,单击并拖动以选择总线选择器块和XY图块。右键单击所选内容并选择从所选内容创建子系统.
从万博1manbetx>端口和子系统模块库选项卡,在库浏览器中拖动启用阻塞到新创建的子系统中。
连接是新的输出订阅阻止子系统的启用输入,如下图所示。删除终结者块。请注意,是新的只有在前一个时间步骤中接收到新消息时,输出才为真。
保存您的模型。
点击运行开始模拟。您应该看到以下内容XY
情节
启用子系统中的块仅在系统接收到新ROS 2消息时执行订阅块。因此,最初的(0,0)
值将不会显示在XY
情节