主要内容

从Simulink中生成一个独立的ROS节点

这个例子向您展示了如何从Simulink®模型生成和构建一个独立的ROS节点。

简介

在本例中,您将配置一个模型来为独立ROS节点生成c++代码。然后在Ubuntu®Linux®系统上构建并运行ROS节点。

先决条件

  • 这个例子需要Simulink Coder™。

  • 安装了ROS和SSH服务器的Ubuntu Linux系统是构建和运行生成的c++代码所必需的。您可以使用自己的Ubuntu ROS系统,也可以使用用于机器人系统工具箱™示例的Linux虚拟机(参见开始与露台和模拟乌龟机器人指令)。

  • 检查基于ros的机器人反馈控制的例子。

为代码生成配置模型

配置一个模型,为独立ROS节点生成c++代码。该模型是本文介绍的比例控制器基于ros的机器人反馈控制的例子。

  • 开放RobotController.slx.单击链接或运行RobotController在命令窗口中。

  • 准备下节ROS选项卡上,单击硬件设置打开硬件实现面板中的“配置参数”对话框。的硬件板设置部分包含特定于生成ROS包的设置,例如要包含在package.xml文件。改变维护人员的名字ROS示例用户

  • 该模型使用可变大小的数组。如果您安装了Embedded Coder™,则必须为可变大小的信号启用代码生成。检查适应信号代码生成>接口>软件环境.如果适应信号选项不可见,勾选该选项,使用嵌入式编码器特性硬件实现>高级参数

  • 解算器在“配置参数”对话框中,确保“Solver .类型被设置为固定步,并设置固定的大小0.05.在生成的代码中,固定步长定义了实际的时间步长,以秒为单位,用于模型更新循环(参见从模型生成的代码的执行(仿真软件编码器)).它可以做得更小(例如0.001或0.0001),但就目前的目的而言,0.05已经足够了。

配置与ROS设备对接

一个ROS设备是安装了ROS并能够构建和运行ROS节点的任何Linux系统。如果你有Simulink Coder,你可以为一个独立的ROS节点生成代码。如果您的系统连接到ROS设备,Simulink还可以将生成的代码传输到ROS设备,构建可执行文件,并运行生成的ROS节点(这被称为“部署”ROS节点)。

在此任务中,您将决定是为ROS节点生成代码,还是在ROS设备上构建并运行它。如果连接到ROS设备,则可以配置Simulink将其用作ROS节点的部署目标。

  • 建模选项卡上,单击模型设置

  • 硬件实现的“配置参数”对话框中,选择一个建立行动硬件板设置>目标硬件资源>组> Build Options.所选的构建操作会影响Simulink在构建模型时的行为。没有一个(默认设置)只生成ROS节点的代码,而不将其构建在外部ROS设备上。构建和负载生成代码,将其传输到外部设备,并构建ROS节点可执行文件。如果您选择构建和运行,生成的节点可执行文件将在构建结束时自动启动。

  • 设置建立行动构建和运行。

  • 配置到外部ROS设备的连接。下ROS选项卡,从部署到下拉,点击管理远程设备.这将打开连接ROS设备对话框。在这个对话框中,您可以输入Simulink部署ROS节点所需的所有信息。这包括ROS设备的IP地址或主机名、登录凭证和Catkin工作区。改变柔荑花序工作区~ / catkin_ws_test

ROS文件夹为ROS设备上ROS安装的位置。如果不指定此文件夹,设置测试(参见下一步)将尝试为您确定正确的文件夹。

  • 如果ROS设备已打开并可从计算机访问,则可以通过单击验证连接设置测试.该测试验证每个设备设置,并在发现问题时在Simulink Diagnostic Viewer中显示警告和错误。如果可能的话,测试还会建议如何解决这些问题。点击测试现在。

  • 最有可能的是,Catkin工作区~ / catkin_ws_test目标设备上不存在。测试检测到这个问题,并建议创建文件夹并初始化工作区。点击修复自动应用此操作。几秒钟后,您应该看到一个绿色提示,说明文件夹已成功创建。在下面的图中,您可以看到成功创建文件夹的示例。要验证Catkin工作区现在可用,请单击测试再次在连接设置对话框中。警告已经消失,Catkin工作区已经准备好构建ROS节点。

  • 更改设备连接设置并测试它们,直到没有其他警告或错误显示为止。如果自动修复您的设置是可能的,Simulink通过显示修复按钮。设置好之后,单击好吧在连接设置对话框中保存设置。

连接设置不是特定于单个模型,而是适用于Simulink中的所有ROS模型。

生成c++ ROS节点

为独立ROS节点生成代码,并在ROS设备上自动传输、构建和运行它。使用在ROS设备上运行的ROS主机运行生成的ROS节点。

1.在MATLAB®中,将当前文件夹更改为您有写权限的临时位置。

2.代码生成过程首先为模拟准备模型,以确保所有块都正确初始化。此准备工作需要到ROS主服务器的有效连接。

在MATLAB中,你可以使用rosdevice对象在ROS设备上启动ROS master。如果你不提供任何参数,rosdevice使用您在Simulink对话框中输入的设备连接设置连接到ROS设备。

d = rosdevice runCore(d);

3.使用rosinit将MATLAB连接到ROS设备上运行的ROS主程序:

rosinit (d.DeviceAddress)

4.告诉Simulink使用与MATLAB相同的ROS连接设置。下模拟选项卡,在准备部分中,选择ROS网络.设置ROS Master (ROS 1)和Node Host网络地址为默认的

