• 初识ROS


      需要用到ROS,就来学学ROS。作为小白一个,文章难免出错,请各位海涵。帮我多多指错。这篇文章的目的是让新手对于ROS有个简单的认识,讲的基本都是概念上的东西。希望这篇文章能够解释清楚以下几个问题:
      1.ROS是什么/ROS能干什么?
      2.ROS的基础结构是什么?
      3.ROS部分专有名词的解释:ROS节点(node)、节点管理器(master)、参数服务器(parameter server)、消息(message)、话题(topic)、服务(service)、消息记录包(bag)

    1.ROS是什么/ROS能干什么?

      ROS全称是Robot Operating System,也就是机器人操作系统。从字面上就知道是帮助我们操作机器人的。但和Linux这种底层的os不同,ROS是基于底层os的,也就是在Linux之上,可以理解成在Linux之上做了封装以便于可以直接调用那些用于操作机器人的各种包。ROS的有几个版本,对应的也有不同的Linux环境(网上一查都有,不是重点,在此不再赘述。不过笔者用的是kinetic对应的就是ubuntu16.04啦~)。
      那ROS有什么好处呢?为什么要用ROS呢?这要从ROS的设计目标谈起:ROS便于机器人研发中的代码复用,是一种分布式的进程框架,核心在于可以同步或者异步传递消息数据的中间件框架。简单点儿说就是ROS的模块性和复用性特别好,这样开发者就可以专注于主逻辑的设计。也有点儿像拼积木(积木块已经被造好)。我觉得另一个优势是:ROS使用简化的类型描述语言描述ros发布的数据,通过这种描述语言,ros可以使用多种编程语言(C++ PYTHON java matlab)编写不同节点,实现节点间的通信(不局限于一种,可太棒了!)

      对于ROS能干什么?其实我觉得就是用来开发机器人吧。现在各种机器人无论是UAV、UGV其实都是基于ROS上在做开发滴。要想让robot做点儿个性化的事情,ROS应该是要学滴。而且ROS现在已经被认定为了一个标准(好消息:开源!)。

    2.ROS的基础结构是什么?

      先不关与ROS具体有什么,先从宏观上给它打个样儿。ROS的体系结构大致有三部分:ROS文件系统、ROS计算图、ROS社区
      ROS文件系统:文件系统其实就是ROS文件的组织结构,了解了文件系统就会知道程序执行到哪步时调用了哪个文件。文件系统有很多基础性的概念:package、manifest。
      ROS计算图:计算图相当于ROS运行的机制,包括节点如何通信等等。有的地方也叫做计算网络,所有节点都可以连入这个网络中进行通信。我觉得这个是ROS的最核心部分吧。设计的概念包括:node、master、message、topic、service
      ROS社区:很少看到有把社区放在架构里面的,但ROS目前看来像一个完全开源的东西。开源项目就需要社区去维护,可能最开始设计定下的基调就是这样吧。
    (上文提到了很多概念,我在下文都会一一解释)

    3.ROS概念解释(按照结构划分说了)

    package(功能包)

      package其实可以算组织ROS代码的一个基本单位。ROS中package更多指的是代码包。如果说最大的应该算workspace(工作空间),工作空间内包括代码空间(src,放实现应用的主要代码可以是cpp/py),编译空间(build,主要是编译环境catkin_make之后基本不用管),开发空间(devel,保存编译完的包),安装空间(install,这个通过命令生成以后基本用不到了)。package也就是代码空间下的一个基本单位。一个应用对应于一个package。ROS利用package实现模块性和复用性
      package的结构如下图(因为只是介绍基本概念,所以就不详细说各个文件的作用了~)
    在这里插入图片描述

      图源:ROS学习笔记(一) ROS文件系统_我本傲骄的博客-CSDN博客

    manifest

      全称叫package manifest,为package之间提供依赖性。其中保存的是package的一些基本信息:版本、维护者、依赖选项、编译标志等等。落实到具体文件就是package里面那个package.xml

    metapackage(元功能包)

      metapackage是比package高一个级别的概念,是package的集合。以前也叫stack,现在以及废弃

    metapackage manifest

      这个比manifest高一个级别,功能类似于manifest,只不过是针对于metapackage

    node(节点)

      ROS整体上是一个分布式的架构,也就是有很多个节点组成。或许也可以说成ROS的基本动作执行单位,可以为节点分配任务。同一个workspace下不能有同名节点(这样无法确定),但不同工作空间下可以有同名节点
    作为一个整体,节点之间也要有相互的协作。ROS有自己的通信机制,下面介绍一下:
      ROS的通信手段有两种:消息传递、服务调用

    message(消息)/topic(主题)

      message就对应于消息传递,但消息不能直接就传过去。要借助载体:也就是topic(可以理解为管道)。如果一个节点想发送消息,就要选择一个topic(这个topic可以是自己创造的或者是别人创造的),选topic发message这个动作就是pulish(发布)。如果想接受消息,也要通过topic。而这个动作叫做subscribe(订阅)。两个节点根据动作,分别称为publisher和subscriber。

    server(服务)

      server对应于服务调用,不过server受众小一点儿。单指两个节点之间。服务调用的流程是:client节点发送request给server节点,server节点执行处理后,发送response给client节点
      那消息传递和服务调用有什么区别呢?
        1)服务调用实现一对一,消息传递实现多对多。服务调用只是两方之间,消息传递中同一个topic可以有多个发布者和多个订阅者(也有一个限制:两个发布者发布的同名消息,类型必须一致)
        2)服务调用(双向),消息传递(单向)。服务中发送方会等待接收方的response,而消息传递中发布者发送完就不再管这个消息了——单向传输系统(有点儿像计网中TCP和UDP,其实在ROS中叫rostcp/rosudp)
        3)服务调用是同步的,消息传递是异步的。所以在消息传递过程中常常设置队列作为缓冲区来调节发送速率。
        4)topic常用于数据传输,而service常用于逻辑处理。

    master(节点管理器)

      节点多了总要有个头儿,master就是负责管理所有节点。它会掌管与各个节点之间有关的topic、service信息列表。虽然说有管理者,但通信时消息直接从发布节点到订阅节点,中间不经过节点管理器。ROS参数服务器是节点管理器的一部分,所有节点都可访问修改数据(数据/配置信息)。所有例子中先roscore一下,启动的就是master。但如果两个节点已经通过master建立了联系,并开始进行了通信。这时关掉master是不会影响两个节点的通信的。master只在建立连接时起到作用。

    bag(消息记录包)

      一个包是ROS中用于存储ROS 消息数据的文件格式。即保存和回放ROS消息数据的文件格式。包的扩展名为.bag。当使用复杂机器人时,采集数据较为繁琐。就可以通过bag保存一次数据,后面的仿真时可以回放bag中的数据达到同样的目的。

      这里解释一个例子:判断ros是否安装成功都会使用一个小乌龟移动的例子,那为什么小海龟可以移动呢?这个过程是这样的:
    /teleop_turtle 节点会以消息的形式将这些运动控制命令发布到 话题/turtle1/cmd_vel; 与此同时,因为turtlesim_node 订阅了该话题,因此它会接收到这个些消息,控制海龟按照该预定的速度移动

    参考资料:

    ROS入门学习 - coding-for-self - 博客园(cnblogs.com)
    ROS核心概念、工作空间 和 功能包。ROS学习资源_Bruce’s blog-CSDN博客

    因作者水平有限,如果错误之处,请在下方评论区指出,谢谢!

  • 相关阅读:
    七牛云图床设置
    2. 选择排序
    MindSpore:ImageFolderDataset数据读取问题
    记一次 .NET 某仪器测量系统 CPU爆高分析
    R语言ggplot2可视化:使用ggplot2可视化散点图、使用scale_size函数配置数据点的大小的(size)度量调整的范围
    Codeforces Round #802(Div. 2)A~D
    【C++】通过哈希表实现map和set
    @Valid 注解详解 Java Bean Validation的前世今生
    Golang的viper库
    美国博士后招聘|贝勒医学院—神经系统疾病
  • 原文地址:https://blog.csdn.net/gls_nuaa/article/details/125526454