ROS基础
1.ROS架构
按照ROS的架构可以分为以下3个层次:
(1)os层:ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上,而是需要依托于Linux系统。
(2)中间层:ROS在中间层做了大量工作,其中最为重要的就是基于TCPROS/UDPROS的通信系统。ROS的通信系统基于TCP/UDP网络,在此之上进行了再次封装,也就是TCPROS/UDPROS。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。
(3)应用层:开发属于我们自己的程序,结合ROS底层通信,最终实现我们想要的功能,这也是我们绝大部分开发者所接触到的层级。
2.计算图
ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接,从而构建一幅计算图。
2.1 节点
节点(Node)就是一些执行运算任务的进程,一个系统一般由多个节点组成,也可以称为“软件模块”,是我们使用最多的一种方式:
(1) 执行具体任务的进程、独立运行的可执行文件。
(2)不同节点可使用不同的编程语言,可分布式运行在不同的主机。
(3)节点在系统中的名称必须唯一。
2.2 节点管理器(ROS-Master)
ROS Master通过远程过程调用(RPC)提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数。若没有节点管理器,节点将无法找到彼此,整个系统将会瘫痪。在实际使用中若没有启动节点管理器,任何节点都无法启动。
(1)为节点提供命名和注册服务。
(2)跟踪和记录话题/服务通信,辅助节点相互查找、建立连接。
(3)提供参数服务器,节点使用此服务器存储和检索运行时的参数。
2.3 消息
程序就是由数据和算法构成的,在ROS中,我们将数据称为消息,由节点处理消息,并进行发送或接收,最终实现我们想要的功能。每一个消息都是一种严格的数据结构,支持标准数据类型(整型、浮点型、布尔型等),也支持嵌套结构和数组(类似于C语言的结构体struct),还可以根据需求由开发者自主定义。
3.通信机制
在ROS架构的中间层说明了其底层通信方式,但底层通信方式对我们开发者来说就是一个黑箱,我们不关注其实现原理与过程,仅仅使用其提供的功能。在实际应用中,使用以下几种通信机制建立属于自己的计算图:
3.1 话题通信(异步通信方式)
话题通信是最常用的一种通信方式,它是节点间用来传输数据的重要总线,使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。以两节点(一个发布者,一个订阅者)为例,建立连接过程如下:
(1)发布者注册,在启动发布者节点时自动完成这一过程。
(2)订阅者注册,在启动订阅者节点时自动完成这一过程。
(3)ROS Master信息匹配,基于话题找到信息对应的两个节点。
(4)订阅者发送连接请求。
(5)发布者确认连接请求。
(6)订阅者与发布者建立网络连接。
(7)发布者开始向订阅者发送数据。
tips:话题通信所传输的数据由与编程语言无关的.msg文件定义,编译过程中自动生成相应代码。
3.2 服务通信机制(同步通信方式)
服务是一种带有应答的通信机制,使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据。建立连接过程如下:
(1)客户端注册。
(2)服务器注册。
(3)ROS Master信息匹配。
(4)客户端与服务器建立网络连接。
(5)客户端向服务器发布应答数据。
tips:话题通信所传输的数据由与编程语言无关的.srv文件定义,编译过程中自动生成相应代码。
3.3 话题与服务通信机制的区别
4.文件系统
ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下,文件系统主要分为以下几个层级:
功能包典型结构如下图所示:
(1)action:放置功能包自定义的动作指令。
(2)config:放置功能包中的配置文件,由用户创建,文件名可以不同。
(3)include:放置功能包中需要用到的头文件。
(4)launch:放置功能包中的所有启动文件。
(5)msg:放置功能包自定义的消息类型。
(6)scripts:放置可以直接运行的Python脚本。
(7)src:放置需要编译的C++代码。
(8)srv:放置功能包自定义的服务类型。
(9)CMakeLists.txt:编译器编译功能包的规则。
(10)package.xml:功能包清单,记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。
5.结语
该篇博文主要介绍了ROS系统的基础知识,是以后实操ROS的基础,ROS系列知识是我开的第一个坑,未来会陆续介绍ROS实操的知识,如果喜欢请点赞+收藏+关注!!!