为了了解catkin_make编译的原理,以及动手写编译节点功能包,特地把CMakeLists.txt文件翻译一下:
cmake_minimum_required(VERSION 2.8.3) project(my_pkg) ##找到catkin编译的宏命令和库文件,如果像find_package(catkin REQUIRED COMPONENTS xyz)一样的清单被使用的话,也能找到其他catkin编译的功能包 find_package(catkin REQUIRED COMPONENTS message_generation rospy ) ## 系统依赖项也能随着CMake的规定被找到 # find_package(Boost REQUIRED COMPONENTS system) ## 如果功能包里有一个setup.py,取消这些注释。这个宏可以确保模块和全局脚本声明在其中得到安装 ##参考http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html # catkin_python_setup() ################################################ ##声明 ROS 的 messages, services 和 actions## #service 是同步的通信机制,a 和 b 间通过 sevice 机制通信,假设 a 是客户端访问 b 服务器端,a 远 #程调用 b 上的某个函数,a 程序得等 b 服务器响应后才能作其他的事情(运行其他程序),如果 b 服务器长 #期无响应,那么 a 啥也别做了,一直等下去吧,无法取消。显然效率低下,原因在于 service 时同步通信 #机制。 #ros 提供了另外一种通信机制 action,可以在远程调用服务器上某程序后,转而执行其他的程序,周期性的获得服务器上的信息,或者取消发送到服务器上的某远程调用,机制灵活,异步通信。 ################################################ ## 想要在功能包中声明和建立习messages, services和actions,就遵循以下步骤: #(1)用MSG_DEP_SET对功能包进行相应设置,且功能包的消息类型就是你的messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). #(2)*在package.xml文件中:给"message_generation"增加一个build_depend标签,在MSG_DEP_SET里给功能包增加一个build_depend和一个run_depend标签; #如果MSG_DEP_SET不是空的,接下来的依赖就已经被设置了,但是仍然可以做确定性说明:给"message_runtime"增加一个run_depend标签。 #(3)在CMakeLists.txt文件中:增加"message_generation",而且在每一个功能包里,要对find_package(catkin REQUIRED COMPONENTS ...)进行MSG_DEP_SET设置; #增加"message_runtime",而且在每一个功能包里,要对catkin_package(CATKIN_DEPENDS ...)进行MSG_DEP_SET设置。 #(4)以下add_*_files部分,和下列.msg/.srv/.action文件,每一个都根据需要可以取消注释: #在generate_messages的入口取消注释; #在MSG_DEP_SET的功能包增加generate_messages(DEPENDENCIES ...)。 ##在'msg'路径收集messages # add_message_files( # FILES # Message1.msg # Message2.msg# ) ##在'srv'路径收集service # add_service_files( # FILES # Service1.srv # Service2.srv # ) ##在'action'路径收集action # add_action_files( # FILES # Action1.action # Action2.action # ) ##在这里列出的依赖项下,收集增加的messages和services # generate_messages( # DEPENDENCIES # std_msgs #或者其他功能包包含的msgs # ) ################################################ ##声明ROS动态配置参数## ################################################ ##要在这个功能包里声明和建立动态配置参数,遵循下列步骤: #(1)在package.xml文件中:给"dynamic_reconfigure"增加一个build_depend和一个run_depend标签。 #(2)在CMakeLists.txt文件中:在下面的find_package(catkin REQUIRED COMPONENTS ...)里增加"dynamic_reconfigure"。 #(3)取消下面"generate_dynamic_reconfigure_options"部分的注释,而且下面每一个.cfg文件都会被处理。 ##在'cfg'路径收集动态配置参数 # generate_dynamic_reconfigure_options( # cfg/DynReconf1.cfg # cfg/DynReconf2.cfg # ) ################################### ## catkin特殊配置## ################################### ## catkin_package宏为你的功能包生成cmake配置文件,声明的参数要给依赖工程文件 ## INCLUDE_DIRS:如果你的功能包有头文件,就取消它的注释 ## LIBRARIES: 在这个项目中生成库,还需要依赖项目 ## CATKIN_DEPENDS: catkin_packages依赖工程也需要 ## DEPENDS: 系统依赖关系的这个项目也需要依赖项目 catkin_package( # INCLUDE_DIRS include # LIBRARIES my_pkg# CATKIN_DEPENDS message_generation rospy # DEPENDS system_lib ) ########### ##编译## ########### ##指定额外的头文件的位置,你的包的位置应该是其他地方之前列出 # include_directories(include) include_directories( ${catkin_INCLUDE_DIRS} ) ##声明一个C++库 # add_library(my_pkg # src/${PROJECT_NAME}/my_pkg.cpp # ) ##给库增加cmake目标依赖,作为一个例子,在库之前生成代码或者从message生成,动态配置中生成 # add_dependencies(my_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ##声明一个C++可执行 # add_executable(my_pkg_node src/my_pkg_node.cpp) ##给可执行增加cmake目标依赖,对上述提到的库也是一样的操作 # add_dependencies(my_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ##指定链接库库或可执行的目标 # target_link_libraries(my_pkg_node # ${catkin_LIBRARIES} # ) ############# ##安装## ############# #所有安装目标有应该使用catkin DESTINATION变量 #参考http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html ##为安装标记可执行脚本Python etc.对比于setup.py,你要选择下面的 # install(PROGRAMS # scripts/my_python_script # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} # ) ##为安装标记可执行文件和/或库文件 # install(TARGETS my_pkg my_pkg_node # ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} # LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} # RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} # ) ##为安装标记cpp头文件 # install(DIRECTORY include/${PROJECT_NAME}/ # DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}# FILES_MATCHING PATTERN "*.h" # PATTERN ".svn" EXCLUDE # ) ##为安装标记其他文件(e.g. launch and bag files, etc.) # install(FILES # # myfile1 # # myfile2 # DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} # ) ############# ##测试## ############# ##给cpp测试目标和链接库增加gtest # catkin_add_gtest(${PROJECT_NAME}-test test/test_my_pkg.cpp) # if(TARGET ${PROJECT_NAME}-test) # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) # endif() ##在Python节点测试上增加文件 # catkin_add_nosetests(test)