终于有人把ROS机器人操作系统讲明白了
终于有人把ROS机器人操作系统讲明白了
导读:机器人是多专业知识交叉的学科,通常涉及传感器、驱动程序、多机通信、机械结构、算法等,为了更高效地进行机器人的研究和开发,选择一个通用的开发框架非常必要,ROS(Robot Operating System,机器人操作系统)就是流行的框架之一。
温馨提示
本文将带领大家了解和使用ROS,掌握ROS的核心概念,为后续学习打好基础。
01 ROS简介
可能很多初学者听到机器人操作系统,就被“操作系统”几个字吓住了。其实简单点说,ROS就是一个分布式的通信框架,帮助程序进程之间更方便地通信。
一个机器人通常包含多个部件,每个部件都有配套的控制程序,以实现机器人的运动与视听功能等。那么要协调一个机器人中的这些部件,或者协调由多个机器人组成的机器人集群,怎么办呢?这时就需要让分散的部件能够互相通信,在多机器人集群中,这些分散的部件还分散在不同的机器人上。解决这种分布式通信问题正是ROS的设计初衷。
随着越来越多的人参与ROS开发及源码贡献,社区涌现出大量的第三方工具和实用开源软件包,使ROS变成现在的样子。
一个经常让初学者困惑的地方是,学会了ROS就是学会机器人开发了吗?当然不是,严格意义上讲ROS只是一套通信框架而已,机器人中的各种算法和应用程序依然是用C++、Python等常见编程语言进行开发的。
1. ROS的性能特色
在正式学习ROS之前,先介绍ROS的几个特性,即元操作系统、分布式通信机制、松耦合软件框架、丰富的开源功能库等,来帮大家建立一些感性的认识。
ROS是一个机器人领域的元操作系统。也就是说,它并不是真正意义上的操作系统,其底层的任务调度、编译、设备驱动等还是由它的原生操作系统Ubuntu Linux完成。
ROS实际上是运行在Ubuntu Linux上的亚操作系统,或者说软件框架,但提供硬件抽象、函数调用、进程管理这些类似操作系统的功能,也提供用于获取、编译、跨平台的函数和工具。
ROS的核心思想就是将机器人的软件功能做成一个个节点,节点之间通过互相发送消息进行沟通。这些节点可以部署在同一台主机上,也可以部署在不同主机上,甚至还可以部署在互联网上。ROS网络通信机制中的主节点(master)负责对网络中各个节点之间的通信过程进行管理调度,同时提供一个用于配置网络中全局参数的服务。
ROS是松耦合软件框架,利用分布式通信机制实现节点间的进程通信。ROS的软件代码以松耦合方式组织,开发过程灵活,管理维护方便。
ROS具有丰富的开源功能库。ROS是基于BSD(Berkeley Software Distribution,伯克利软件发行)协议的开源软件,允许任何人修改、重用、重发布以及在商业和闭源产品中使用,使用ROS能够快捷地搭建自己的机器人原型。
2. ROS的发行版本
与Linux发行版类似,ROS发行版内置了一系列常用功能包,即将ROS系统打包安装到原生系统中。ROS最初是基于Ubuntu系统开发的,ROS的发行版本名称也和Ubuntu采用了同样的规则,即版本名称由两个相同首字母的英文单词组成,版本首字母按字母表递增顺序选取,图1-1展示了ROS的一些主要版本。

▲图1-1 ROS的主要版本
3. ROS的学习方法
要想学好以及用好ROS,需要进行大量的实践操作。因此在快速了解ROS的核心概念和编程范式后,就要结合大量的实际项目来深入理解ROS。学会用正确的方式解决问题,能帮你更快地提高能力。ROS的学习资源主要有以下几个。
- 官网:www.ros.org
- 源码:github.com
- Wiki:wiki.ros.org
- 问答:answers.ros.org
02 ROS系统架构
安装完ROS后,很多朋友应该迫不及待想立马开始写程序。由于ROS的架构比较复杂,为了后面容易理解遇到的各种概念,这里先讨论一下ROS的系统架构,好让大家对ROS中的各种概念有全面性把控。按照官方的说法,可以分别从计算图、文件系统和开源社区视角来理解ROS架构。
1. 从计算图视角理解ROS架构
ROS中可执行程序的基本单位叫节点(node),节点之间通过消息机制进行通信,这样就组成了一张网状图,也叫计算图,如图1-3所示。