每个MATLAB会话只需要执行步骤2 - 4一次,而不是每次生成ROS节点时都要执行。

5.ROS选项卡上,单击部署>构建并运行.如果您得到任何关于总线类型不匹配的错误,关闭模型,清除基础MATLAB工作区中的所有变量,并重新打开模型。

点击视图诊断链接在模型工具栏底部,以查看构建过程的输出。

6.一旦代码生成完成,ROS节点就被转移到ROS设备上的Catkin工作区。节点在此构建,并基于模型的采样时间以同步方式开始自动运行。

生成的节点连接到运行在ROS设备上的ROS master。

7.使用rosnode列出所有运行节点就是ROS网络。“robotcontroller”应该在显示的节点列表中。

rosnode列表

您可以使用rostopic验证部署节点是否发布ROS主题上的数据来控制机器人的运动:

rostopic信息/ mobile_base /命令/速度

运行并校验ROS节点

运行新构建的ROS节点,并使用基于matlab的机器人模拟器验证其行为。

1.在MATLAB中,输入ExampleHelperSimulinkRobotROS以启动机器人模拟器。模拟器自动连接到运行在ROS设备上的ROS主机。如果想连接到基于gazebo的机器人模拟,请参见从Simulink®连接到一个支持ros的机器人

sim = ExampleHelperSimulinkRobotROS

2.验证模拟机器人向目标移动期望的职位在模型中指定的常量)。机器人一旦到达目标[- 10,10]就会停止。

3.点击重置模拟重置机器人的位置为[0,0]。机器人立即开始向目标位置移动。

4.在MATLAB中,您可以管理Simulink生成的ROS节点rosdevice对象。一旦部署了Simulink模型,您就可以使用rosdevice在任何时候运行和停止节点,而不必在Simulink中重建它。

AvailableNodes属性显示已部署的机器人控制器节点。方法可以验证节点是否正在运行isNodeRunning函数。

d = rosdevice

isNodeRunning (d,“robotcontroller”

5.停止ROS节点运行。

stopNode (d,“robotcontroller”) isNodeRunning (d,“robotcontroller”

6.单击重置模拟按钮。机器人停留在位置[0,0]不移动。

  • 现在重新启动节点。

runNode (d,“robotcontroller”
  • 机器人应该再次开始向目标位置移动。

7.一旦您完成了验证,您就可以按照以下方法清理系统状态。

  • 停止在目标设备上运行的节点

stopNode (d,“robotcontroller”
  • 在主机上关闭机器人模拟器图窗口和类型rosshutdown在MATLAB命令行。

rosshutdown

高级主题和故障排除

在Simulink中指定ROS网络设置:缺省情况下,Simulink使用的ROS连接设置为rosinit在MATLAB。要覆盖这些设置,请在Simulink中指定ROS连接设置。下模拟选项卡,在准备部分中,选择ROS网络并设置ROS主节点主机网络地址:

指定外部ROS包作为依赖项:要指定外部ROS包作为生成ROS节点的依赖项,请指定适当的工具链选项。在“配置参数”中,单击代码生成>工具链设置,指定构建配置作为指定从下拉。然后,您可以指定所需的包,包括目录,链接库,库路径而且定义了基于您希望与生成的ROS节点集成的外部ROS包。

生成的c++代码存档无论如何建立行动当你选择(None, Build and load, Build and run)时,Simulink总是在你的当前文件夹中生成两个文件:一个包含c++源代码的存档(RobotController. exe)。tgz)和用于手动提取和构建c++代码的shell脚本(build_ros_model.sh)。如果您的MATLAB计算机没有连接到ROS设备,您可以手动传输文件并在那里构建它们。

处理器生成的代码:如果您使用来自其他产品(如计算机视觉系统工具箱™)的块,生成2022世界杯八强谁会赢?的代码可能包含特定于处理器的优化,这将导致在Linux上构建ROS节点时出现编译问题。在这些情况下,您需要让Simulink知道编译所生成代码的平台。你可以通过硬件实现面板中的模型配置参数对话框。

在MATLAB中运行ROS Master:在上面的例子中,您连接到一个运行在ROS设备上的ROS主机。或者,您可以在MATLAB中创建ROS主程序。使用rosinit在MATLAB命令行:

rosinit (“NodeHost”, <您的计算机的IP地址>)

例如,如果主机的IP地址为172.18.250.92,则使用以下命令:

rosinit (“NodeHost”“172.18.250.92”

NodeHost设置是非常重要的,以确保生成的ROS节点能够与MATLAB上的主机通信。请注意:生成的ROS节点将使用NodeHostIP地址与MATLAB中的全局ROS节点通信,因此确保指定的IP地址可从ROS设备访问(例如,使用).看到连接ROS网络详细说明示例的意义NodeHost设置。

任务模式: Simulink可以生成多任务或单任务模式的代码基于时间的调度和代码生成(仿真软件编码器)).缺省情况下,生成的ROS代码采用单任务模式(所有速率都使用一个线程),不进行实时调度。这允许执行生成的ROS代码sudo特权,但可能导致更难以预测的性能。

如果您需要更可预测的性能,您可以配置模型以使用多任务处理。在解算器“Configuration Parameters”对话框的“enable”将每个离散的速率视为一个单独的任务使多任务。在生成的代码中,这将为模型中的每个速率创建一个单独的线程,并为线程使用优先调度。

要运行ROS节点,您需要在ROS设备上拥有管理权限。当模型部署到目标设备时,Simulink会自动检测您的权限是否不足。

相关的话题

Baidu
map