欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【ROS笔记本】CMakeLists.txt与package.xml

时间:2023-04-28
0、前言

在 ROS 中,节点的编写语言通常只有 C++ 和 Python,C++ 需要编译后才能运行,Python 则无需编译。

我们知道 Linux 平台编译 C++ 文件,需要编译器和链接器,其中编译器是将源代码编译成目标代码,链接器是将目标代码链接到可执行文件。若是编译单个文件,用 g++ 即可;若是编译一个 C++ 工程,则需要批处理编译工具,如 make,通过设定规则文件 makefile 调用 g++ 等编译工具进行批量编译。但 makefile 的编写十分复杂,便诞生了 CMake,通过编写简单的 CMakeLists.txt 规则文件,就能自动生成 makefile 文件,并且 CMake 是跨平台的,十分强大。可参考之前的博客:

Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake​

ROS 的编译器便是 CMake,为了更加人性化,ROS 在 CMake 基础上封装了 catkin 命令,用 cmake 命令创建功能包时,会自动生成 CMakeList.txt 文件,已配置了多数编译选项,且包含详细的注释,只需稍作修改便可编译自己的文件。

而 package.xml 文件是描述功能包清单的文件,包括功能包的名称、版本号、作者信息、许可信息、编译依赖和运行依赖等。

我们在用 catkin_create_pkg 命令创建功能包时,是会自动生成 CMakeLists.txt 和 package.xml 文件的。

举例:

# 创建工作空间mkdir -p ~/catkin_ws/srccd ~/catkin_ws/src# 注:std_msgs rospy roscpp 为创建功能时指定的依赖# 也可以先不指定,后面在 CMakeLists.txt 和 package.xml 中手动添加catkin_create_pkg test std_msgs rospy roscpp# 查看一下在 ~/catkin_ws/src 目录下自动生成了哪些文件夹和文件tree

下面看下 CMakeLists.txt 文件和 package.xml 文件各有哪些内容,需要自己改动哪些地方。

1、CMakeLists.txt 文件

常用的编译配置项如下:

(1)include_directories

用于设置头文件的相对路径全局路径默认为功能包所在目录,功能包的头文件一般放在功能包根目录下的 include 文件夹,所以需要此处添加此文件夹还包含 catkin 编译器默认的其他头文件路径,如:ROS 默认安装路径、Linux 系统路径等

(2)add_exectuable

用于设置需要编译的代码和可执行文件第一个参数为期望生成的可执行文件(节点)名称后面的参数为参与编译的源文件(.cpp),若需要多个代码文件,可依次列出,空格分隔

(3)target_link_libraries

用于设置链接库有些功能需要使用系统或第三方库函数,通过该选项可以配置执行文件链接的库文件第一个参数与 add_exectuable 相同,为可执行文件(节点)名称后面的参数为需要链接的库,依次列出,空格分隔

(4)add_dependencies

用于设置依赖有时候需要自定义消息类型,消息类型会在编译过程中产生相应语言的代码。若编译的可执行文件依赖这些动态生成的代码,则需要添加 ${PROJECT_NAME}_generate_messages_cpp 配置

(5)自定义数据类型:消息 msg、服务 srv、动作 action

find_package(catkin REQUIRE COMPonENTS message_generation)catkin_package(CATKIN_DEPENDS message_runtime)add_message_files(FILES xxx.msg)add_service_files(FILES xxx.srv)add_action_files(FILES xxx.action)generate_messages(DEPENDENCIES std_msgs)

模板:

