預備工做
後面操做中咱們將會用到ros-tutorials程序包,請先安裝:python
$ sudo apt-get install ros-<distro>-ros-tutorials
將 <distro> 替換成你所安裝的版本(好比Jade、Indigo、hydro、groovy、fuerte、kinetic等)。c++
因爲個人版本是kinetic的,全部安裝命令以下:bash
$ sudo apt-get install ros-kinetic-ros-tutorials
1、ROS catkin 工做空間python2.7
下面咱們開始建立一個catkin 工做空間:ide
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
即便這個工做空間是空的(在'src'目錄中沒有任何軟件包,只有一個CMakeLists.txt連接文件),你依然能夠編譯它:工具
$ cd ~/catkin_ws/
$ catkin_make
首次運行catkin_make命令,將會在src文件夾下建立一個CMakeLists.txt文件,且在根目錄下建立了兩個子文件夾build和devel,目錄結構以下:ui
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文件:spa
$ 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程序包。code
2、建立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
3、編譯程序包
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