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