catin_make编译过程,cmake指令依据你的CMakeLists.txt 文件,生成cmakefiles和makefile文件,make再依据此cmakefiles和makefile文件编译链接生成可执行文件,catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径.
一、先确定自己的环境变量是否设置正确
export | grep ROS
若出现如下的,说明是正确的
declare -x ROSLISP_PACKAGE_DIRECTORIES=""
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
二、创建一个catkin工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
三、打开工作空间,编译这个工作空间,即使工作空间是空的
$ cd ~/catkin_ws/
$ catkin_make
编译命令:
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
四、查看编译后的目录
可看到“build”和“devel”这两个文件夹,与src文件夹并列
在devel文件夹里,可以看到有几个setup.*sh文件,
通过source命令激活这些文件中任何一个文件都会将这个工作空间覆盖到环境中:
$ source devel/setup.bash
五、确认自己的工作空间是否已经设置正确
echo $ROS_PACKAGE_PATH
如果出现如下的显示,说明设置正确
/opt/ros/kinetic/share
六、工作空间的文件结构
一个catkin的包主要有以下几部分组成:
(1)必须包括一个package.xml文件;
(2)必须包括一个CMakeLists.txt文件;
(3)在每一个文件夹下只能有一个包,且包不允许嵌套。
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
src
include
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
src
include
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
格式1:格式1标准说明是REP-0127
格式2:格式2标准说明是REP-0140
最高级tag,属性:format,用于指定格式
:package名称
:当前版本
:package的基本描述
(至少一个):维护者
(至少一个):协议
(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。
格式1
(多个):运行时需要依赖的其它package,如动态链接库、可执行文件、Python模块、脚本文件等。
(多个):进行单元测试时的依赖项,如前两个标签中已出现过,则不必再出现
格式2
:用于帮助使用本package的其它包传递依赖声明
:构建工具的依赖传递声明
:相当于格式1的run_depend标签。
: 相当于build_depend + buildtool_depend + exec_depend,避免重复写三个声明。不建议对系统依赖使用,因为会强行依赖development级package。
:构建文档所需要的依赖,当前没什么用,以后可能会有需要
:进行单元测试时的依赖项,此标签中的package 可以 在其它标签中出现
上述是对package.xml的基本说明,对于用户而言,如果通过catkin_create_package命令生成的包,往往已经自动生成了需要的全部标签,只需要在依赖有所变化的情况下更改(格式1):
catkin基于CMake实现,CMakeList的语句与基本CMake一致,常用的包括:
cmake_minimum_required():CMake版本
project():工程名
find_package():加载外部变量
加载catkin中的变量,同时添加angles、roscpp、std_msgs的依赖 find_package(catkin REQUIRED COMPONENTS angles roscpp std_msgs)
加载Boost中的变量 find_package(Boost REQUIRED COMPONENTS thread)
include_directories():添加头文件路径
添加./include、${catkin_INCLUDE_DIRS}为头文件路径,如果有其它外部路径也在这里添加 include_directories(include ${catkin_INCLUDE_DIRS}) Boost_INCLUDE_DIRS环境变量在上面find_package中加载 include_directories( ${Boost_INCLUDE_DIRS})
add_library():生成库
生成库文件,可传入多个源文件 add_library(your_library libsrc1.cpp libsrc2.cpp libsrc_etc.cpp )
add_executable():生成可执行文件
生成可执行文件,可以传入多个源文件 add_executable(my_node src0.cpp src1.cpp src2.cpp )
add_subdirectory():一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢?add_subdirectory命令,可以将指定的文件夹加到build任务列表中。
add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加,如下:
添加对其它package消息的依赖,前提是已经通过find_package()引入了这个package add_dependencies(my_target ${catkin_EXPORTED_TARGETS}) # 添加对本package消息的依赖 add_dependencies(my_target ${ ${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries():链接库
为可执行文件或库添加链接库 target_link_libraries(my_node ${catkin_LIBRARIES}
ROS基本库 ${Boost_LIBRARIES} # Boost库 )
install():安装
默认情况catkin会为每个package在./devel中建立目录,存放目标文件
目标文件可以直接通过rosrun和roslaunch访问
如需制定其它安装位置,则需通过install()命令 install(TARGETS my_node0 my_node1 ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
除此之外,catkin还为ROS设计了一些独有语句,包括:
add_message_files(), add_service_files(), add_action_files()
用于添加自定义的message、service和action文件。基本语法为:
以message为例,service、action类似 add_message_files( # 目录名 DIRECTORY msg # 文件名 FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg )
generate_messages()
用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的message文件包。
一般情况下需要依赖std_msgs,如果用到了其它类型的msg,也要在这声明。如下:
generate_messages(DEPENDENCIES std_msgs)
catkin_package()
catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
必须在声明add_library()或add_executable()前调用
有5个可选参数:
INCLUDE_DIRS - 声明给其它package的include路径
LIBRARIES - 声明给其它package的库
CATKIN_DEPENDS - 本包依赖的catkin package
DEPENDS - 本包依赖的非catkin package
CFG_EXTRAS - 其它配置参数
比如:
catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp nodelet DEPENDS eigen opencv)
一、使用catkin_create_pkg脚本去创建一个新的安装包”beginner_tutorials”,这个包依赖于 std_msgs, roscpp, and rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
这个将会创建一个 beginner_tutorials文件夹,包含了package.xml and a CMakeLists.txt.
在创建的beginner_tutorials文件夹下可以看到package.xml和CMakeLists.txt。catkin_create_pkg要求您给出包的名字,及选择性的给出所创建的包依赖于哪一个包。他的使用方法如下:
catkin_create_pkg [depend1] [depend2] [depend3]
这样,我们的一个包就创建好了,我们可能会需要对包之间的依赖性做一下解释。我们可以使用rospack命令来查看包之间的依赖关系。查看直接依赖关系:
rospack depends1 beginner_tutorials
可以看到,返回的结果正是我们使用catkin_create_pkg时,所使用的参数。我们还可以直接在beginner_tutorials包下的package.xml中查看包的依赖关系。使用命令:
roscd beginner_tutorials
cat package.xml
二、编译
使用 catkin_make
catkin_make 是一个命令工具用来简化catkin的标准工作流程的,你可以想象一下catkin_make工具可以调用cmake和make来完成编译。
用法:
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]