< >
Home » ROS2与Matlab入门教程 » ROS2与Matlab入门教程-在Simulink中开始使用ROS2

ROS2与Matlab入门教程-在Simulink中开始使用ROS2

说明:

  • 介绍如何使用ROS2的Simulink模块从本地ROS2网络发送和接收消息

  • 介绍如何处理ROS2消息中的数据

介绍:

  • Simulink 对机器人操作系统 2 (ROS 2) 的支持使您能够创建适用于 ROS 2 网络的 Simulink 模型。

  • ROS 2 是一个通信层,它允许机器人系统的不同组件以消息的形式交换信息。组件通过将消息发布到特定主题来发送消息,例如/odometry. 其他组件通过订阅该主题来接收消息

  • Simulink 对 ROS 2 的支持包括一个 Simulink 模块库,用于发送和接收指定主题的消息。当您对模型进行仿真时,Simulink 会连接到 ROS 2 网络,该网络可以与 Simulink 运行在同一台机器上或远程系统上。建立此连接后,Simulink 会与 ROS 2 网络交换消息,直到仿真终止。如果安装了 Simulink Coder™,您还可以从 Simulink 模型为独立的 ROS 2 节点生成 C++ 代码

步骤:

  • 使用 Simulink 发布机器人的位置X和Y位置

  • 输入以下命令打开示例中创建的完整模型

open_system( 'ros2GetStartedExample' );
  • 配置一个块来向一个geometry_msgs/Point名为的主题发送消息/location(“ /”是标准的 ROS 语法)

  • 从 MATLAB 工具条中,选择Home > New > Simulink Model打开一个新的 Simulink 模型

  • 从 Simulink 工具条中,选择Simulation > Library Browser以打开 Simulink Library Browser。单击ROS 工具箱选项卡(您也可以roslib在 MATLAB 命令窗口中键入)。选择ROS 2库

  • 将Publish模块拖到模型中。双击块以配置主题和消息类型

  • 选择指定您自己的主题源,然后输入主题/location

  • 单击消息类型旁边的选择。将出现一个弹出窗口。选择并单击确定以关闭弹出窗口。geometry_msgs/Point

请输入图片描述

请输入图片描述

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

  • ROS 2 消息在 Simulink中表示为总线信号,总线信号是一组 Simulink 信号,还可以包含其他总线信号。ROS 2 Blank Message模块输出与 ROS 2 消息对应的 Simulink 总线信号。

  • 单击库浏览器中的ROS 工具箱roslib选项卡,或在 MATLAB 命令行中键入。选择ROS 2库

  • 将一个空白消息块拖到模型中。双击块以打开块掩码

  • 单击消息类型框旁边的选择,然后从出现的弹出窗口中进行选择。将采样时间设置为 0.01。单击“确定”关闭模块掩码。geometry_msgs/Point

  • 从Library Browser的Simulink > Signal Routing选项卡中,拖动一个Bus Assignment模块

  • 将Blank Message模块的输出端口连接到Bus Assignment模块的 Bus 输入端口。将Bus Assignment模块的输出端口连接到Publish模块的输入端口

  • 双击Bus Assignment模块。geometry_msgs/Point您应该会看到左侧列出的x、y 和 z(构成消息的信号)

  • signal1在右侧列表框中选择并单击删除。在左侧列表框中同时选择X和信号,然后单击Select。单击确定以应用更改

