学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#金宝app

从虚拟海上机器人挑战赛开始

我们听说你要去夏威夷参加划船比赛?非常酷的比赛地点!但是,哇,这是一个很难复制的环境!海浪,海风,运输一艘16英尺长的船,这可不是什么好情况!因此,大多数团队都很难在这些罕见的海洋测试日之间进行大量的控制器或系统测试。

开源机器人基金会(OSRF)创建了一个ROS包,用于模拟比赛环境的条件,称为虚拟海上机器人挑战赛(VMRC)。VMRC项目的目标是帮助团队使用模拟来设计健壮的和经过彻底测试的系统。他们计划在2019年以该模拟包为基础进行虚拟比赛.此ROS包包含以下内容:

  • 16 ' WAM-V无人水面舰艇的植物模型
  • 环境模型,例如,水和风物理,课程元素
  • 传感器模型,例如,相机,激光雷达,GPS

看看他们的Bitbucket存储库,看看如何安装和开始使用这个包!

好了,这是我们的工厂,传感器和环境模型。现在来设计我们的控制器!金宝appSimulink是工业控制工程师常用的设计控制器的环境。我的同事吉莉安·罗森将一个模拟工具组合在一起,向团队展示如何使用Simulink来开始这样做。金宝app您可以从MATLAB中央文件交换.让吉莉安谈谈她的工作吧!

步骤1:连接到VMRC

正如我们之前提到的,VMRC有很多元素可以模拟比赛环境,并且像大多数ROS模拟包一样,使用Gazebo作为物理引擎。当然,我们的第一步是:进入ROS网络,与Gazebo聊天。如果你不熟悉MATLAB, Simulink和ROS一起使用,金宝app看看这篇博客文章.下载File Exchange条目后,请执行下面的步骤README.pdf连接到VMRC模拟器。一些注意事项:

  1. 文件交换条目已在MATLAB R2018a中测试。我们将很快添加对MATLAB后续版金宝app本的支持。
  2. 如果在中使用虚拟机,请确保正确设置了环境变量setupScript.m,特别是ROS主IP地址和ROS IP地址。指README.pdf具体说明。
  3. VMRC使用一些自定义ROS消息,例如usv_gazebo_plugins / UsvDrive它将左右推力命令捆绑在一起。这些必须作为自定义消息注册到MATLAB中,以便MATLAB能够理解它们。你可以得到所有细节都在这里
  4. 对于通过Simulink进行收听和交谈,您可以使用ROS Subsc金宝appribe和ROS Publish块。数据进出块使用总线信号它模仿ROS消息类型的结构。

:

:

现在您已经连接到ROS网络,执行WAM-V DONUTS!!

Testpub = rospublisher('/cmd_drive');Newmsg = rosmessage(testpub);newmsg。Left = 0.5 while(true) pause(0.3);发送(testpub, newmsg);结束

第二步:处理这些任务

注意:VMRC强烈建议您使用“独立显卡,例如Nvidia GTX 650”来运行VMRC。我使用运行Ubuntu 16.04的虚拟机开发了这个模型。它是不稳定的(帧率在1-2 Hz之间),但仍然可用

RobotX竞赛包括一些复杂的任务,旨在模拟流行的自主系统行为。我当然不会独自参加比赛,这也不是这篇博文的重点。关键在于:

  • 一个你可以用来沟通和任务计划的基础
  • 下面是一些开始任务的基本思路。

我选择了一些任务来关注:演示导航和控制,扫描代码和避开障碍。

演示导航和控制-强制性任务

计划子图:导航

我理解为什么这是强制性的。如果你不能直线前进10米,那么尝试其他任务可能不是一个好主意。

我的基本计划是:向前开。开车时,用我的相机看看我的浮标之间的对齐是否太偏离,必要时纠正。没浮标了就停下来。

我处理的第一部分是在相机图像中找到浮标的位置。康奈尔大学我用Simulink设计了一个颜色检测算法——它是一个子系统,对相机图像进行阈值,进行一金宝app些斑点争论,并输出斑点的数量和最大斑点的质心。Simulink中的子系统(以及其他特性,如模型引用)可以帮助集成独立开发的模型,当您有几个团队在系统的不同方面工作金宝app时,这是非常有用的。一个子系统配置为红色,一个子系统配置为绿色,我使用blob的数量和每种颜色中最大的blob的相对位置来确定我的对齐情况。

为了进行必要的校正,我使用了一个简单的砰砰控制器:左转、右转、直走或停止。因为我需要在多种情况下使用这些方向,我做了一个“说明”列举这样我就不用记了" 0 =直男"" 1 =左"等等-我用MATLAB帮我记住了。我将方向转换为推力命令,并将一些Stateflow逻辑捕获为图形化函数。

当我再也看不到任何绿色或红色的浮标时,我停了下来。我注意到,如果WAMV在看不见浮标后立即停下来,它会停在离终点浮标稍远的地方,所以我增加了10秒的直行时间,让我到达终点线。我停在原地,直到再次发现一个浮标。

扫描代码

计划子图:ScanTheCode

我的基本计划是:用相机确定当前浮标的颜色。继续观察颜色的变化,直到我看到一个有效的三种颜色的序列。

再次感谢康奈尔提供的颜色检测器!我把它拆开了一点,使它适合这项任务。摄像机图像以RGB格式从Gazebo到达,所以我将其转换为HSV,使阈值更直接(并提高性能一点)。为了获得每种颜色的阈值,我抓取了视频提要的屏幕截图,其中浮标显示每种颜色,然后转到颜色阈值应用程序来确定每种颜色的值。

