转载自古-月:http://blog.csdn.net/hcx25909
小菜鸟上校:http://blog.csdn.net/xiaocainiaoshangxiao
一、 总体结构
![](https://img-my.csdn.net/uploads/201304/12/1365774956_2972.png)
二、 计算图级
![](https://img-my.csdn.net/uploads/201304/12/1365775358_7354.png)
(1) 节点
(2) 消息
(3) 主题
![](https://img-my.csdn.net/uploads/201304/12/1365775624_5015.png)
(4) 服务
![](https://img-my.csdn.net/uploads/201304/12/1365776033_9242.png)
节点与节点之间的连接是直接的,控制器仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个主题将会要求建立一个与出版该主题的节点的连接,并且将会在同意连接协议的基础上建立该连接。
![](https://img-my.csdn.net/uploads/201304/12/1365776154_8077.png)
三、 文件系统级
![](https://img-my.csdn.net/uploads/201304/12/1365776297_4808.png)
(1) 包
![](https://img-my.csdn.net/uploads/201304/12/1365776478_5355.png)
(2) 堆
![](https://img-my.csdn.net/uploads/201304/12/1365776550_5049.png)
ROS是一种分布式处理框架。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到包(Packages)和堆(Stacks)中,以便于共享和分发。下图是在包和堆在文件中的具体结构:
![](https://img-my.csdn.net/uploads/201304/12/1365776623_3362.png)
Stack manifests (stack.xml):提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。
四、 社区级
![](https://img-my.csdn.net/uploads/201304/12/1365776804_8920.png)
ROS文件系统中的两个最基本的概念:Package和Manifest,即包和清单文件。
Package是组织ROS代码的最基本单位,每一个Package都可以包括库文件,可执行文件,脚本及其它的一些文件。
Manifest文件是对Package的相关信息的一个描述。他提供了Package之间的依赖性,以及一个包的元信息,比如版本、维护着和许可证等信息。
文件系统提供了几个很有用的命令行的工具,专门用来对ROS的文件系统进行操作。
rospack被用来获取一个包的相关信息,这里只介绍它的find选项,用法如下:
- # rospack find [package_name]
- rospack find roscpp
就可以找到roscpp这个包的位置信息,可能会返回类似于下面的这种结果:
- /opt/ros/hydro/share/roscpp
roscd命令允许您利用包的名字直接切换到相应的文件目录下,当然这是对ROS文件系统而言,它的使用方法如下:
- roscd [locationname[/subdir]]
举一个例子,直接在终端输入:
- roscd roscpp
就可以直接切换到roscpp这个文件的目录下,可以使用如下命令来进行验证:
- pwd
返回的结果类似与如下形式:
- /opt/ros/hydro/share/roscpp
roscd将只能打开存在与环境变量ROS_PACKAGE_PATH中的目录及其子目录,您可以使用如下命令来查看ROS_PACKAGE_PATH中的内容:
- echo $ROS_PACKAGE_PATH
您所看到的结果可能类似于以下的情况:
- /opt/ros/hydro/base/install/share:/opt/ros/hydro/base/install/stacks
每一个路径使用“:”分割。
roscd log将会把您带到ROS存储日志文件的目录下面,当然如果您之前没有运行过任何的ROS程序的话,那么将会提示一个错误,即log文件夹不存在。
rosls能够让您直接利用包的名字,去列举包中的所有文件即文件夹,而不用使用绝对路径。它的使用和roscd是一样的,只有存在于ROS_PACKAGE_PATH中的目录及其子目录才能使用这个命令。使用方法如下:
- # rosls [locationname[/subdir]]
例子如下:
- rosls roscpp_tutorials
返回的结果如下:
- <span style="font-size:18px">cmake package.xml srv</span>
之前有过使用linux命令行经验的人都清楚,我们在输入一个比较长的文件的名字时,可以使用tab键来提供方便,ros也是这样的,例如:
- # roscd roscpp_tut<<< now push the TAB key >>>
在输入完tab键之后,看到的结果如下:
- roscd roscpp_tutorials/
当然有些场合如果工作目录下有多个文件有相同的前缀时,就需要我们输入到直到系统能够识别为止。
相信很多使用过linux的朋友们会发现这些命令和linux下的命令是非常相似的。