请输入图片描述

  • 注意:如果您没有看到列出的 x、y 和 z,请关闭 Bus Assignment 模块的模块封装,然后在Modeling 选项卡下,单击Update Model以确保正确传播总线信息。如果您看到错误“无法找到总线分配块中的选定信号'signal1'”,则表明总线信息尚未传播。关闭诊断查看器,然后重复上述步骤

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

  • 从Library Browser的Simulink > Sources选项卡中,将两个Sine Wave模块拖到模型中

  • 将每个Sine Wave模块的输出端口连接到Bus Assignment模块的分配输入端口 x 和 y

  • 双击连接到输入端口的Sine WaveX模块。将Phase参数设置为-pi/2并单击OK。将Sine Wave模块连接到输入端口Y作为默认设置

  • 发布者应如下所示

  • 至此,模型设置为向 ROS 2 网络发布消息。您可以按如下方式验证这一点

  • 在Simulation选项卡下,将仿真停止时间设置为inf

  • 单击运行开始模拟。Simulink 为模型创建一个专用的 ROS 2 节点和一个对应于Publish模块的 ROS 2 发布者

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

  • 仿真运行时,ros2 topic list在 MATLAB 命令窗口中键入。这列出了 ROS 2 网络中可用的所有主题,其中包括/location

请输入图片描述

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

  • 创建订阅者,使用 Simulink 接收发送到/location主题的消息。您将从消息中提取 x 和 y 位置并将其绘制在 xy 平面上

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

  • 在主题源框中选择指定您自己的,然后在主题框中输入。/location

  • 单击消息类型框旁边的选择,然后从弹出窗口中选择。将采样时间设置为 0.01。单击“确定”关闭模块掩码。geometry_msgs/Point

  • Subscribe模块输出 Simulink 总线信号,因此您需要从中提取 x 和 y 信号

  • 从Library Browser的Simulink > Signal Routing选项卡中,将Bus Selector模块拖到模型中

  • 将Subscribe模块的Msg输出连接到Bus Selector模块的输入端口

  • 从Modeling 选项卡中,选择Update Model以确保传播总线信息。您可能会收到错误消息,“在输入总线信号中找不到总线选择器块'untitled/Bus Selector'中的选定信号'signal1'”。此错误是预期的,将在下一步中解决

  • 双击Bus Selector模块。在右侧列表框中选择??? signal1和并单击Remove。在左侧列表框中同时选择 x 和 y 信号,然后单击Select。单击确定。??? signal2

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

  • 从Library Browser的Simulink > Sinks选项卡中,将Terminator模块拖到模型中

  • 将Subscribe模块的IsNew输出连接到Terminator模块的输入

  • 其余步骤配置提取X和Y信号的显示

  • 从Library Browser的Simulink > Sinks选项卡中,将一个XY Graph模块拖到模型中。将Bus Selector模块的输出端口连接到XY Graph模块的输入端口

  • 从Library Browser的Simulink > Sinks选项卡中,将两个Display模块拖到模型中。将Bus Selector模块的每个输出连接到每个Display模块

  • 保存您的模型

  • 整个模型应如下所示:

请输入图片描述

  • 配置和运行模型,从“建模 ”选项卡中,选择“模型设置”。在Solver窗格中,将Type设置为Fixed-step并将Fixed-step size设置为 0.01

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

  • 单击运行开始模拟。将出现一个XY情节

请输入图片描述

  • 第一次在 Simulink 中运行模型时,XY由于加载 ROS 库导致的延迟,绘图可能看起来比上面的更不稳定。重新运行几次模拟后,绘图应该看起来更平滑

  • 请注意,模拟在实际或“实时”时间中不起作用。模型中的模块在一个循环中进行评估,该循环仅模拟时间进程,而不是用于跟踪实际时钟时间

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

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

  • 在此任务中,您将修改模型以使用启用的子系统,以便它仅在收到新消息时绘制位置(有关更多信息,请参阅使用启用的子系统(Simulink))

  • 在模型中,单击并拖动以选择Bus Selector模块和XY Graph模块。右键单击选择并选择Create Subsystem from Selection

  • 从Library Browser的Simulink > Ports & Subsystems选项卡中,将Enable模块拖到新创建的子系统中

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

请输入图片描述

  • 保存您的模型

  • 单击运行开始模拟。你应该看到下面的XY情节

请输入图片描述

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

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与matlab入门教程