catkin 简介
CMake基本语法
- 注释:这一点与Python很像都是使用“#”作为注释符
- 变量:在CMake中变量的定义有些特别,一般用set命令作为显式定义和变量的赋值。注意:如果在if语句中使用到变量时可以直接使用变量名,如果不是在if语句中使用的话则需要使用${}来引用变量。
- 调用命令:命令不分大小写,参数使用空格分隔,如果参数中出现空格则需要用双引号包含起来
package.xml
-
- 依赖信息
- 元信息(比如作者、网页)
- package信息(比如版本)
-
每个package.xml文件必须包含的标签包括:
- <package> : 最高级tag,属性:format,用于指定格式
-
- <name> :package名称
- <version> :当前版本
- <description>:package的基本描述
- <maintainer>(至少一个):维护者
- <license>(至少一个):协议
- <buildtool_depend>(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。
-
可选标签包括:
- <package>
-
- <url> (多个):指定package的网址
- <author> (多个):作者
- <build_depend> (多个):编译时需要依赖的其它package,适用于静态库
- <conflict> (多个):声明本package与其它ROS package有冲突,不能同时部署
- <replace> (多个):声明本package是其它package的替换版本
- <export>:用于添加额外的信息,比如需要嵌入的其它package的插件,或者一些说明信息。
-
以及在格式1和格式2有区别的标签:
-
格式1
- <run_depend> (多个):运行时需要依赖的其它package,如动态链接库、可执行文件、Python模块、脚本文件等。
-
格式1
- <test_depend> (多个):进行单元测试时的依赖项,如前两个标签中已出现过,则不必再出现
-
-
格式2
- <build_export_depend>:用于帮助使用本package的其它包传递依赖声明
-
格式2
-
-
- <buildtool_export_depend>:构建工具的依赖传递声明
- <exec_depend>:相当于格式1的run_depend标签。
- <depend>: 相当于build_depend + buildtool_depend + exec_depend,避免重复写三个声明。不建议对系统依赖使用,因为会强行依赖development级package。
- <doc_depend>:构建文档所需要的依赖,当前没什么用,以后可能会有需要
- <test_depend>:进行单元测试时的依赖项,此标签中的package 可以 在其它标签中出现
-
上述是对package.xml的基本说明,对于用户而言,如果通过catkin_create_package命令生成的包,往往已经自动生成了需要的全部标签,只需要在依赖有所变化的情况下更改(格式1):
- <build_depend>
- <run_depend>
或者(格式2):
- <depend>
CMakeList.txt
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 )
-
用于添加自定义的message、service和action文件。基本语法为:
-
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)
-
比如:
-
add_message_files(), add_service_files(), add_action_files()
版权声明:本文为weixin_41995979原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。