ROS创建工作空间和功能包
2017-05-24 16:45
786 查看
所有的ROS程序,包括我们自己开发的程序,都被组织成功能包,而ROS的功能包被存放在称之为工作空间的目录下。因此,在我们写程序之前,第一步是创建一个工作空间以容纳我们的功能包。
1.创建ROS工作空间
其实ROS工作空间就是linux下的一个目录,创建ROS工作空间就是创建一个linux目录,只是需要按照ROS的规范在这个目录下添加一个src的子目录,然后执行一个ROS的命令即可。
我们创建名为catkin_ws的工作空间,当然也可以使用其它名字,命令如下:
$mkdir -p catkin_ws/src
进入到catkin_ws/src目录下,可以看到catkin_ws和src目录下都是空的。进入到catkin_ws目录下,再执行如下命令:
$catkin_make
这个命令用于构建该工作空间,并且必须在工作空间的顶层使用catkin_make命令,这时你会发现在catkin_ws这个目录下多出两个目录“build”和“devel”。在devel目录下,还可以看到很多setup.*sh文件。接下来我们输入如下命令:
$source devel/setup.bash
上面的命令是在catkin_ws目录下执行的,意思是把catkin_ws/devel目录下的setup.bash文件挂载到ROS的文件系统里去,这样当用户执行一些文件系统的命令时,就不会提示找不到
该工作空间里的包或者文件了。
小提示:
对于许多用户来说,确实没有必要使用多个 ROS 工作空间。但是,ROS 的 catkin 编译系统,试图一次性编译同一个工作空间中的所有功能包。因此,如果你的工作涉及大量的功能包,或者涉及几个相互独立的的项目,则维护数个独立的工作空间可能是有帮助的。
2.创建ROS功能包
创建了工作空间,接下来就可以在工作空间里创建功能包。
功能包是一个存在于工作空间目录src目录下的一个目录,这个目录中包含一些文件或者目录,一个功能包必须以下几部分组成:
(1) 必须包括一个package.xml文件;
(2) 必须包括一个CMakeLists.txt文件。
在每一个功能包目录下不允许有其它的功能包,也就是不允许功能包嵌套。一个典型的工作空间结构如下:
我们之前已经创建过一个空的工作空间:catkin_ws,下面我们来看一下如何在一个工作空间中创建一个功能包。在创建功能包时需要使用catkin_create_pkg命令。
首先进入到目录catkin_ws/src目录下,创建一个名字为beginner_tutorials的功能包,它直接依赖于三个功能包:std_msgs,rospy以及roscpp,使用如下命令:
$catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
在创建的beginner_tutorials文件夹下可以看到package.xml和CMakeLists.txt。catkin_create_pkg要求您给出功能包的名字,及选择性的给出所创建的功能包依赖于哪一个功能包,命令的使用方法如下:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
这样,我们的一个包功能就创建好了,我们可能会需要对功能包之间的依赖性做一下解释。我们可以使用rospack命令来查看功能包之间的依赖关系(使用rospack命令的前提是已经安装了该命令)。
查看直接依赖关系:
$rospack depends1 beginner_tutorials
可以看到,返回的结果正是我们使用catkin_create_pkg时,所使用的参数。
$cd beginner_tutorials
$cat package.xml
结果如下:
在通常情况下,一个包所依赖的包又会依赖许多其它的包,这称为间接依赖。我们使用如下命令来查看rospy直接依赖的功能包:
$rospack depends1 rospy
返回结果如下:
一个功能包可以有很多的间接依赖关系,我们可以使用命令:
$rospack depends beginner_tutorials
来进行查看。返回结果如下:
接下来我们查看package.xml文件,我们将会一个标签一个标签的分析这个xml文件。
首先是description标签:
<description>The beginner_tutorials package</description>
这个标签是对功能包的一个简单描述。
maintainer标签:
license标签:
编译依赖性和运行依赖性标签,指明了该功能包所依赖的其它功能包,如果我们在使用catkin_create_pkg命令创建功能包的时候,没有制定我们创建的功能包依赖于哪些功能包,可以手动在这里添加依赖的功能包:
小提示:
ROS功能包的命名遵循一个命名规范,只允许使用小写字母、数字和下划线,而且首字符必须是一个小写字母。一些 ROS工具,包括 catkin,不支持那些不遵循此命名规范的功能包。
1.创建ROS工作空间
其实ROS工作空间就是linux下的一个目录,创建ROS工作空间就是创建一个linux目录,只是需要按照ROS的规范在这个目录下添加一个src的子目录,然后执行一个ROS的命令即可。
我们创建名为catkin_ws的工作空间,当然也可以使用其它名字,命令如下:
$mkdir -p catkin_ws/src
进入到catkin_ws/src目录下,可以看到catkin_ws和src目录下都是空的。进入到catkin_ws目录下,再执行如下命令:
$catkin_make
这个命令用于构建该工作空间,并且必须在工作空间的顶层使用catkin_make命令,这时你会发现在catkin_ws这个目录下多出两个目录“build”和“devel”。在devel目录下,还可以看到很多setup.*sh文件。接下来我们输入如下命令:
$source devel/setup.bash
上面的命令是在catkin_ws目录下执行的,意思是把catkin_ws/devel目录下的setup.bash文件挂载到ROS的文件系统里去,这样当用户执行一些文件系统的命令时,就不会提示找不到
该工作空间里的包或者文件了。
小提示:
对于许多用户来说,确实没有必要使用多个 ROS 工作空间。但是,ROS 的 catkin 编译系统,试图一次性编译同一个工作空间中的所有功能包。因此,如果你的工作涉及大量的功能包,或者涉及几个相互独立的的项目,则维护数个独立的工作空间可能是有帮助的。
2.创建ROS功能包
创建了工作空间,接下来就可以在工作空间里创建功能包。
功能包是一个存在于工作空间目录src目录下的一个目录,这个目录中包含一些文件或者目录,一个功能包必须以下几部分组成:
(1) 必须包括一个package.xml文件;
(2) 必须包括一个CMakeLists.txt文件。
在每一个功能包目录下不允许有其它的功能包,也就是不允许功能包嵌套。一个典型的工作空间结构如下:
workspace_folder/ -- WORKSPACE src/ -- SOURCE SPACE CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin package_1/ CMakeLists.txt -- CMakeLists.txt file for package_1 package.xml -- Package manifest for package_1 ... package_n/ CMakeLists.txt -- CMakeLists.txt file for package_n package.xml -- Package manifest for package_n
我们之前已经创建过一个空的工作空间:catkin_ws,下面我们来看一下如何在一个工作空间中创建一个功能包。在创建功能包时需要使用catkin_create_pkg命令。
首先进入到目录catkin_ws/src目录下,创建一个名字为beginner_tutorials的功能包,它直接依赖于三个功能包:std_msgs,rospy以及roscpp,使用如下命令:
$catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
在创建的beginner_tutorials文件夹下可以看到package.xml和CMakeLists.txt。catkin_create_pkg要求您给出功能包的名字,及选择性的给出所创建的功能包依赖于哪一个功能包,命令的使用方法如下:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
这样,我们的一个包功能就创建好了,我们可能会需要对功能包之间的依赖性做一下解释。我们可以使用rospack命令来查看功能包之间的依赖关系(使用rospack命令的前提是已经安装了该命令)。
查看直接依赖关系:
$rospack depends1 beginner_tutorials
可以看到,返回的结果正是我们使用catkin_create_pkg时,所使用的参数。
roscpp rospy std_msgs我们还可以直接在beginner_tutorials功能包下的package.xml中查看功能包的依赖关系。使用命令:
$cd beginner_tutorials
$cat package.xml
结果如下:
<package> ... <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> ... </package>
在通常情况下,一个包所依赖的包又会依赖许多其它的包,这称为间接依赖。我们使用如下命令来查看rospy直接依赖的功能包:
$rospack depends1 rospy
返回结果如下:
genpy rosgraph rosgraph_msgs roslib std_msgs
一个功能包可以有很多的间接依赖关系,我们可以使用命令:
$rospack depends beginner_tutorials
来进行查看。返回结果如下:
cpp_common rostime roscpp_traits roscpp_serialization genmsg genpy message_runtime rosconsole std_msgs rosgraph_msgs xmlrpcpp roscpp rosgraph catkin rospack roslib rospy
接下来我们查看package.xml文件,我们将会一个标签一个标签的分析这个xml文件。
首先是description标签:
<description>The beginner_tutorials package</description>
这个标签是对功能包的一个简单描述。
maintainer标签:
<!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="user@todo.todo">user</maintainer>根据这个标签知道它的维护者,另外标签的email属性也是必须的,可有多个maintainer标签。
license标签:
<!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <license>TODO</license>一般我们将license修改为BSD。
编译依赖性和运行依赖性标签,指明了该功能包所依赖的其它功能包,如果我们在使用catkin_create_pkg命令创建功能包的时候,没有制定我们创建的功能包依赖于哪些功能包,可以手动在这里添加依赖的功能包:
<!-- The *_depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>genmsg</build_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use run_depend for packages you need at runtime: --> <!-- <run_depend>python-yaml</run_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend>这样一来,功能包就创建好了,可以在功能包目录下添加你的源代码文件了。
小提示:
ROS功能包的命名遵循一个命名规范,只允许使用小写字母、数字和下划线,而且首字符必须是一个小写字母。一些 ROS工具,包括 catkin,不支持那些不遵循此命名规范的功能包。
相关文章推荐
- 编写第一个ROS(创建工作空间workspace和功能包package)
- 创建工作空间并创建和使用自己的ros功能包
- ROS下工作空间、功能包的建立,以及创建节点,实现节点之间的通信!
- ros_fuerte创建工作空间、创建ROS功能包、编译ROS功能包、创建节点(cpp)、编译节点、使用launch文件、创建srv和msg文件、使用新建的srv和msg文件
- ROS学习(一)ROS安装与创建工作空间
- ROS创建工作区域和功能包
- ROS的学习(三)创建一个工作空间
- 学习4:创建ros工作空间和ROS包
- ROS(一)关于创建一个工作空间并且编译一个package的两种方法
- Ros创建工作空间
- ros 无法创建工作空间
- ROS学习笔记-1: 构建工作空间-创建catkin包-编写发布器与订阅器
- (3)创建ROS工作空间和Package
- ROS中创建工作空间
- ROS的初步学习(四)--创建一个工作空间和一个程序包
- ROS基础:创建你自己的ROS工作空间
- 创建ROS工作空间和包
- ROS学习历程(3)-----创建工作空间和ROS包
- ros创建工作空间和包