01ROS简介很多初学者一听到机器人操作系统,可能会被“操作系统”这个词吓到。其实简单来说,ROS就是一个帮助程序进程更方便地进行通信的分布式通信框架。一个机器人通常包括多个部分,每个部分都有配套的控制程序来实现机器人的运动和视听功能。那么如何协调机器人或多个机器人的机器人群中的这些部分呢?这时候就需要让分散的组件能够相互通信。在多机器人集群中,这些分散的组件也分散在不同的机器人上。解决这个分布式通信问题正是ROS设计的初衷。随着越来越多的人参与ROS开发和源代码贡献,社区中涌现出大量第三方工具和实用的开源软件包,造就了ROS的今天。初学者经常困惑的一个地方是,学习ROS就等于学习机器人开发吗?当然不是。严格来说,ROS只是一个通信框架。机器人中的各种算法和应用仍然是用C++、Python等常见的编程语言开发的。一、ROS的性能特点在正式学习ROS之前,先介绍一下ROS的几个特点,即元操作系统、分布式通信机制、松耦合的软件框架、丰富的开源函数库等,帮助大家建立一些感性的认识.ROS是用于机器人技术的元操作系统。也就是说,它不是真正意义上的操作系统,其底层的任务调度、编译、设备驱动等仍由其原生操作系统UbuntuLinux完成。ROS实际上是运行在UbuntuLinux上的一个子操作系统,或者说是一个软件框架,但它提供了类似于操作系统的硬件抽象、函数调用、进程管理等功能,以及获取、编译、运行的功能和工具。跨平台。ROS的核心思想是将机器人的软件功能做成节点,节点之间通过发送消息进行通信。这些节点可以部署在同一台主机上,也可以部署在不同的主机上,甚至可以部署在互联网上。ROS网络通信机制中的主节点(master)负责管理和调度网络中各个节点之间的通信过程,同时提供配置网络中全局参数的服务。ROS是一个松耦合的软件框架,它使用分布式通信机制来实现节点间的进程通信。ROS软件代码采用松耦合方式组织,开发过程灵活,管理维护方便。ROS拥有丰富的开源函数库。ROS是一款基于BSD(BerkeleySoftwareDistribution,伯克利软件发行)协议的开源软件。它允许任何人在商业和闭源产品中修改、重用、重新发布和使用它。使用ROS,您可以快速构建自己的机器人原型。2、ROS的发行版与Linux的发行版类似。ROS的发行版内置了一系列常用的功能包,即ROS系统打包安装在原生系统中。ROS最初是基于Ubuntu系统开发的。ROS的发行版名称也采用与Ubuntu相同的规则,即版本名由两个首字母相同的英文单词组成,版本首字母按字母升序选择。图1-1显示了ROS的一些主要版本。▲图1-1ROS主版本三、ROS的学习方法要想学好和用好ROS,需要大量的实际操作。因此,在快速了解ROS的核心概念和编程范式之后,还需要结合大量的实际项目来深入理解ROS。学会用正确的方式解决问题,可以帮助你更快地提高自己的能力。ROS学习资源主要包括以下内容。官网:www.ros.org源代码:github.comWiki:wiki.ros.orgQ&A:answers.ros.org02ROS系统架构安装好ROS后,应该很多朋友都迫不及待的想马上开始写程序了。由于ROS的架构比较复杂,为了方便理解后面遇到的各种概念,这里先讨论一下ROS的系统架构,让大家对ROS中的各种概念有一个全面的掌握。按照官方的说法,可以从计算图、文件系统、开源社区等角度理解ROS架构。1、从计算图的角度理解ROS架构ROS中可执行程序的基本单元称为节点(node),节点之间通过消息机制进行通信,从而形成网络图,也称为计算图,如图1-3所示。▲图1-3ROS的计算图结构节点是一个可执行程序,通常也称为进程。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库。消息是组成计算图的关键,包括消息机制和消息类型。消息机制分为三种:topic、service、action。每种消息机制中传输的数据都有特定的数据类型(即消息类型)。消息类型可以分为主题消息类型、服务消息类型和动作消息类型。消息机制和消息类型将在1.5节中解释。数据包(rosbag)是ROS中专门用来保存和回放topic中数据的文件。它可以用数据包记录一些难以采集的传感器数据,然后反复回放以调试算法性能。参数服务器可以为整个ROS网络中的节点提供易于修改的参数。参数可以认为是节点中可以被外部修改的全局变量,有静态参数和动态参数之分。静态参数一般用于设置节点启动时节点的工作模式;动态参数可用于在节点运行时对节点进行动态配置或改变节点的工作状态,如电机控制节点中的PID控制参数。主节点负责调度和管理各个节点之间的通信过程。所以master节点必须先启动,可以通过roscore命令启动。2、从文件系统的角度理解ROS架构。ROS程序的不同组件应该放在不同的文件夹中。这些文件夹根据不同的功能组织文件。这就是ROS的文件系统结构,如图1-4所示。▲图1-4ROS的文件系统结构工作区是一个包含函数包、编译包和编译后的可执行文件的文件夹。用户可以根据需要创建多个工作区,在每个工作区开发不同的程序。用途的功能包。在图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/
