預備工作
后面操作中我們將會用到ros-tutorials程序包,請先安裝:
$ sudo apt-get install ros-<distro>-ros-tutorials
將 <distro> 替換成你所安裝的版本(比如Jade、Indigo、hydro、groovy、fuerte、kinetic等)。
由於我的版本是kinetic的,所有安裝命令如下:
$ sudo apt-get install ros-kinetic-ros-tutorials
一、ROS catkin 工作空間
下面我們開始創建一個catkin 工作空間:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
即使這個工作空間是空的(在'src'目錄中沒有任何軟件包,只有一個CMakeLists.txt鏈接文件),你依然可以編譯它:
$ cd ~/catkin_ws/
$ catkin_make
首次運行catkin_make命令,將會在src文件夾下創建一個CMakeLists.txt文件,且在根目錄下創建了兩個子文件夾build和devel,目錄結構如下:
catkin_ws # WORKSPACE - build/ # BUILDSPACE - devel/ # DEVEL SPACE - src/ # SOURCE SPACE CMakeLists.txt # Toplevel CMAKE file,provided by catkin
catkin_make命令在catkin 工作空間中是一個非常方便的工具。如果你查看一下當前目錄應該能看到'build'和'devel'這兩個文件夾。在'devel'文件夾里面你可以看到幾個setup.*sh文件。source這些文件中的任何一個都可以將當前工作空間設置在ROS工作環境的最頂層,想了解更多請參考catkin文檔。接下來首先source一下新生成的setup.*sh文件:
$ source devel/setup.bash
要想保證工作空間已配置正確需確保ROS_PACKAGE_PATH環境變量包含你的工作空間目錄,采用以下命令查看:
$ echo $ROS_PACKAGE_PATH
/home/saneri/catkin_ws/src:/home/saneri/catkin_ws/src:/opt/ros/kinetic/share
到此你的工作環境已經搭建完成,接下來可以繼續創建ROS程序包。
二、創建ROS程序包
1. 一個catkin程序包由什么組成?
一個程序包要想稱為catkin程序包必須符合以下要求:
1.> 該程序包必須包含catkin compliant package.xml文件,這個package.xml文件提供有關程序包的元信息。
2.> 程序包必須包含一個catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必須包含一個對CMakeList.txt文件的引用。
3.> 每個目錄下只能有一個程序包,這意味着在同一個目錄下不能有嵌套的或者多個程序包存在。
2. 在catkin工作空間中的程序包
開發catkin程序包的一個推薦方法是使用catkin工作空間,一個簡單的工作空間也許看起來像這樣:
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
3. 創建一個catkin程序包
使用 catkin_create_pkg 命令來創建一個新的catkin程序包創建之后我們看看他都能做些什么。
首先切換到之前通過創建catkin工作空間教程創建的catkin工作空間中的src目錄下:
$ cd ~/catkin_ws/src
現在使用catkin_create_pkg命令來創建一個名為'beginner_tutorials'的新程序包,這個程序包依賴於std_msgs、roscpp和rospy
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
這將會創建一個名為beginner_tutorials的文件夾,這個文件夾里面包含一個package.xml文件和一個CMakeLists.txt文件,這兩個文件都已經自動包含了部分你在執行catkin_create_pkg命令時提供的信息。
catkin_create_pkg命令會要求你輸入package_name,如果有需要你還可以在后面添加一些需要依賴的其它程序包:
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
4. 程序包依賴關系
4.1一級依賴
之前在使用catkin_create_pkg命令時提供了幾個程序包作為依賴包,現在我們可以使用rospack命令工具來查看一級依賴包。
$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
就像你看到的,rospack列出了在運行catkin_create_pkg命令時作為參數的依賴包,這些依賴包隨后保存在package.xml文件中。
$ roscd 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>
4.2間接依賴
在很多情況中,一個依賴包還會有它自己的依賴包,比如,rospy還有其它依賴包。
$ rospack depends1 rospy
genpy
rosgraph
rosgraph_msgs
roslib
std_msgs
一個程序包還可以有好幾個間接的依賴包,幸運的是使用rospack可以遞歸檢測出所有的依賴包。
$ rospack depends beginner_tutorials
三、編譯程序包
1. 一旦安裝了所需的系統依賴項,我們就可以開始編譯剛才創建的程序包了,如果你是通過apt或者其它軟件包管理工具來安裝ROS的,那么系統已經默認安裝好所有依賴項。
記得事先 source 你的環境配置(setup)文件,在Ubuntu中的操作指令如下:
$ source /opt/ros/kinetic/setup.sh
2. 使用 catkin_make
catkin_make 是一個命令行工具,它簡化了catkin的標准工作流程。你可以認為catkin_make是在CMake標准工作流程中依次調用了cmake 和 make。
使用方法:
# 在catkin工作空間下 $ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
開始編譯你的程序包
之前已經創建好了一個catkin 工作空間 和一個名為beginner_tutorials的catkin 程序包。現在切換到catkin workspace 並查看src文件夾:
$ cd ~/catkin_ws/ $ ls src beginner_tutorials/ CMakeLists.txt $ catkin_make
你可以看到很多cmake 和 make 輸出的信息:
Base path: /home/saneri/catkin_ws Source space: /home/saneri/catkin_ws/src Build space: /home/saneri/catkin_ws/build Devel space: /home/saneri/catkin_ws/devel Install space: /home/saneri/catkin_ws/install #### #### Running command: "cmake /home/saneri/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/saneri/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/saneri/catkin_ws/install" in "/home/saneri/catkin_ws/build" #### -- The C compiler identification is GNU 4.2.1 -- The CXX compiler identification is Clang 4.0.0 -- Checking whether C compiler has -isysroot -- Checking whether C compiler has -isysroot - yes -- Checking whether C compiler supports OSX deployment target flag -- Checking whether C compiler supports OSX deployment target flag - yes -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel -- Using CMAKE_PREFIX_PATH: /opt/ros/groovy -- This workspace overlays: /opt/ros/groovy -- Found PythonInterp: /usr/bin/python (found version "2.7.1") -- Found PY_em: /usr/lib/python2.7/dist-packages/em.pyc -- Found gtest: gtests will be built -- catkin 0.5.51 -- BUILD_SHARED_LIBS is on -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ~~ traversing packages in topological order: -- ~~ - beginner_tutorials -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- +++ add_subdirectory(beginner_tutorials) -- Configuring done -- Generating done -- Build files have been written to: /home/saneri/catkin_ws/build #### #### Running command: "make -j4" in "/home/saneri/catkin_ws/build" ####
catkin_make首先輸出它所使用到的每個空間所在的路徑,需要注意的是由於這些空間存在默認配置的原因,有幾個文件夾已經在catkin工作空間自動生成了,使用ls查看
saneri@localhost:~/catkin_ws$ ls
build devel src
build 目錄是build space的默認所在位置,同時cmake 和 make也是在這里被調用來配置並編譯你的程序包。
devel 目錄是devel space的默認所在位置, 同時也是在你安裝程序包之前存放可執行文件和庫文件的地方。
參考文檔:http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage
http://wiki.ros.org/cn/ROS/Tutorials/BuildingPackages