创建ROS的工作空间
下面我们开始创建一个catkin 工作空间:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
首次运行catkin_make命令,将会在src文件夹下创建一个CMakeLists.txt文件,且在根目录下创建了两个子文件夹build和devel
catkin_make命令在catkin 工作空间中是一个非常方便的工具。如果你查看一下当前目录应该能看到’build’和’devel’这两个文件夹。在’devel’文件夹里面你可以看到几个setup.*sh文件。source这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层,
创建ROS包
catkin程序包要求
一个程序包要想称为catkin程序包必须符合以下要求:
1.> 该程序包必须包含catkin compliant package.xml文件,这个package.xml文件提供有关程序包的元信息。
2.> 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。
3.> 每个ROS包目录下只能有一个程序包,这意味着在同一个目录下不能有嵌套的或者多个程序包存在。(但同一个工作空间下可以有多个ROS包)如下所示:
创建一个catkin程序包
- 首先切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下:即我们刚刚创建的包里的src文件夹。
- 创建:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
例如:catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
如果我们在创建时指定了依赖包,那么在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>
在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。一个程序包还可以有好几个间接的依赖包,幸运的是使用rospack可以递归检测出所有的依赖包。
编译ROS包
- 一旦安装了所需的系统依赖项,我们就可以开始编译刚才创建的程序包了,如果你是通过apt或者其它软件包管理工具来安装ROS的,那么系统已经默认安装好所有依赖项。
记得事先 source 你的环境配置(setup)文件,在Ubuntu中的操作指令如下:
$ source /opt/ros/kinetic/setup.sh
- 使用 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
catkin_make首先输出它所使用到的每个空间所在的路径,需要注意的是由于这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成了.
build 目录是build space的默认所在位置,同时cmake 和 make也是在这里被调用来配置并编译你的程序包。
devel 目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。
添加cpp文件
在本包的src文件夹下新建cpp文件。编写代码后,需要更改CmakeLists.txt文件中下面两句
add_executable(${PROJECT_NAME}_node src/文件名)
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})