需要用到ROS,就来学学ROS。作为小白一个,文章难免出错,请各位海涵。帮我多多指错。这篇文章的目的是让新手对于ROS有个简单的认识,讲的基本都是概念上的东西。希望这篇文章能够解释清楚以下几个问题:
1.ROS是什么/ROS能干什么?
2.ROS的基础结构是什么?
3.ROS部分专有名词的解释:ROS节点(node)、节点管理器(master)、参数服务器(parameter server)、消息(message)、话题(topic)、服务(service)、消息记录包(bag)
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现在已经被认定为了一个标准(好消息:开源!)。
先不关与ROS具体有什么,先从宏观上给它打个样儿。ROS的体系结构大致有三部分:ROS文件系统、ROS计算图、ROS社区
ROS文件系统:文件系统其实就是ROS文件的组织结构,了解了文件系统就会知道程序执行到哪步时调用了哪个文件。文件系统有很多基础性的概念:package、manifest。
ROS计算图:计算图相当于ROS运行的机制,包括节点如何通信等等。有的地方也叫做计算网络,所有节点都可以连入这个网络中进行通信。我觉得这个是ROS的最核心部分吧。设计的概念包括:node、master、message、topic、service
ROS社区:很少看到有把社区放在架构里面的,但ROS目前看来像一个完全开源的东西。开源项目就需要社区去维护,可能最开始设计定下的基调就是这样吧。
(上文提到了很多概念,我在下文都会一一解释)
package其实可以算组织ROS代码的一个基本单位。ROS中package更多指的是代码包。如果说最大的应该算workspace(工作空间),工作空间内包括代码空间(src,放实现应用的主要代码可以是cpp/py),编译空间(build,主要是编译环境catkin_make之后基本不用管),开发空间(devel,保存编译完的包),安装空间(install,这个通过命令生成以后基本用不到了)。package也就是代码空间下的一个基本单位。一个应用对应于一个package。ROS利用package实现模块性和复用性
package的结构如下图(因为只是介绍基本概念,所以就不详细说各个文件的作用了~)
图源:ROS学习笔记(一) ROS文件系统_我本傲骄的博客-CSDN博客
全称叫package manifest,为package之间提供依赖性。其中保存的是package的一些基本信息:版本、维护者、依赖选项、编译标志等等。落实到具体文件就是package里面那个package.xml
metapackage是比package高一个级别的概念,是package的集合。以前也叫stack,现在以及废弃
这个比manifest高一个级别,功能类似于manifest,只不过是针对于metapackage
ROS整体上是一个分布式的架构,也就是有很多个节点组成。或许也可以说成ROS的基本动作执行单位,可以为节点分配任务。同一个workspace下不能有同名节点(这样无法确定),但不同工作空间下可以有同名节点
作为一个整体,节点之间也要有相互的协作。ROS有自己的通信机制,下面介绍一下:
ROS的通信手段有两种:消息传递、服务调用
message就对应于消息传递,但消息不能直接就传过去。要借助载体:也就是topic(可以理解为管道)。如果一个节点想发送消息,就要选择一个topic(这个topic可以是自己创造的或者是别人创造的),选topic发message这个动作就是pulish(发布)。如果想接受消息,也要通过topic。而这个动作叫做subscribe(订阅)。两个节点根据动作,分别称为publisher和subscriber。
server对应于服务调用,不过server受众小一点儿。单指两个节点之间。服务调用的流程是:client节点发送request给server节点,server节点执行处理后,发送response给client节点
那消息传递和服务调用有什么区别呢?
1)服务调用实现一对一,消息传递实现多对多。服务调用只是两方之间,消息传递中同一个topic可以有多个发布者和多个订阅者(也有一个限制:两个发布者发布的同名消息,类型必须一致)
2)服务调用(双向),消息传递(单向)。服务中发送方会等待接收方的response,而消息传递中发布者发送完就不再管这个消息了——单向传输系统(有点儿像计网中TCP和UDP,其实在ROS中叫rostcp/rosudp)
3)服务调用是同步的,消息传递是异步的。所以在消息传递过程中常常设置队列作为缓冲区来调节发送速率。
4)topic常用于数据传输,而service常用于逻辑处理。
节点多了总要有个头儿,master就是负责管理所有节点。它会掌管与各个节点之间有关的topic、service信息列表。虽然说有管理者,但通信时消息直接从发布节点到订阅节点,中间不经过节点管理器。ROS参数服务器是节点管理器的一部分,所有节点都可访问修改数据(数据/配置信息)。所有例子中先roscore一下,启动的就是master。但如果两个节点已经通过master建立了联系,并开始进行了通信。这时关掉master是不会影响两个节点的通信的。master只在建立连接时起到作用。
一个包是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博客
因作者水平有限,如果错误之处,请在下方评论区指出,谢谢!