二.ROS文件系统级
目录
文件系统级是用于描述可以在硬盘上查找到的代码及可执行文件程序,在这一级中将使用一组概念来解释ROS的内部组成、文件架结构以及工作所需的核心文件。
文件系统级是用于描述可以在硬盘上查找到的代码及可执行文件程序,在这一级中将使用一组概念来解释ROS的内部组成、文件架结构以及工作所需的核心文件。
下面就依据这个示意图来一层一层的来说明文件系统
1.创建一个工作空间
工作空间就是一个包含功能包、可编辑源文件或编译包的文件夹
注:wiki_ws是工作空间名称(自行任意取名),使用mkdir命令创建工作空间时必须要同时在wiki_ws下创建一个src目录
下面是对catkin_make的一个解释:
在catkin_make之前必须要回到工作空间路径下。catkin_make是帮助我们初始化工作空间。在没有catkin之前,工作空间中只有src文件(源文件空间(source space),这是我们编写代码的地方,放置了各类功能包、程序源文件等)
在catkin之后,就会自动生成devel和build文件。
build文件夹是编译空间(build space),在build中,CMake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。
devel文件夹是开发空间(development space),保存一些生成的目标文件、环境变量,如头文件、动态链接库、静态链接库和可执行文件等,这些都是编译后的程序,无需安装就能用来测试的程序。
但catkin_make的最主要功能其实不是初始化工作空间,而是编译。一般写完代码需要catkin_make一下,这样系统会帮助我们自动构建,生成我们需要的目标文件。在编译完之后必须要记得source一下刷新环境。
每次编译完之后必须刷新一下工作空间的环境,否则系统可能找不到工作空间,只有source之后系统才知道ROS可执行文件放在何处,之后才能运行。$source ~/wiki_ws/devel/setup.bash。但最好是使用echo命令直接追加到~/.bashrc文件之中,这样的话每次打开新的终端系统就会刷新工作空间环境,可以简化操作。
2.文件系统级的一些概念
Package(功能包):是ros中软件组织的基本形式,是构成ROS的基本单元,也是catkin编译的基本单元。一个package可以包含多个可执行文件(节点)。ROS应用程序是以功能包为单位开发的,功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件,还包含功能包所需的所有文件,如依赖库、数据集和配置文件等。
如何判断是一个package:在package文件下一定有CMakeList.txt和package.xml这两个文件。CMakeList.txt规定了catkin编译的规则,即告诉编译系统如何编译在这个包下的代码,需要编译那些文件,需要那些依赖,生成那些目标文件等信息。具体的写法如下,系统会帮我们生成这个模板,我们只需更改就行。
package.xml文件定义了包的属性,如包名、版本号、作者、依赖等等(包的自我描述)。创建包的时候会提供一个写好的模板(如下)。通常我们需要修改的是build_depengd(会显示当前功能包安装之前必须先安装那些功能包)和run_depend(显示运行功能包代码所需的包)两个标记。
Package manifest(功能包清单):记录功能包的基本信息,包含作者信息、许可信息、依赖选项和编译标志等信息。包的清单由一个名为package.xml的文件管理。
Meta package(元功能包):用于同一目的的功能包的集合。如导航功能包包含AMCL、DWA、EKF和map_server等10余个功能包。
Meta package manifest(元功能包清单):类似于功能包清单,不同之处在于元功能包清单中可能会包含运行时所需要依赖的功能包或者声明一些引用的标签。
.msg(消息类型,对消息的描述):消息是ROS节点之间发布/订阅的通信消息,可以使用ROS系统提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义需要的消息类型。
.srv(服务类型,对服务的描述):服务类型定义了ROS服务器/客户端通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹下自定义需要的服务类型.
3.文件系统级中的src目录详解
src是我们真正编写代码的地方,在我们写完代码后catkin_make进行编译,build和devel会自动生成。
在这个src目录中放置了各类功能包。在前面提过package是catkin编译的基本单元,catkin的编译对象就是一个又一个的package。catkin编译系统在编译的时候会在src目录下递归的查找每一个package,因此可以将几个package放在同一个文件夹下(集合成元功能包)。
针对开头的示意图中的package4下面的各文件进行详细讨论:
CMakeList.txt和package.xml上面已经说明过。
scripts:防止可执行脚本文件,如python和shell等。
include/package_name:包含了我们所需要在包内使用的头文件和库。
src:存储C++源代码。
msg:包含自定义消息类型格式
srv:包含自定义服务类型格式
launch:存放launch文件(.launch或者.xml)。launch文件可帮助一次运行多个可执行文件。
config:这个是ROS包中保存的所有需要使用的配置文件。
4.常用指令
注:roscd、rospack等ROS工具只能查找到那些路径已经包含在环境变量ROS_PACKAGE_PATH中的软件包。
如果要使用这些ros工具查找到自己创建的工作空间下的某个包,那么这个工作空间必须要被包含到环境变量ROS_PACKAGE_PATH中,否则会查找不到这个包。要查看ROS_PACKAGE_PATH中包含的路径可以输入:$ echo $ROS_PACKAGE_PATH 每个路径之间用冒号分隔开来。
如果自行创建的工作空间没有被包含在环境变量ROS_PACKAGE_PATH中则可以进入直接在终端运行如下代码将自行创建的工作空间加入到ROS_PACKAGE_PATH中。
$export ROS_PACKAGE_PATH=~/wiki_ws/src:$ROS_PACKAGE_PATH
1. rospack 获取软件包的有关信息
查找某个package地址 :$rospack find package_name
列出本地所有的package:$rospack list
2.roscd 直接切换工作目录到某个package中
$roscd package_name[/子目录名称]
可以用pwd命令查看当前所在目录
3.rosls 列举某个package下的文件信息
$rosls package_name
4.roscd log 切换到ROS保存日志文件的目录下。但需要注意的是,如果你没有执行过任何ROS程序,系统会报错说该目录不存在。
$roscd log
5.创建一个package
一个package必须包含1个package.xml和1个CMakeList.txt文件
首先进入之前创建的工作空间的src目录下,然后用catkin_create_pkg package_name depends创建一个包。
创建一个名为beginner_tutorials的包,这个包的依赖是std_msgs、roscpp和rospy。在创建这个包的同时还在这个包里面生成了package.xml和CMakeList.txt两个文件,这两个文件都已经自动包含了部分我们在执行catkin_create_pkg命令时提供的信息。