您的位置:

Catkin_make编译指定包

一、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()函数、发布和订阅不同类型的消息、链接外部库等。希望这篇文章能够对你有所帮助。