▲图1-3 ROS的计算图结构
节点是可执行程序,通常也叫进程。ROS功能包中创建的每个可执行程序在被启动加载到系统进程中后,就是一个ROS节点,如图1-3中的节点1、节点2、节点3等。
节点之间通过收发消息进行通信,消息收发机制分为话题(topic)、服务(service)和动作(action)三种,如图1-3中的节点2与节点3、节点2与节点5采用话题通信,节点2与节点4采用服务通信,节点1与节点2采用动作通信。计算图中的节点、话题、服务、动作都要有唯一名称作为标识。
ROS利用节点将代码和功能解耦,提高了系统的容错性和可维护性。所以最好让每个节点都具有特定的单一功能,而不是创建一个包罗万象的庞大节点。如果用C++编写节点,需要用到ROS提供的roscpp库;如果用Python编写节点,需要用到ROS提供的rospy库。
消息是构成计算图的关键,包括消息机制和消息类型两部分。消息机制有话题、服务和动作三种,每种消息机制中传递的数据都具有特定的数据类型(即消息类型),消息类型可分为话题消息类型、服务消息类型和动作消息类型。消息机制和消息类型将在1.5节中展开讲解。
数据包(rosbag)是ROS中专门用来保存和回放话题中数据的文件,可以将一些难以收集的传感器数据用数据包录制下来,然后反复回放来进行算法性能调试。
参数服务器能够为整个ROS网络中的节点提供便于修改的参数。参数可以认为是节点中可供外部修改的全局变量,有静态参数和动态参数。静态参数一般用于在节点启动时设置节点工作模式;动态参数可以用于在节点运行时动态配置节点或改变节点工作状态,比如电机控制节点里的PID控制参数。
主节点负责各个节点之间通信过程的调度管理。因此主节点必须要最先启动,可以通过roscore命令启动。
2. 从文件系统视角理解ROS架构
ROS程序的不同组件要放在不同的文件夹中,这些文件夹根据不同的功能对文件进行组织,这就是ROS的文件系统结构,如图1-4所示。

▲图1-4 ROS的文件系统结构
工作空间是一个包含功能包、编译包和编译后可执行文件的文件夹,用户可以根据自己的需要创建多个工作空间,在每个工作空间中开发不同用途的功能包。在图1-4中,我们创建了一个名为catkin_ws的工作空间,其中包含src、build和devel三个文件夹。
- src文件夹放置各个功能包和配置功能包的CMake配置文件CMakeLists.txt。这里说明一下,由于ROS中的源码采用catkin工具进行编译,而catkin工具又基于CMake技术,所以我们在src源文件空间和各个功能包中都会见到一个CMake配置文件CMakeLists.txt,这个文件起到配置编译的作用。
- build文件夹放置编译CMake和catkin功能包时产生的缓存、配置、中间文件等。
- devel文件夹放置编译好的可执行程序,这些可执行程序是不需要安装就能直接运行的。一旦功能包源码编译和测试通过后,可以将这些编译好的可执行文件直接导出与其他开发人员分享。
功能包是ROS中软件组织的基本形式,具有创建ROS程序的最小结构和最少内容,它包含ROS节点源码、脚本、配置文件等。
- CMakeLists.txt是功能包配置文件,用于编译Cmake功能包编译时的编译配置。
- package.xml是功能包清单文件,用xml的标签格式标记该功能包的各类相关信息,比如包的名称、开发者信息、依赖关系等,主要是为了使功能包的安装和分发更容易。
- include/<pkg_name>是功能包头文件目录,可以把功能包程序中包含的*.h头文件放在这里。include目录之所以还要加一级路径<pkg_name>是为了更好地区分自己定义的头文件和系统标准头文件,<pkg_name>用实际功能包的名称替代。不过这个文件夹不是必要项,比如有些程序没有头文件。
- msg、srv和action这三个文件夹分别用于存放非标准话题消息、服务消息和动作消息的定义文件。ROS支持用户自定义消息通信过程中使用的消息类型。这些自定义消息不是必要的,比如程序只使用标准消息类型。
- scripts目录存放Bash、Python等脚本文件,为非必要项。
- launch目录存放节点的启动文件,*.launch文件用于启动一个或多个节点,在含有多个节点的大型项目中很有用,为非必要项。
- src目录存放功能包节点所对应的源代码,一个功能包中可以有多个节点程序来完成不同的功能,每个节点程序都可以单独运行。这里src目录存放的是这些节点程序的源代码,你可以按需创建文件夹和文件来组织源代码,源代码可以用C++、Python等编写。
3. 从开源社区视角理解ROS架构
ROS是开源软件,各个独立的网络社区分享和贡献软件及教程,形成了强大的ROS开源社区,如图1-5所示。

