[ROS基础-4] ROS系统框架

系列文章目录

[ROS基础-1] Linux系统介绍与ubuntu安装(virtualbox)
[ROS基础-2] Ubuntu系统基本操作与基本命令讲解
[ROS基础-3] ROS系统安装与基本配置
[ROS基础-4] ROS系统框架


文章目录

  • 系列文章目录
  • 前言
  • 一、ROS系统整体框架
  • 二、ROS文件系统级
    • 1、工作空间
    • 2、package功能包
  • 三、计算图级
    • 1、topic话题通信
    • 2、service服务通信
  • 四、社区级
  • 总结


前言

ROS本身不是一种单纯的编程语言,而是用于编写机器人软件程序的一种具有高度灵活性的软件架构。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。

要想真正的掌握熟练使用ROS,对于新手来说就需要先从了解其框架开始,在没有相关知识而直接上手学习ROS编程的情况下,会不断卡壳,学习效率地下,我之前学习ROS也是同样,在没有掌握基础知识的情况下一直理解不了其运行机制


一、ROS系统整体框架

ROS系统框架较为复杂,不能单纯的以某个方面进行说明。ROS系统在设计上可以分为三个方面:

  • 文件系统级(Filesystem)
  • 计算图级(Computation Graph)
  • 开源社区级(Community)

文件系统级:程序是如何组织和构建的,需要的核心文件
计算图级:描述程序是如何运行的,进程和系统之间如何通讯
开源社区级:程序的分布式管理方式,开发人员之间如何共享知识、算法和代码。

二、ROS文件系统级

文件系统级是用于描述可以在硬盘上查找到的代码及可执行文件程序,在这一级中将使用一组概念来解释ROS的内部组成、文件架结构以及工作所需的核心文件。
[ROS基础-4] ROS系统框架_第1张图片

1、工作空间

工作空间就是管理 ROS 工程和代码的地方,而 catkin 是 ROS 定制的编译构建系统,是对 CMake 的扩展。catkin 工作空间其实就是一个文件夹,用来组织和管理功能包,用 catkin 工具编译。

工作空间下有三个文件夹:

  • src :存放的是 package 源代码,src 目录下存放着各种各样的功能包,包是 catkin 编译的基本单元。
  • build 中存放的是 cmake 和 catkin 的缓存信息以及中间文件
  • devel 中存放的则是生成的目标文件,比如头文件,可执行文件,链接库等等。

2、package功能包

Package(功能包):是ros中软件组织的基本形式,是构成ROS的基本单元,也是catkin编译的基本单元。一个package可以包含多个可执行文件(节点)。ROS应用程序是以功能包为单位开发的,功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件,还包含功能包所需的所有文件,如依赖库、数据集和配置文件等。

package不是随便随便指定一个文件夹,而是由必要的文件构成,其中不能少的文件包括:

  • CMakeList.txt
  • package.xml

两个文件夹有其对应的功能,且有自己的编程格式。

CMakeList.txt规定了catkin编译的规则,即告诉编译系统如何编译在这个包下的代码,需要编译那些文件,需要那些依赖,生成那些目标文件等信息。具体的写法如下,系统会帮我们生成这个模板,我们只需更改就行,CMakeList.txt规则如下:

cmake_minimum_required()		#指定catkin最低版本
project()						#指定软件包的名称
find_package()					#指定编译时需要的依赖项
add_message_files()/add_service_files/add_action_files()
								#添加消息文件/服务文件/动作文件
generate_messages()				#生成消息/服务/动作
catkin_package()				#指定catkin信息给编译系统生成cmake文件
add_library()/add_executable()	#指定生成库文件/可执行文件
target_link_libraries()			#指定可执行文件去链接库
catkin_add_gtest()				#添加测试单元
install()						#生成可安装目标

package.xml文件定义了包的属性,如包名、版本号、作者、依赖等等(包的自我描述)。创建包的时候会提供一个写好的模板(如下)。通常我们需要修改的是build_depengd(会显示当前功能包安装之前必须先安装那些功能包)和run_depend(显示运行功能包代码所需的包)两个标记。

<package>		
	<name>				
	<version>			
	<description>		
	<maintainer>		
	<license>			
	<buildtool_depend>		
	<build_depend>		
	<run_depend>		
package>		

其他文件夹:

  • include功能包头文件目录:存放的功能包程序包含的*.h头文件放在这里。
  • src功能包中节点源文件存放目录:存放进程(节点)程序的源文件,可包括c++、python等。
  • scripts可执行脚本文件存放目录:存放bash、python或其他脚本的可执行文件。
  • msg非标准消息定义目录:ROS系统提供了很多标准类型的消息可以直接使用,如果你要使用一些非标准类型的消息,就需要自己来定义该类型的消息,并把定义的文件放在这里。
  • srv服务类型定义目录:服务是ROS中进程(节点)间的请求/响应通信过程,服务类型是服务请求/响应的数据结构,服务类型的定义放在这里。
  • launch文件目录:存放*.launch文件,*.launch文件用于启动ROS功能包中的一个或多个节点,在含有多个节点启动的大型项目中很有用。

