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图中
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号