Catkin_make编译指定包

发布时间:2023-05-20

catkin_make编译指定包基础

catkin_make是ROS中常用的编译工具,可以编译整个工作区或仅编译特定的包。在本文中,我们将讨论如何使用catkin_make编译指定包。 对于ROS工作区中的每个包,都需要包含一个CMakeLists.txt文件。该文件包含用于构建和安装ROS软件包所需的信息。

└── src
    ├── package1
    │   ├── CMakeLists.txt
    │   └── src
    └── package2
        ├── CMakeLists.txt
        └── src

例如,在以下示例工作区中,有两个包:hello和world。要编译hello包,需要运行catkin_make命令。

└── workspace
    ├── build
    ├── devel
    └── src
        ├── hello
        │   ├── CMakeLists.txt
        │   └── src
        └── world
            ├── CMakeLists.txt
            └── src

可以通过以下命令进行编译:

cd ~/workspace
catkin_make --only-pkg-with-deps hello

上述命令的含义是:“只编译依赖于hello包的包,即只编译hello包及依赖于它的world包”。 通过--only-pkg-with-deps选项,可以保存时间和资源。

CMakeLists.txt文件中的catkin_package()

CMakeLists.txt文件中的catkin_package()函数提供了一些信息,比如软件包的名称、版本、依赖关系和其他功能。这些信息对于catkin_make编译是非常重要的。 以下是一个典型的CMakeLists.txt文件,其中包括catkin_package()函数:

cmake_minimum_required(VERSION 2.8.3)
project(my_package)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)
catkin_package(
  INCLUDE_DIRS include
  LIBRARIES my_package
  CATKIN_DEPENDS roscpp std_msgs
  DEPENDS system_lib
)

在上面的示例中,catkin_package()函数定义了软件包的依赖关系和包含的头文件、库文件,以及其他细节信息。

发布和订阅消息

使用ROS,常常需要发布和订阅消息。下面是一个简单的示例,其中包含了发布和订阅不同类型的消息的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.3)
project(my_package)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)
generate_messages(
  DEPENDENCIES
  std_msgs
)
catkin_package(
  CATKIN_DEPENDS roscpp std_msgs message_runtime
)
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher
  ${catkin_LIBRARIES}
)
add_dependencies(publisher ${my_package_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_executable(subscriber src/subscriber.cpp)
target_link_libraries(subscriber
  ${catkin_LIBRARIES}
)
add_dependencies(subscriber ${my_package_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

上述示例中的包含publishers和subscribers的CMakeLists.txt文件使用generate_messages()函数和message_runtime依赖项来定义所需的消息类型。 在这个例子中,需要编译publisher和subscriber程序。为了编译这两个程序,需要运行以下命令:

cd ~/my_workspace
catkin_make --pkg my_package

链接外部库

有时,在ROS编程中需要使用外部库。CMakeLists.txt文件应包括链接这些库的信息。 以下是在CMakeLists.txt中使用OpenCV库的示例:

cmake_minimum_required(VERSION 2.8.3)
project(my_package)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)
find_package(OpenCV REQUIRED)
catkin_package(
  CATKIN_DEPENDS roscpp std_msgs
)
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)
add_executable(my_node src/my_node.cpp)
target_link_libraries(my_node
  ${catkin_LIBRARIES}
  ${OpenCV_LIBS}
)
add_dependencies(my_node ${my_package_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

上述示例中的代码使用了find_package()函数,该函数查找和配置所需的库文件。然后,使用target_link_libraries()函数链接这些库。

总结

本文中介绍了如何使用catkin_make编译指定包,包括CMakeLists.txt文件中的catkin_package()函数、发布和订阅不同类型的消息、链接外部库等。希望这篇文章能够对你有所帮助。