cmake_minimum_required(VERSION 2.8.3)project(test)## Compile as C++11, supported in ROS Kinetic and newer# add_compile_options(-std=c++11)## Find catkin macros and libraries## if COMPonENTS list like find_package(catkin REQUIRED COMPonENTS xyz)## is used, also find other catkin packagesfind_package(catkin REQUIRED COMPonENTS roscpp rospy std_msgs)## System dependencies are found with CMake's conventions# find_package(Boost REQUIRED COMPonENTS system)## Uncomment this if the package has a setup.py、This macro ensures## modules and global scripts declared therein get installed## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html# catkin_python_setup()################################################## Declare ROS messages, services and actions #################################################### To declare and build messages, services or actions from within this## package, follow these steps:## * Let MSG_DEP_SET be the set of packages whose message types you use in## your messages/services/actions (e.g、std_msgs, actionlib_msgs, ...).## * In the file package.xml:## * add a build_depend tag for "message_generation"## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET## * If MSG_DEP_SET isn't empty the following dependency has been pulled in## but can be declared for certainty nonetheless:## * add a exec_depend tag for "message_runtime"## * In this file (CMakeLists.txt):## * add "message_generation" and every package in MSG_DEP_SET to## find_package(catkin REQUIRED COMPonENTS ...)## * add "message_runtime" and every package in MSG_DEP_SET to## catkin_package(CATKIN_DEPENDS ...)## * uncomment the add_*_files sections below as needed## and list every .msg/.srv/.action file to be processed## * uncomment the generate_messages entry below## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)## Generate messages in the 'msg' folder# add_message_files(# FILES# Message1.msg# Message2.msg# )## Generate services in the 'srv' folder# add_service_files(# FILES# Service1.srv# Service2.srv# )## Generate actions in the 'action' folder# add_action_files(# FILES# Action1.action# Action2.action# )## Generate added messages and services with any dependencies listed here# generate_messages(# DEPENDENCIES# std_msgs# )################################################## Declare ROS dynamic reconfigure parameters #################################################### To declare and build dynamic reconfigure parameters within this## package, follow these steps:## * In the file package.xml:## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"## * In this file (CMakeLists.txt):## * add "dynamic_reconfigure" to## find_package(catkin REQUIRED COMPonENTS ...)## * uncomment the "generate_dynamic_reconfigure_options" section below## and list every .cfg file to be processed## Generate dynamic reconfigure parameters in the 'cfg' folder# generate_dynamic_reconfigure_options(# cfg/DynReconf1.cfg# cfg/DynReconf2.cfg# )##################################### catkin specific configuration ####################################### The catkin_package macro generates cmake config files for your package## Declare things to be passed to dependent projects## INCLUDE_DIRS: uncomment this if your package contains header files## LIBRARIES: libraries you create in this project that dependent projects also need## CATKIN_DEPENDS: catkin_packages dependent projects also need## DEPENDS: system dependencies of this project that dependent projects also needcatkin_package(# INCLUDE_DIRS include# LIBRARIES test# CATKIN_DEPENDS roscpp rospy std_msgs# DEPENDS system_lib)############# Build ############### Specify additional locations of header files## Your package locations should be listed before other locationsinclude_directories(include ${catkin_INCLUDE_DIRS})## Declare a C++ library# add_library(${PROJECT_NAME}# src/${PROJECT_NAME}/test.cpp# )## Add cmake target dependencies of the library## as an example, code may need to be generated before libraries## either from message generation or dynamic reconfigureadd_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Declare a C++ executable## With catkin_make all packages are built within a single CMake context## The recommended prefix ensures that target names across packages don't collideadd_executable(${PROJECT_NAME}_node src/test_node.cpp)## Rename C++ executable without prefix## The above recommended prefix causes long target names, the following renames the## target back to the shorter version for ease of user use## e.g、"rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")## Add cmake target dependencies of the executable## same as for the library aboveadd_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target againsttarget_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})############### Install ################ all install targets should use catkin DESTINATION variables# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html## Mark executable scripts (Python etc.) for installation## in contrast to setup.py, you can choose the destination# install(PROGRAMS# scripts/my_python_script# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}# )## Mark executables for installation## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html# install(TARGETS ${PROJECT_NAME}_node# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}# )## Mark libraries for installation## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html# install(TARGETS ${PROJECT_NAME}# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}# )## Mark cpp header files for installation# install(DIRECTORY include/${PROJECT_NAME}/# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}# FILES_MATCHING PATTERN "*.h"# PATTERN ".svn" EXCLUDE# )## Mark other files for installation (e.g、launch and bag files, etc.)# install(FILES# # myfile1# # myfile2# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}# )############### Testing ################# Add gtest based cpp test target and link libraries# catkin_add_gtest(${PROJECT_NAME}-test test/test_test.cpp)# if(TARGET ${PROJECT_NAME}-test)# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})# endif()## Add folders to be run by python nosetests# catkin_add_nosetests(test)

2、package.xml 文件

标签定义了功能包中代码编译时所依赖的其他功能包 标签定义了功能包中可执行程序运行时所依赖的其他功能包自定义数据类型:话题消息 msg、服务数据 srv,需添加

message_generationmessage_runtime

模板:

<?xml version="1.0"?> test 0.0.0 The test package lab212 TODO catkin roscpp rospy std_msgs roscpp rospy std_msgs roscpp rospy std_msgs

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。