▲图1-5 ROS的开源社区结构
ROS的发展依赖于开源和共享的软件,这些代码由不同的机构共享和发布,比如GitHub源码共享、Ubuntu软件仓库发布、第三方库等。ROS的官方wiki是重要的文档讨论社区,在里面可以很方便地发布与修改相应的文档页面。ROS的answer主页里有大量ROS开发者的提问和回答,对ROS开发中遇到的各种问题的讨论很活跃。
参考文献
[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

终于有人把ROS机器人操作系统讲明白了的更多相关文章
- 【2017.10.13 ROS机器人操作系统】ROS系统常用术语及资源
ROS机器人操作系统是一种后操作系统,提供了类似于软件开发中使用到的中间件的功能. ROS: Robot Operating System 机器人操作系统 Package: 功能包 Stack: 功能 ...
- ROS机器人操作系统相关书籍、资料和学习路径
作者:Top Liu链接:https://zhuanlan.zhihu.com/p/30391098来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文是易科机器人实验 ...
- ROSCon 2016视频和幻灯片发布 ROS机器人操作系统重要参考资料
ROSCon 2016视频和幻灯片发布 By Tully Foote on 十月19,2016 7:28 AM 全部PPT下载地址:http://pan.baidu.com/s/1gf2sn2F RO ...
- 【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
参考资料及致谢 本文的绝大部分内容转载自以下几篇文章,首先向原作者致谢,希望自己能在这些前辈们的基础上能有所总结提升. 1. 运动规划/路径规划/轨迹规划的联系与区别 https://blog.csd ...
- ROS机器人操作系统官方教程、源码汇总
1 wiki: http://wiki.ros.org/ 2 code: https://github.com/ ---- 1 基础教程 https://github.com/ros/ros_tut ...
- ROS机器人操作系统在线练习
废话不说,先看图吧: 1. ROS in 5 Days Entering ROS 2. ROS Navigation in 5 Days Mastering ROS 3. ROS Autonomous ...
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...
- 【ZZ】终于有人把云计算、大数据和人工智能讲明白了!
终于有人把云计算.大数据和人工智能讲明白了! https://mp.weixin.qq.com/s/MqBP0xziJO-lPm23Bjjh9w 很不错的文章把几个概念讲明白了...图片拷不过来... ...
- 机器人操作系统(ROS)在线实训平台学习实验指南
机器人操作系统(ROS)在线学习指南 在高校开设ROS相关课程已经积累了一年多的经验,由于自动化类专业在课程安排中不同于计算机相关专业,通常没有Linux相关的课程基础,直接上手ROS较为 ...
- 机器人操作系统 除了Android还有一个ROS(转)
你知道市面上的机器人都采用了哪些操作系统吗? 估计大多数人给出的答案就是 Android 了.从市面上的产品来看,基于 Android 系统开发的机器人确实是主流,但是还有一种操作系统却鲜为人知,它叫 ...
随机推荐
- Solution -「NOI 2017」「洛谷 P3825」游戏
\(\mathscr{Description}\) Link. 给大家看个乐子: link, 懒得概括题意啦. \(\mathscr{Solution}\) 对于没有 X 的情况, 显然可 ...
- Codeforces Round 957 (Div. 3)
题目链接:Codeforces Round 957 (Div. 3) 总结:E不懂,F差一个set去重 A. Only Pluses fag:枚举 B. Angry Monk fag:模拟 Solut ...
- 认识soui4js(第1篇)
源代码:https://github.com/soui4js/soui4js soui4js是soui4+quickjs的结合体. soui4是一套c++ directui客户端开发框架,soui4j ...
- 天翼云边缘安全加速平台亮相2023亚太内容分发大会暨CDN峰会
6月29日,第十二届亚太内容分发大会暨CDN峰会在北京召开.大会聚集了行业领/袖.专家和学者,深度探讨CDN的技术发展.应用与未来发展趋势,会上还公布了2023边缘加速创新企业榜单,中国电信天翼云成功 ...
- CF1326G 题解
题意: 蛛网树是一颗平面树,满足点是该树的凸包的顶点上等价于其是叶子. 给定一个平面树,求有多少种对点集的划分,使得每个划分出来的集合都是蛛网树. Solution 考虑树形 dp.设 \(f_u\) ...
- [CERC2014] Parades 题解
感觉长脑子了. 考虑在路线两端点的 \(lca\) 计算贡献,那么线段可以分两类: \(u\) 为 \(v\) 祖先. \(u,v\) 互不为祖先. 设 \(dp_i\) 表示只考虑 \(i\) 子树 ...
- Git - 安装Git
下载>> 安装 >> 下载 登录Git官网:https://git-scm.com/ 点击想要安装的版本 安装 1. 点击下一步(Next) 2. 选择安装路径 3. Git相 ...
- Oracle 23ai TPC-H 测试环境部署
最近,我在 Oracle Database 23ai 上进行了 TPC-H 100GB 测试,并整理了完整的实施步骤和优化经验.如果你也想评估 Oracle 数据库在决策支持场景下的性能,可以参考我的 ...
- 【EX6-1】带孔平板拉伸的弹塑性分析
带孔平板拉伸的弹塑性分析 来源:<ABAQUS有限元分析实例详解>石亦平等 1. 建模 塑性数据: abaqus输入塑性数据见ABAQUS弹塑性分析 网格划分: 2. 分析设置 单元类型设 ...
- # 50 个最常被问到的 Selenium 面试问题和答案
Q #1) 什么是自动化测试? 自动化测试或测试自动化是自动化手动过程以测试被测应用程序/系统的过程.自动化测试涉及使用单独的测试工具,该工具可让您创建可以重复执行且不需要任何手动干预的测试脚本. Q ...