## For instruction on writing tutorials ## http://www.ros.org/wiki/WritingTutorials #################################### ##FILL ME IN #################################### ## for a custom note with links: ## note = ## for the canned note of "This tutorial assumes that you have completed the previous tutorials:" just add the links ## note.0= ## descriptive title for the tutorial ## title = 手动创建ROS package ## multi-line description to be displayed in search ## description = 本教程将展示如何手动创建ROS package ## the next tutorial description (optional) ## next = ## links to next tutorial (optional) ## next.0.link= [[cn/ROS/Tutorials/rosdep|管理系统依赖项]] ## next.1.link= ## what level user is this tutorial for ## level= IntermediateCategory ## keywords = #################################### <> <> {{{{{#!wiki buildsystem rosbuild 我们可以使用([[roscreate|roscreate-pkg]])工具来自动创建ROS package,不过,接下来你就会发现,这不是什么难事。 `roscreate-pkg`节省精力避免错误,但package只不过就是一个文件夹外加一个XML文件。 现在,我们要手动创建一个名为foobar的package。请进入你[[ROS/EnvironmentVariables|ROS_PACKAGE_PATH]]下的`pkgs`目录。 {{{ pkgs$ mkdir foobar pkgs$ cd foobar }}} 我们要做的第一件事就是添加 [[Manifest|manifest]] 文件. `manifest.xml` 文件使得像[[rospack]]这类工具能够检测出我们所创建的package的依赖项 在 `foobar/manifest.xml`文件里添加如下语句: {{{ A simple tutorial package Your Name Here BSD }}} 现在,你的package里已经包含配置文件(manifest.xml),ROS能够找到它。试一试,执行如下指令: {{{ rospack find foobar }}} 如果ROS配置正确,你将会看到类似如下的信息: `/home/user/ros/pkgs/foobar`. 这就是ROS如何在后台寻找package机理。 应该注意到我们刚才所创建的package依赖于 [[roscpp]] 和 [[std_msgs]].看看下面的例子你将会明白为什么要指定这两个特定的依赖项。试一试,执行[[rospack]]指令: {{{ rospack export --lang=cpp --attrib=cflags foobar rospack export --lang=cpp --attrib=lflags foobar }}} 在你运行指令的过程中,rospack查询`foobar`的依赖项并产生必要的头文件和链接语句用于编译和链接可执行文件。尽管ROS本质上是模块化的,但ROS编译系统可以使用这些指令来正确的编译和链接你创建的package。因为ROS编译系统会为你完成这些工作,所以你可能永远都不会直接使用到这些指令。但是,诚如你所见,如果用其他编译系统,使用这些指令也可以很轻松的帮助你完成编译工作。 至此,我们还需要两个编译文件: `Makefile` 和 [[CMakeLists|CMakeLists.txt]]. 在 `foobar/Makefile`文件内,输入: {{{ include $(shell rospack find mk)/cmake.mk }}} 这指示 `make` 指令,我们将使用CMake而不是Make来编译这个package. 同时我们还需要[[CMakeLists|CMakeLists.txt]] 文件,这样我们才能使用CMake. ROS之所以使用CMake 是因为它具有强大的跨平台编译的特性。 在`foobar/CMakeLists.txt` 文件中,输入: {{{ cmake_minimum_required(VERSION 2.4.6) include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake) rosbuild_init() }}} 这就是你想在ROS下用catkin编译package所要做的全部工作。当然了,如果想要让它正真的编译一些东西,你还需要学习关于CMake宏的一些知识。 请参考 [[catkin/CMakeLists.txt|CMakeLists.txt]] 以获得更多信息。 }}}}} {{{{{#!wiki buildsystem catkin 我们可以使用([[catkin/commands/catkin_create_pkg|catkin_create_pkg]])工具来自动创建ROS package,不过,接下来你就会发现,这不是什么难事。 `roscreate-pkg`节省精力避免错误,但package只不过就是一个文件夹外加一个XML文件。 现在,我们要手动创建一个名为foobar的package。请转至你的catkin workspace,并确认你已经刷新了setup文件。 {{{ catkin_ws_top $ mkdir -p src/foobar catkin_ws_top $ cd src/foobar }}} 我们要做的第一件事就是添加配置文件。 `package.xml` 文件使得像[[rospack]]这类工具能够检测出我们所创建的package的依赖项. 在 `foobar/package.xml`文件里添加如下语句: {{{ foobar 1.2.4 This package provides foo capability. PR-foobar BSD catkin roscpp std_msgs roscpp std_msgs }}} 同样,你可以参考 [[catkin/Tutorials/CreatingPackage#ROS.2BAC8-Tutorials.2BAC8-catkin.2BAC8-CreatingPackage.Customizing_the_package.xml|this page from catkin tutorial]] 以获得更多关于 [[catkin/package.xml]]的信息。 现在,你的package里已经包含配置文件(package.xml),ROS能够找到它。试一试,执行如下指令: {{{ rospack find foobar }}} 如果ROS配置正确,你将会看到类似如下的信息: `/home/user/ros/catkin_ws_top/src/foobar`. 这就是ROS如何在后台寻找package的机理。 应该注意到我们刚才所创建的package依赖于 [[roscpp]] 和 [[std_msgs]].而[[catkin]]恰恰是利用这些依赖项来配置所创建的package。 至此,我们还需要一个 [[CMakeLists|CMakeLists.txt]] 文件,这样 [[catkin_make]]才能够利用 CMake 强大的跨平台特性来编译所创建的package。 在 `foobar/CMakeLists.txt`文件里输入: {{{ cmake_minimum_required(VERSION 2.8.3) project(foobar) find_package(catkin REQUIRED roscpp std_msgs) catkin_package() }}} 这就是你想在ROS下用catkin编译package所要做的全部工作。当然了,如果想要让它真正的编译一些东西,你还需要学习关于CMake宏的一些知识。 请参考 [[catkin/CMakeLists.txt|CMakeLists.txt]] 以获得更多信息。回顾初级教程如 ([[ROS/Tutorials/CreatingPackage|CreatingPackage]] 等) 来修改你的 `package.xml` 和 `CMakeLists.txt`文件 }}}}} ##ROSTutorialCategory