了解ROS的基本框架
ROS概述
ROS是运行在Linux等操作系统上的一个次级操作系统,提供机器人从开发到运行的一系列工具。
ROS的核心模块包括:
1. ROS通信机制
ROS使用分布式架构,将机器人的功能和软件做成一个个node,然后每个node通过topic进行沟通,这些node可以部署在同一台机器上,也可以部署在不同机器上,还可以部署在互联网上。node之间通过topic发布/订阅的方式进行通信,或者基于ROS中Service机制点对点通信。
2. 机器人特性功能
机器人特性功能主要指机器人开发中常用的数据结构、算法、规范等内容。当基于ROS开发机器人程序时,可以直接引用相应lib。
- 标准机器人消息
- 机器人几何库
- 机器人描述语言
- 抢占式远程过程调用
- 诊断
- 位置估计
- 定位导航
3. 工具集
工具集只机器人开发过程使用的辅助工具,包括:
- 常用命令工具
- 工程管理工具catkin
- 可视化工具是rqt、rviz
- 包管理工具
- 第三方工具
ROS系统整体架构
文件系统架构
文件系统架构实际上指的是ROS程序开发过程中工作空间的架构。
ROS应用在开发过程中使用catkin进行包管理,而catkin的底层是通过CMake工作的。
catkin目录说明:
- src:放置各个功能包和一个用于这些功能包的CMake配置文件CMakeLists.txt。
- build编译空间:放置CMake和catkin编译功能包时产生的缓存、配置、中间文件等。
- devel开发空间:放置编译好的可执行程序,这些可执行程序是不需要安装就能直接运行的。
功能包是ROS程序的最小结构,表示一个node。安装完成ROS后所有自带的功能包位于$ROS_PACKAGE_PATH,用户可以自行开发功能包。
功能包中通常包括下面几个文件:
- CMakeLists.txt:cmake配置文件。
- package.xml:功能包的配置信息,如依赖、名称等。
- include/
:*.h头文件放在这里。 - msg:非标准消息定义目录,ROS本身已经定义了许多用于node之间通信标准消息已经标准数据类型。
- srv:服务类型定义目录,ROS中node通信可以通过消息和服务两种方式,消息基于topic订阅,服务则是node之间点对点通信机制。
- scripts:bash、python或其他脚本的可执行文件。
- launch:存放.launch文件,.launch文件用于启动ROS功能包中的一个或多个节点(Ansible???)
- src:源码目录
计算图级架构
计算图实际上指的是多个node在ROS中构成的网络,所有计算图中的节点可以进行数据交互。
计算图中包含以下概念:
1. node
节点是计算执行进程,功能包中创建的每个可执行程序在被启动加载到系统进程中后,该进程就是一个ROS节点。
节点都是各自独立的可执行文件,能够通过主题(topic)、服务(server)或参数服务器(parameter server)与其他节点通信。
节点如果用c++进行编写,需要用到ROS提供的库roscpp;节点如果用python进行编写,需要用到ROS提供的库rospy。
2. Topic
node间沟通的方式之一是消息订阅/发布,每个消息都必须发布到相应的主题(topic),通过主题来实现在ROS计算图网络中的路由转发。
同一个主题可以有多个订阅者也可以有多个发布者。每个主题都是强类型的,不管是发布消息到主题还是从主题中订阅消息,发布者和订阅者定义的消息类型必须与主题的消息类型相匹配。
3. 服务
在一些特殊的场合,节点间需要点对点的高效率通信并及时获取应答,这个时候就需要用服务的方式进行交互。
服务通信过程中服务的数据类型需要用户自己定义,与消息不同,节点并不提供标准服务类型。服务类型的定义文件都是以*.srv为扩展名,并且被放在功能包的srv/文件夹下。
4. 配置管理器
参数服务器(parameter server)能够使数据通过关键词存储在一个系统的核心位置。通过使用参数,就能够在节点运行时动态配置节点或改变节点的工作任务。参数服务器是可通过网络访问的共享的多变量字典,节点使用此服务器来存储和检索运行时的参数。
5. 节点管理器
节点管理器(master)用于节点的名称注册和查找等,也负责设置节点间的通信。
由于ROS本身就是一个分布式的网络系统,所以你可以在某台计算机上运行节点管理器,在这台计算机和其他台计算机上运行节点(节点管理器需不需要高可用??)。
ROS中提供了跟节点管理器相关的命令行工具,就是roscore,roscore命令用于启动节点管理器,这个命令会加载ROS节点管理器和其他ROS核心组件。
当ROS开始工作时,用户需要首先执行roscore运行一个节点管理器,以此来保证后续启动的node可以正常通信。
执行roscore的同时,系统会默认启动一个日志node(rosout),执行rosnode可以查看该node的详细信息。
1 | rosout启动发布了一个topic(rosout_agg),以及两个服务(get_loggers、set_logger_level) |
消息文件
ROS使用消息类型描述语言,描述node之间传递的消息,并可以在不同的编程语言(如c++、python等)书写的程序中使用此消息。
不管是ROS系统提供的标准类型消息,还是用户自定义的非标准类型消息,定义文件都是以*.msg作为扩展名。
消息类型的定义分为两个主要部分:字段的数据类型和字段的名称,简单点说就是结构体中的变量类型和变量名称。
经常用到的类型包括: