一、ROS介绍
ROS的总体目标是提高软件复用率。ROS横向来看具有五个特点和四位一体。
五个特点
1. 点对点设计
ROS最小的进程单元就是节点。节点(node),一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。节点也可以是负责机器人的某一个单独的功能。
由于机器人的元器件很多,功能庞大,因此实际运行时往往会运行众多的node,负责感知世界、控制运动、决策和计算等功能。
虽然基于中心服务器的那些软件框架也可以实现多进程和多主机的优势,但是在这些框架中,当各电脑通过不同的网络进行连接时,中心数据服务器就会发生问题。 ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
2. 多语言支持
ROS现在支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。
3.架构精简、集成度高
大多数已经存在的机器人软件工程都包含了可以在工程外重复使用的驱动和算法,不幸的是,由于多方面的原因,大部分代码的中间层都过于混乱,以至于很困难提取出它的功能,也很难把它们从原型中提取出来应用到其他方面。
为了应对这种趋势,我们鼓励将所有的驱动和算法逐渐发展成为和ROS没有依赖性单独的库。ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念
集成度高体现在 ROS利用了很多现在已经存在的开源项目的代码,比如说从Player项目中借鉴了驱动、运动控制和仿真方面的代码,从OpenCV中借鉴了视觉算法方面的代码,从OpenRAVE借鉴了规划算法的内容。
4.工具包丰富
为了管理复杂的ROS软件框架,利用了大量的小工具去编译和运行多种多样的ROS组建,从而设计成了内核,而不是构建一个庞大的开发和运行环境。
5.免费并且开源
ROS所有的源代码都是公开发布的。这将必定促进ROS软件各层次的调试,不断的改正错误。
ROS 框架
根据ROS系统代码的维护者和分布来标示,主要有两大部分:
(1)main:核心部分,主要由Willow Garage公司和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写。
(2)universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。
一般是从另一个角度对ROS分级的,主要分为三个级别:计算图级、文件系统级、社区级。
1、计算图级
计算图是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。
-
节点
ROS利用规模可增长的方式是代码模块化:一个系统就是典型的由很多节点组成的。节点也可以被称之为“软件模块”。我们使用“节点”使得基于ROS的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。 -
消息
节点之间是通过传送消息进行通讯的。每一个消息都是一个严格的数据结构。原来标准的数据类型(整型,浮点型,布尔型等等)都是支持的,同时也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)。 -
主题
消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。
-
服务
虽然基于话题的发布/订阅模型是很灵活的通讯模式,但是它广播式的路径规划对于可以简化节点设计的同步传输模式并不适合。在ROS中,我们称之为一个服务,用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的URI地址只能有一个web服务器。
在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)。
ROS的控制器给ROS的节点存储了主题和服务的注册信息。节点与控制器通信从而报告它们的注册信息。当这些节点与控制器通信的时候,它们可以接收关于其他以注册及节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时控制器也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。
节点与节点之间的连接是直接的,控制器仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个主题将会要求建立一个与出版该主题的节点的连接,并且将会在同意连接协议的基础上建立该连接。
2、文件系统级
ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式。
ROS中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。在ROS的文件系统级,有以下几个重要概念:包(package)、堆(stack)。
-
包
ROS的软件以包的方式组织起来。包包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。包的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的包短小精干。
-
堆
堆是包的集合,它提供一个完整的功能,像“navigation stack”。Stack与版本号关联,同时也是如何发行ROS软件方式的关键。
ROS是一种分布式处理框架。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到包(Packages)和堆(Stacks)中,以便于共享和分发。3、社区级
ROS的社区级概念是ROS网络上进行代码发布的一种表现形式。结构如下图所示:
二、ROS安装及配置
版本选择
-
Ubuntu 18.04
-
ROS Melodic
注意:安装时所选ROS版本需要与自己所用的Unbuntu版本匹配,具体匹配规则如下图:
还不清楚的情况下可以上网查阅相关资料。
安装过程
1、检查Ubuntu的软件和更新源
点击软件和更新图标进行检查,如果源是国外源,强烈建议更换成国内源,这样可以大大节省安装时下载所用时间。使用阿里云,清华中科大的源都可以。
2、设置ROS的下载源
使用以下终端命令,设置成中科大的源。
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
使用以下终端命令,设置公钥。
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
再更新最新可用的软件包列表,使用以下命令:
sudo apt update
以上三步执行成功情况如下:
使用以下命令,进行安装ROS。注意输入该命令后需要较长时间进行安装,大可先喝杯茶。
sudo apt install ros-melodic-desktop-full
安装成功结果如下图
安装成功后,在终端输入以下命令,使bash终端以后可以识别ROS中的roscore、rosrun等命令。
echo “source /opt/ros/melodic/setup.bash” >>
~/.bashrc
source ~/.bashrc
使用以下命令,下载其他功能组件。这些组件可以构建和管理开发者自己的ROS工作空间。
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
输入以下命令进行ROS初始化。
sudo rosdep init
如果出现以下错误,请进入etc文件夹下的hosts进行编辑。在文本后添加一个ip raw.githubusercontent.com
注意ip是通过https://site.ip138.com进行输入raw.githubusercontent.com查询获取得到ip,任意选择一个,对上述文本中ip进行替换即可
成功后如下图所示
turtlesim练习验证
基础练习,用键盘控制小海龟移动
使用以下命令打开ROS Master
roscore
用Ctrl + t打开一个新的终端窗口,并输入以下命令打开小海龟仿真器。不要关闭上一个终端!
rosrun turtlesim turtlesim_node
再新打开一个终端,使用以下命令,打开小海龟控制节点。不要关闭前两个终端!
rosrun turtlesim turtle_teleop_key
在最新的一个窗口中使用上下左右键,可以控制小海龟进行移动。
进阶练习,控制小海龟按照圆形轨迹移动
在基础练习的基础上,使用以下命令,打开节点图。可以观察到当前节点之间的联系。
rqt_graph
使用以下命令进行消息获取
rostopic info /turtle1/cmd_vel
使用以下命令进行消息格式获取
rosmsg show geometry_msgs/Twist
还可以通过以下命令进行实时输出小海龟的位置数据和方向数据
rostopic echo /turtle1/cmd_vel
结论:
乌龟线速度取值只有x和角速度z
上下控制线速度x,左右控制角速度z
通过以上结论,可以用以下命令实现发布节点,注意,输入命令后不要立即执行,先按tab键对命令进行补全。
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
再将上图中的数据修改为线速度X修改为1,角速度Z也修改为1。修改完后按下回车,执行命令。观察到的结果如下图:
总结
本文对ROS进行了十分详细的介绍。主要从ROS的特点和框架对ROS的基础知识进行了详细的剖析并通过对小海龟的控制案例,验证了ROS中的通讯原理,并通过控制小海龟进行圆形轨迹的运动,实践了发布话题控制小海龟进行圆形轨迹运动。本文内容能够加强我们对ROS的理解。