ROS:关于功能包下CMakeLists.txt和package.xml的修改

ROS:关于功能包下CMakeLists.txt和package.xml的修改

当我们往ROS包中添加cpp文件时,往往需要修改功能包下的这两个文件。下面讨论一些常见情况下的这两个文件的修改。

Sit1:没有添加任何依赖

cpp文件没有添加任何外部依赖时,或者在创建功能包时就已经添加了相关依赖时,我们仅需要编译创建的cpp文件即可,不需要做其他的操作。CMakeLists.txt修改如下:

# 设置string_publisher.cpp
add_executable(string_publisher src/string_publisher.cpp) # 可执行文件名 cpp文件路径
target_link_libraries(string_publisher ${catkin_LIBRARIES})

# 设置string_subscriber.cpp
add_executable(string_subscriber src/string_subscriber.cpp)
target_link_libraries(string_subscriber ${catkin_LIBRARIES})

Sit2:创建自定义消息或服务

当我们创建自定义消息或服务时,除了需要编译cpp文件外,还需要手动添加相关依赖。

  1. package.xml中添加相关依赖;

    <build_depend>message_generationbuild_depend>
    <exec_depend>message_runtimeexec_depend>
    
  2. 修改CMakeLists.txt文件。

    ...
    find_package(catkin REQUIRED COMPONENTS
      ...
      message_generation
    )
    ...
    ################################################
    ## Declare ROS messages, services and actions ##
    ################################################
    ...
    add_message_files(FILES Person.msg)
    # or
    add_service_files(FILES PersonSrv.srv)
    generate_messages(DEPENDENCIES std_msgs)
    ...
    ###################################
    ## catkin specific configuration ##
    ###################################
    ...
    catkin_package(
    #  INCLUDE_DIRS include
    #  LIBRARIES learning_topic
       CATKIN_DEPENDS ... message_runtime
    #  DEPENDS system_lib
    )
    

修改好后,使用catkin_make进行编译,就会生成自定义消息的头文件。自定义服务的修改内容与自定义消息类似。

生成相关头文件后,就可以开始编译cpp文件,与第一种情况相同,需要修改CMakeLists.txt

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)  # new

Sit3:cpp文件中使用到了未添加的依赖

如我在某个功能包中曾使用了#一系列关于message_filters的头文件,因此需要在这两个文件中添加message_filters的依赖。

package.xml修改如下:

<build_depend>message_filtersbuild_depend>
<build_export_depend>message_filtersbuild_export_depend>
<exec_depend>message_filtersexec_depend>

CMakeLists.txt修改如下:

...
find_package(catkin REQUIRED COMPONENTS
  ...
  message_filters
)
...
###########
## Build ##
###########
include_directories(
  include  # 若功能包的include文件中有需要用到的头文件,则需要添加这个
  ${catkin_INCLUDE_DIRS}
)
...
add_executable(robot_navigation_pub src/robot_navigation_pub.cpp) 
target_link_libraries(robot_navigation_pub ${catkin_LIBRARIES})

你可能感兴趣的:(ROS)