ROS探索总结(一)——ROS简介
1:来源
2010年Willow Garage公司发布了开源机器人操作系统ROS(robot operating system),OS系统是起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,PR2现主要用于研究。PR2有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的钳子。PR2依靠底部的四个轮子移动。在PR2的头部,胸部,肘部,钳子上安装有高分辨率摄像头,激光测距仪,惯性测量单元,触觉传感器等丰富的传感设备。在PR2的底部有两台8核的电脑作为机器人各硬件的控制和通讯中枢。两台电脑安装有Ubuntu和ROS。
2:功能
ROS是开源的,是用于机器人的一种后操作系统,或者说次级操作系统。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。
ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。但是ROS本身并没有实时性。
一个使用ROS的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系。虽然基于中心服务器的那些软件框架也可以实现多进程和多主机的优势,但是在这些框架中,当各电脑通过不同的网络进行连接时,中心数据服务器就会发生问题。 ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
ROS设计成了语言中立性的框架结构。ROS现在支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。
为了支持交叉语言,ROS利用了简单的、语言无关的接口定义语言去描述模块之间的消息传送。接口定义语言使用了简短的文本去描述每条消息的结构,也允许消息的合成,
为了管理复杂的ROS软件框架,利用了大量的小工具去编译和运行多种多样的ROS组建,从而设计成了内核,而不是构建一个庞大的开发和运行环境。
一、 总体结构 根据ROS系统代码的维护者和分布来标示,主要有两大部分: (1)main:核心部分,主要由Willow Garage公司和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写。 (2)universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。 一般是从另一个角度对ROS分级的,主要分为三个级别:计算图级、文件系统级、社区级。
计算图
是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。这一级主要包括几个重要概念:节点(node)、消息(message)、主题(topic)、服务(service)。
节点
在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。
消息
节点之间是通过传送消息进行通讯的。
主题
消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。
服务
在ROS中,我们称之为一个服务,用一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。这类似于web服务器,web服务器是由URIs定义的,同时带有完整定义类型的请求和回复文档。需要注意的是,不像话题,只有一个节点可以以任意独有的名字广播一个服务:只有一个服务可以称之为“分类象征”,比如说,任意一个给出的URI地址只能有一个web服务器。
需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)
ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。
比如控制节点订阅和发布消息的模型如下:ROS的控制器给ROS的节点存储了主题和服务的注册信息。节点与控制器通信从而报告它们的注册信息。当这些节点与控制器通信的时候,它们可以接收关于其他以注册及节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时控制器也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。 节点与节点之间的连接是直接的,控制器仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个主题将会要求建立一个与出版该主题的节点的连接,并且将会在同意连接协议的基础上建立该连接。
另:ROS控制器控制服务:
文件系统级
ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式。ROS中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。
ROS的软件以包的方式组织起来。包包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。包的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的包短小精干。
堆是包的集合,它提供一个完整的功能,像“navigation stack”。Stack与版本号关联,同时也是如何发行ROS软件方式的关键。 ROS是一种分布式处理框架。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到包(Packages)和堆(Stacks)中,以便于共享和分发。
Manifests (manifest.xml):提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。
Stack manifests (stack.xml):提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。
社区级
ROS的社区级概念是ROS网络上进行代码发布的一种表现形式。
ROS探索总结(二)——ROS新手教程
ROS官网的wiki上针对新手的教程很详细,建议使用”apt-get“的方法进行安装,新版的ROS是groovy,但使用fuerte
http://ros.org/wiki/fuerte/Installation/Ubuntu
源码编译
http://ros.org/wiki/fuerte/Installation/Ubuntu/Source
安装完毕之后运行一下“roscore”,如果没有问题,安装就成功了
wiki上的新手教程http://www.ros.org/wiki/ROS/Tutorials
rospack find roscpp #找到相应的包或者stack
rosstack find stack_name
roscd roscpp #改变路径到相应的包或者stacks
roscd roscpp/include
roscd log #回到ros存储日志的文件
rosls roscpp_tutorials #罗列相应的包或者stacks文件夹
善于使用tab建(填充作用)
package包含节点(Node)、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。package的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的package遵从Goldilocks原则:短小精干。所有的ROS packages包括很多类似的文件:manifests, CMakeLists.txt, mainpage.dox, 和Makefiles.
roscreate-pkg package std_msgs roscpp rospy #
export ROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
#该路径添加到ros系统中(即更新ros的查找路径)
export ROS_PACKAGE_PATH=/home/zym:$ROS_PACKAGE_PATH
rospack find packa
????怎么删除
#查看package的第一层依赖项的查询
rospack depends1 package
#查看package依赖项的第一层依赖项的查询
rospack depends1 rospy
#查看所有的依赖项
rospack depends package
用roscreate-pkg建立package,根据系统关联来编译这些packages
1,系统关联
ROS package有时运行时需要连接外部库或者可执行程序。这些库或者程序的连接经常被关联到系统关联中。在一些情况下,这些系统关联不会被默认的安装,ROS提供了一个简单的工具--rosdep,用来下载和安装系统关联的。
ROS rospack必须在相应的package
manifest申明,参考小海龟的例子,
roscd turtlesim
cat manifest.xml #这个不对需要改成 package.xml
rosdep命令 ----根据ROS packages来安装系统变量
rosdep install package
rosdep install tuetlesim
2,编译packages
当所有的系统关联都已经被安装,我们就可以开始用 rosmake 命令编译我们创建好的package
rosmake命令 ---编译package
rosmake package
#编译多个packages
rosdep install turtle_teleop rxtools
rosmake turtle_teleop roscpp_tutorials rospy_tutorials rxtools