ROS入门与实践--2
1 ROS系统架构
根据ROS的系统架构图,如下图所示,可以将其分为OS层、中间层和应用层三个层次。
1.1 OS层
OS 层,即为经典意义的操作系统,而ROS虽然机器人操作系统(Robot Operating System)的简称,但ROS并不是一个经典意义上的操作系统,并不能像Windows、Mac、Linux这些操作系统那样直接在计算机硬件上运行。对于ROS的OS层,我们需要依托官方推荐的Linux的Ubuntu系统来运行,同时一些较新的ROS版本也可以运行在Windows、Mac这些系统上,这里不在赘述。
1.2 中间层
ROS经常运行在Linux操作系统上,但Linux是一个开源的通用系统,并没有针对机器人的一些功能和实现提供特殊的中间件,所以ROS在中间层封装了大量的关于机器人开发的中间件。最为主要的就是基于TCP/UDP
继续封装的TCPROS/UDPROS
通信系统。首先ROS的通信系统是基于TCP/UDP
网络的,在此之上进行再次封装,从而成为了TCPROS/UDPROS
。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。
除此之外,为了适合对数据传输实时性方面有较高要求的应用。ROS还提供了一种进程内的通信方法——Nodelet
,可以为多进程通信提供–种更优化的数据传输方式。
在通信机制的基础上,ROS为开发者提供了大量机器人开发相关的库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。
1.3 应用层
为了保证整个ROS系统的正常运行,ROS需要在应用层运行一个管理者,即Master
。在ROS的社区内,官方和开发者们共享了大量和机器人开发相关的应用功能包,功能包内的模块以节点为单位运行起来,通过ROS标准的输入输出作为接口,功能包内封装好了功能实现的逻辑代码,但这不是开发者人员关注的重点,只需要了解接口的规则和协议即可实现复用,从而大大提高了开发效率。
2 ROS架构-系统实现角度
从系统实现的角度,即ROS自身实现而言,可以分为计算图、文件系统、开源社区三层。
2.1 计算图
计算图(Computation Graph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和包(Bags),它们都以不同的方式向图(Graph)提供数据。
- 节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
- 消息(Messages):订阅或发布话题时所使用的ROS数据类型。
- 话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。
- 主节点(Master):ROS的命名服务,例如帮助节点发现彼此。
- rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。
- roscore:主节点 + rosout + 参数服务器。
当ROS 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph
。rqt_graph
能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph
是rqt
程序包中的一部分。
如果我们在第一节安装的是桌面完整版的ROS,那么我们可以直接使用这个功能,Ctrl+Alt+T
,在roscore
运行的状态下,调出终端在并输入以下指令
rosrun rqt_graph rqt_graph
在没有运行任何节点的情况下,rqt_graph
的GUI界面是空白的,这时候我们可以调用ROS系统内置的乌龟GUI节点来演示rqt_graph
的作用。
首先按照第一节的操作调出乌龟GUI节点,然后重新打开一个终端,输入rosrun rqt_graph rqt_graph
,可以看到以下界面,图中的形式类似网络拓扑图,并且显示了各个节点之间的关系。
图中显示了节点/teleop_ turtle
和节点/turtlesim
之间通过话题/cmd_vel
进行通信。
2.2 文件系统
文件系统层概念主要指在硬盘里能看到的ROS目录和文件。
2.2.1 文件系统结构
和操作系统类似,ROS将所有的文件按照一定的组织规则进行组织,ROS文件系统就是在硬盘上ROS源代码的组织形式,其结构如下图所示:
Work_Space --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存放脚本文件(比如Python文件 *.py,shell文件 *.sh)
|-- src 存储C++源文件(*.c/*.cpp)
|-- include 头文件(*.h)
|-- msg 消息通信格式文件(*.msg)
|-- srv 服务通信格式文件(*.srv)
|-- action 动作格式文件
|-- launch 可一次性运行多个节点 (*.launch)
|-- config 配置信息(*.yaml等)
|-- urdf 存放定义机器人模型文件(*.urdf)
|-- CMakeLists.txt: 编译的基本配置
这里功能包的创建、src目录下cpp文件的编写、scripts目录下python文件的编写、launch目录下launch文件的编写,配置package.xml 与 CMakeLists.txt 文件。在后续的教程我们将会详细介绍,这里先进行简单的了解。
2.2.2 文件系统相关工具命令
程序代码散落在许多ROS包中。使用Linux内置命令行工具(如ls和cd)来进行查找和导航可能非常繁琐,因此ROS提供了专门的命令工具来简化这些操作。下面列出了一些命令及作用。
命令 | 作用 | 例子 |
---|---|---|
catkin_create_pkg 自定义包名 依赖包 | 创建新的ROS功能包 | catkin_create_pkg xxx roscpp rospy |
sudo apt install 功能包名 | 安装 ROS功能包 | sudo apt install |
sudo apt purge 功能包名 | 删除某个功能包 | sudo apt purge xxx |
rospack list | 列出所有功能包 | rospack list |
rospack find 功能包名 | 查找某个功能包是否存在,如果存在返回安装路径 | rospack find xxx |
roscd 功能包名 | 进入某个功能包 | roscd xxx |
rosls 功能包名 | 列出某个包下的文件 | rosls xxx |
apt search 功能包名 | 搜索某个功能包 | apt search xxx |
rosed 功能包名 文件名 | 修改功能包文件 | rosed xxx xxx.cpp |
roscore | 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信 | roscore/roscore -p xxxx (指定端口号) |
rosrun 功能包名 可执行文件名 | 运行指定的ROS节点 | rosrun turtlesim turtlesim_node |
roslaunch 功能包名 launch文件名 | 执行某个包下的 launch 文件 | roslaunch xxx xxx.launch |
注:roscore 将启动:ros master、ros 参数服务器、rosout 日志节点。
2.3 开源社区
ROS的社区级概念是ROS网络上进行代码发布的一种表现形式:
- 发行版(Distribution)
ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。 - 软件库(Repository)
ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。 - ROS维基(ROS Wiki)
ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。网址是http://wiki.ros.org/。 - Bug提交系统(Bug Ticket System)
如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。 - 邮件列表(Mailing list)
ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。网址是http://lists.ros.org/。 - ROS问答(ROS Answer)
用户可以使用这个资源去提问题。网址是https://answers.ros.org/questions/。 - 博客(Blog)
你可以看到定期更新、照片和新闻。网址是https://www.ros.org/news/,不过博客系统已经退休,ROS社区取而代之,网址是https://discourse.ros.org/。
为了便于理解,下图给出了ROS资源社区的组织形式。
至此,机器人操作系统(ROS)入门与实践–2的内容全部更新完,接下来我将继续更新ROS入门与实践的后续内容,希望大家支持,本人是自学ROS的研究生小白,主要是根据赵虚左老师的课程、官方的文档以及按照自己的实际操作来写的教程,其中部分内容借鉴了赵虚左老师的方法,在这里给出教程的网址,希望大家一起学习,谢谢大家!!!
参考资料:
http://www.autolabor.com.cn/book/ROSTutorials/
http://wiki.ros.org/ROS/Concepts