该应用程序可以导出一个MATLAB函数,其中包含每个通道的当前限制,因此我查看了生成函数的代码,以找到我的最小值和最大值。使用每种颜色的对应值,我对饱和度和值通道设置了一次阈值,对色调通道设置了四次阈值——每种可能的代码颜色(红、绿、蓝、黄)设置一次阈值。

在获得四张阈值图像后,我计算了每张图像中的有效像素数,并选择有效像素数最多的色调作为当前颜色。矩阵数学和操作是MATLAB的强项,所以我使用MATLAB函数块来进行计算。在找到当前的颜色之后,我所要做的就是跟踪我所看到的,直到我有了一个有效的三种颜色的序列。

在创建此类系统原型时,单元测试是关键。以扫描代码任务为例,在我的Ubuntu VM设置中,VMRC没有以最高速度运行,我从相机获得了大约0.2 Hz的帧率,所以我真的不想等待相机图像通过ROS网络传入或处理相机的特性,只是为了测试我的颜色检测算法。您将注意到,颜色检测算法在最终模型的状态流图中被格式化为一个Simulink函数,但对于初始开发和测试,该任务只是一个普通的Simulin金宝appk子系统,如下所示。这就是在Simulink中快速执行单元测试的方法。金宝app

对于阈值部分,我将WAMV移动到Gazebo的浮标上,使用MATLAB命令行抓取单个摄像机信息,将其转换为普通图像,然后在我的MATLAB工作区中使用它作为一个虚拟摄像机。

为了测试颜色选择器,由于它是在MATLAB函数块中编写的,我将函数复制到空白的MATLAB脚本中,然后使用我的工作空间图像在MATLAB中进行调试和测试。一旦我完成了工作,我只是将更新后的函数复制回MATLAB函数块。

为了测试Stateflow图中的序列读取逻辑,我依赖于Stateflow动画来追踪图表中发生的事情。这是我的VMRC模拟的慢速度有帮助的地方。statflow突出显示了我当前所处的状态,我可以观察状态之间的图表转换以跟踪逻辑。

我只是用眼睛看了几块展示板信号值标记用于测试,但如果您正在寻找更严格和可伸缩的选项,请查看金宝appSimulink设计验证器

避免障碍

计划子图:避障

我的基本计划是使用激光雷达扫描和矢量场直方图(VFH)避障块从机器人系统工具箱。WAM-V的激光雷达扫描以XYZ点的3D点云形式出现,VFH块以距离/角度格式进行2D扫描。我认为我可以在特定高度取点云的切片来创建2D扫描,然后将2D扫描的XY点转换为范围和角度。WAM-V的激光雷达扫描倾斜了大约20度。这意味着我不能在特定的z坐标上对扫描进行切片。我需要将点云与地平面对齐,所以回到MATLAB来创建矩阵数学原型。我将XYZ坐标转换为球面坐标,估计最常见的仰角,并相应地旋转点云。

为了将这些计算移动到模型中,我使用了解释MATLAB函数块和MATLAB函数块的组合。这两个模块都可以让你在Simulink中运行MATLAB函数,但是金宝app由于它们运行代码的方式不同,它们在功能上有一些不同.我决定使用解释MATLAB块进行仿射变换,然后将转换后的点云发送到MATLAB函数块以生成范围和角度。

第三步:把它们放在一起

当所有单独的任务控制器都完成并经过测试后,我将它们移动到一个大的statflow图表中。每个任务都包含在一个带有两个并行状态的子图表中,以及支持这两种状态所需的所有MATLAB、Simulink和图形函数。金宝app金宝app一个状态从ROS数据输入总线中提取必要的数据,并对其进行处理以供另一个状态使用,第二个状态跟踪/更新当前状态并分配输出。首先执行数据处理状态,但在每个时间步骤中都执行这两种状态。

顶层选择当前任务。在模型中,当前的任务是通过手动开关来控制的,但是您也可以使用真实的逻辑。我只使用一个总线作为输入,而不是每个传感器的单独输入,这样我就可以在需要时切换传感器配置。总线定义保存在MATLAB工作空间中,因此如果我说“我的ROS数据总线”,Simulink或Stateflow可以直接查找它,而不是硬编码。金宝app如果我决定使用另一个摄像头,或者我不想再使用GPS,我所要做的就是添加/删除我想要的订阅者,并更新总线定义。

在使用基于文本的编程语言编写状态图时,由于所有的控制流而使所有实际逻辑都排在三个缩进的位置,这已经很糟糕了,但是如果只希望在进入/退出状态时执行逻辑,这也不是一件简单的事情。我尝试了添加迷你状态,这些状态只会导致进入或离开主状态、标志和条件逻辑,以检查是否第一次进入状态。状态流有这个:(例子链接

如果有什么事情你只想在一开始就做,把它放在后面条目:在状态内容中。要了解状态流程图是如何执行的,请查看以下内容本文档页

结束

这就是模型!你知道了!根据你在这篇博客中看到的,你已经有了一个很好的基础:

  • 将MATLAB和Simulink连接到金宝appVMRC仿真
  • 在高级任务规划和单个任务中使用Stateflow(非常酷)
  • 将用Simulink和MATLAB编写的算法与用Stateflo金宝appw编写的图表集成

在使用Simulink创建控制器原型之后,您可以从模型生成代码,将其直接部署到金宝app系统中,或者您可以生成ROS节点,将其与VMRC一起使用。有关代码生成的更多信息,看看这个系列视频它是专门为学生比赛制作的。

好运!

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。