这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 理解ROS文件系统级

共2条 1/1 1 跳转至

理解ROS文件系统级

菜鸟
2017-09-27 10:02:43     打赏

    ROS系统的架构主要设计和划分成了三部分,每一部分都代表一个层级的概念:

    · 文件系统级(The Filesystem level)

    · 计算图级(The Computation Graph level)

    · 开源社区级(The Community level)

    第一级是系统级。在这一级,我们会使用一组概念来解释ROS的内部构成、文件夹结构,以及工作所需的核心文件。

    第二级是计算图级,体现的是进程和系统之间的通信。在相关小节中,我们将学习ROS的各个概念和功能,包括建立系统、处理各类进程、与多台计算机通信等。

    第三级是开源社区级,我们将解释一系列的工具和概念,其中包括在开发人员中间如何共享知识、算法和代码。这个层级非常重要,正是由于开源社区的大力支持,ROS系统才得以快速成长。

    与其他操作系统类似,一个ROS程序的不同组件要被放在不同的文件夹下。这些文件夹是根据功能的不同对文件进行组织的:

功能包(Package:功能包是ROS中软件组织的基本形式。一个功能包具有用于创建ROS程序的最小结构和最少内容。它可以包含ROS运行的进程(节点)、配置文件等。

功能包清单(Package Manifest:功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。一个包的清单由一个名为package.xml的文件管理。

综合功能包(Metapackage:如果你将几个具有某些功能的功能包组织在一起,那么你将会获得一个综合功能包。在ROS Fuerte中,这种包的组织形式被称为功能包集(Stack)。为了保持ROS简洁,功能包集被移除,现在使用综合功能包实现这个功能。在ROS系统中,存在大量不同用途的综合功能包,例如导航功能包集。

综合功能包清单(Metapackage manifest:综合功能包清单(package.xml)类似普通功能包但有一个XML格式的导出标记。它在结构上也有一定的限制。

消息类型(Message(msgtype:消息是一个进程发送到其他进程的信息。ROS系统有很多的标准类型消息。消息类型的说明存储在my_package/msg/MyMessageType.msg中,也就是对应功能包的msg文件夹下。

服务类型(Servicesrv)type:服务描述说明存储在my_package/src/MyServiceType.srv中,定义了在ROS中由每个进程提供的关于服务请求和响应的数据结构。

工作空间

    工作空间是包含功能包、可编辑源文件或编译包的文件夹。当你想同时便宜不同的功能包时非常有用,并且可以用来保存本地开发包。

    每一个文件夹下都是一个具有不同功能的空间:

源文件空间(The Source space):在源文件(src文件夹)放置了功能包、项目、克隆包等。在这个空间最重要的一个文件是CmakeList.txt调用CMake。这个文件是通过catkin_int_workspace命令创建的。

编译空间(The Build space):在build文件夹里CMake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。

开发空间(The Developmentdevelspace:devel文件夹用来保存编译后的程序,这些无需安装就能用来测试程序。一旦项目通过测试,你可以安装或到处功能包与其他开发人员共享。

    catkin编译包有两个选项。第一个是使用标准CMake工作流程,通过此方式可以一次编译一个包,见一下命令:

$ cmake packageToBuild/

$ make

如果你想编译所有的包,可以使用catkin_make命令行,见一下命令:

$ cd workspace

$ catkin_make

    在ROS配置的编译空间目录中,这两个命令编译可执行文集那。

    ROS的另一个有趣的特性是它的覆盖。当你正在使用ROS功能包,例如Turtlesim,你可以使用安装版本,也可以下载源文件并编译它来使用你的修改版本。

    ROS允许使用你自己版本的功能包以替换安装版本。如果你正在安装升级包,这是非常有用的。或许此时你并不理解它的作用,但无须担心,在下一章我们将使用这个功能包来创建自己的插件。

功能包

    功能包指的是一种特定的文件结构和文件夹组合。这种结构如下所示:

include/package_name/:此目录包含了你需要的库头文件。

msg/:如果你要开发非标准消息,请把文件放在这里。

scripts/:其中包括Bash、Python或任何其他脚本的可执行脚本文件。

src/:这里存储程序源文件的地方。你可能会为节点创建一个文件夹或按照你希望的方式去组织它。

srv/:这表示服务(srv)类型。

CMakeLists.txt:这是CMake的生成文件。

package.xml:这是功能包清单文件。

    为了创建、修改或使用功能包,ROS给我们提供了一些工具:

rospack 使用此命令来获取或在系统中查找工作空间。

catkin_create_pkg 当你想要创建一个新的功能包时,使用此命令。

catkin_make 使用此命令来编译工作空间。

rosdep 此命令安装功能包的系统依赖项。

rqt_dep 这个命令用来查看包的依赖关系图。如果你想看包的依赖关系图,你会在rqt发现一个称为包图(package graph)插件。选择一个包并查看依赖关系。

    若要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于Linux命令的命令。例如:

roscd 此命令用于更改目录,类似于Linux中的cd命令。

rosed 此命令用来编辑文集。

roscp 此命令用于从一功能包复制文件。

rosd 此命令列出功能包的目录。

rosls 此命令列出功能包下的文件,类似于Linux中的ls命令。

    文件package.xml必须在功能包中,用来说明此功能包相关的各类信息。如果你发现在某个文件夹内包含此文件,那么这个文件夹很可能由一个功能包或综合功能包。

    打开一个package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了更容易地安装和分发这些功能包。

    在package.xml文件中使用两个典型标记是<build_depend>和<run_depend>。

    <build_depend>标记会显示当前功能包安装之前必须先安装那些功能包。这是因为新的功能包会使用其他包的一些功能。

    <run_depend>标记显示运行功能包代码所需要的包。右面截图是package.xml文件的示例。

综合功能包

    如前所述,综合功能包是一些只有一个文件的特定包,它是package.xml。它不包含其他文件,如代码等。

    综合功能包用于引用其他功能特性类似的功能包,例如导航包、ros_tutorials等。

    你可以将ROS Fuerte的功能包和功能包级转为Hydro和catkin。具体参考http://wiki.ros.org/catkin/migrating_from_rosbuild。

    你可以看到在ros_tutorials综合功能包中package.xml的内容。你可以看到<export>标记和<run_depend>标记,这些是功能包清单中必不可少的。

    如果你想定位ros_tutorials综合功能包,可以使用下面的命令:

$ rosstack find ros_tutorials

    显示路径为:/opt/ros/hydro/share/ros_tutorials。

    查看里面的代码,通过下面命令:

$ vim /opt/ros/hydro/share/ros_tutorials/package.xml

    记住Hydro使用综合功能包,不是功能包集,但还是用rosstack命令用于查找综合功能包。

消息

    ROS使用了一种简化的消息类型描述语言来描述ROS节点发布的数据值。通过这样的描述语言,ROS能够使用多种编程语言生成不同类型消息的源代码。

    ROS提供了很多预定义消息类型。如果你创建了一种新的消息类型,那么就要把消息的类型定义放到功能包的msg/文件夹下。该文件夹中,有用于定义各种消息的文件。这些文件都以.msg为扩展名。

    消息类型必须具有两个主要部分:字段和常量。字段定义了要在消息中传输的数据类型,例如int32、float32、string或之前创建的新类型,如叫做type1和type2的新类型。常量用于定义字段的名称。

    一个msg文件的示例如下:

int32 id

float32 vel

string name

    我们能够在下表中找到很多ROS消息所使用的标准数据类型:

基本类型

序列化

C++

Python

bool(1)

unsigned 8-bit int

uint8_t(2)

bool

int8

signed 8-bit int

int8_t

int

uint8

unsigned 8-bit int

uint8_t

int(3)

int16

signed 16-bit int

int16_t

int

uint16

unsigned 16-bit int

uint16_t

int

int32

signed 32-bit int

int32_t

int

uint32

unsigned 32-bit int

uint32_t

int

int64

signed 64-bit int

int64_t

long

uint64

unsigned 64-bit int

uint64_t

long

float32

32-bit IEEE float

float

float

float64

64-bit IEEE float

double

float

string

ascii string(4)

std::string

string

time

secs/nsecs signed 32-bit ints

ros::Time

rospy.Time

duration

secs/nsecs signed 32-bit ints

ros::Duration

rospy.Duration

    ROS消息中的一种特殊类型是报文头,主要用于添加时间戳、坐标位置等。报文头还允许对消息进行编号。通过在报文头内部添加信息,我们可以知道是哪个节点发出的消息,或者可以添加一些能够被ROS处理的其他功能。

    报文头类型包含一下字段:

uint32 seq

time stamp

string frame_id

    可以通过下面命令查看消息的结构:

$rosmsg show std_msgs/Header

    我们将在后续的章节中看到,正是通过报文头才能够记录当前机器人运行时间戳和坐标位置。

    在ROS中有一些处理消息的工具。例如rosmsg命令行工具能够输出消息定义消息,并可以找到使用该消息类型的源文件。

    后面我们会学习如何使用正确的工具创建消息。

服务

    ROS使用了一种简化的服务描述语言来描述ROS的服务类型。这直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信。服务的描述存储在功能包的srv/子目录下.srv文件中。

    若要调用服务,你需要使用该功能包的名称及服务名称。例如,对于sample_package1/srv/sample1.srv文件,可以将它称为sample_package1/sample1服务。

    ROS中有一些执行文件某些功能与服务的工具。rossrv工具能输出服务说明、.srv文件所在的功能包名称,并可以找到使用其某一服务类型的源代码文件。

    如果你想要在ROS中创建一个服务,可以使用服务生成器。这些工具能够从基本的服务说明中生成代码。你只需要在CMakeLists.txt文件中加一行gensrv()命令。

    在后面的章节中,我们将会学习如何创建服务。




专家
2017-09-27 12:31:17     打赏
2楼

与楼主一起进步。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]