三、计算图级

ROS会创建一个连接到所有进程的网络。在系统中的任何节点都可以访问此网络,并通过该网络与其他节点交互,获取其他节点发布的信息,并将自身数据发不到网络上。

在这一层中最基本的概念包括节点、节点管理器、参数服务器、消息、服务、主题和消息记录句,这些概念都以不同的方式向计算图级提供数据:[ROS基础-4] ROS系统框架_第2张图片

  • 节点(Node)节点是主要的计算执行进程。如果你想要有一个可以与其他节点进行交互的进程,那么你需要创建一个节点,并将此节点连接到ROS网络。通常情况下,系统包含能够实现不同功能的多个节点。你最好让每个节点都具有特定的单一的功能,而不是在系统中创建一个包罗万象额大节点。节点需要使用如roscpp或rospy的ROS客户端库进行编写。
  • 节点管理器(Master)节点管理器用于节点的名称注册和查找等。它也设置节点间的通信。如果在你的整个ROS系统中没有节点管理器,就不会有节点、服务、消息之间的通信。需要注意的是,由于ROS本身就是一个分布式网络系统,你可以在某一台计算机上运行节点管理器,在该管理器或其他计算机上运行节点。
  • 参数服务器(Parameter Server)参数服务器能够使数据通过关键词存储在一个系统的核心位置。通过使用参数,就能够在运行时配置节点或改变节点的工作任务。
  • 消息(Message)节点通过消息完成彼此的沟通。消息包含一个节点发送到其他节点的信息数据。ROS中包含很多种标准类型的消息,同时你也可以基于标准消息开发定义类型的消息。
  • 主题(Topic)每一个消息都必须有一个名称来被网络路由。每一条消息都要发布到相应的主题。当一个节点发送消息时,我们可以说该节点正在向主题发布消息。节点可以通过订阅某个主题,接收来自其他节点的消息。一个节点可以订阅一个主题,而不需要该节点同时发布该主题。这就保证了消息的发布者和订阅者之间相互解藕,完全无需知晓对方的存在。主题的名称必须是独一无二的,否则在同名主题之间的消息路由会发生错误。
  • 服务(Service)在发布主题时,正在发送的数据能够以多对多的方式交互。但当你需要某个节点获得一个请求或应答时,就不能通过主题来实现了。在这种情况下,服务能够允许我们直接与某个节点进行交互。此外服务必须有唯一的名称。当一个节点提供某一服务时,所有的节点都可以通过使用ROS客户端库编写的代码与它通信。
  • 消息记录包(Bag)消息记录包是一种用于保存和回放ROS消息数据的文件格式。消息记录包是一种用于存储数据的重要机制。它能够获取并记录各种难以收集的传感器数据。我们可以通过消息记录包反复获取实验数据,进行必要的开发和算法测试。在使用复杂机器人进行试验工作时,经常需要使用消息记录包。

ROS通信机制是ROS的核心概念,其中较为重要的有topic话题通信、service服务通信,其实action动作通信也很重要。

1、topic话题通信

话题topic是一种异步通信机制,发布消息的节点被称为publisher,而订阅消息的节点被称为subscriber。每个节点node像master经过申请,可以发布规定的消息,也可以订阅对应的节点的消息。
[ROS基础-4] ROS系统框架_第3张图片

2、service服务通信

服务service是一种同步通信机制,顾名思义,其通信原理有点像web服务器,请求得到回应的节点被称为client,而提供服务且回应的节点被称为server。
[ROS基础-4] ROS系统框架_第4张图片

四、社区级

ROS开源社区级的概念主要是ROS资源,其能够通过独立的网络社区分享软件和知识。

  • 发行版(Distribution):ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。
  • 软件库(Repository):ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。
  • ROS维基(ROS Wiki):ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。
  • Bug提交系统(Bug Ticket System):如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。
  • 邮件列表(Mailing list):ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。
  • ROS问答(ROS Answer):用户可以使用这个资源去提问题。link.

总结

本节大致介绍了ROS系统三个级的系统框架介绍,内容作者进行了简单整理以方便理解。本文较为枯燥,但是在ROS的学习道路上至关重要,所以这些看还是要看滴。
由于担心篇幅过长,作者并未把ROS的通讯原理放在一起,下一节将进行本节扩展讲解ROS的通讯。

ROS学习并非一朝一夕可以完成,接下来我也会坚持发表关于ROS学习的笔记,如有哪里不对的,也可以请各位指正。

祝大家变得更强!

你可能感兴趣的:(ROS学习,linux,python,ubuntu)