如何将自定义ROS包作为依赖添加到另一个ROS包中?
问题解决:将自定义ROS包作为依赖添加到主包中
首先明确核心误区:Catkin中每个带package.xml的目录都是独立ROS包,不能直接用add_subdirectory把完整ROS包嵌入另一个ROS包的CMakeLists.txt——这会跳过Catkin的包管理逻辑,导致依赖检查报错。以下针对你的需求给出两种可行方案:
方案一:保留action1/action2为独立ROS包(推荐)
这种方式符合ROS包的设计规范,便于后续单独复用动作包:
- 按你期望的目录结构放置文件后,确保
catkin_ws/src下存在顶层CMakeLists.txt(可通过catkin_init_workspace生成),它会自动扫描所有子目录中的ROS包。 - 在
main_file的package.xml中添加对动作包的依赖:<!-- 构建阶段依赖 --> <build_depend>action1</build_depend> <build_depend>action2</build_depend> <!-- 运行阶段依赖 --> <exec_depend>action1</exec_depend> <exec_depend>action2</exec_depend> <!-- 确保已存在buildtool依赖 --> <buildtool_depend>catkin</buildtool_depend> - 在
main_file的CMakeLists.txt中,将动作包加入find_package:find_package(catkin REQUIRED COMPONENTS roscpp actionlib action1 action2 # 其他你的依赖 ) - 直接用
catkin build或catkin_make构建整个工作空间,Catkin会自动处理包的构建顺序(先编译action1/action2,再编译main_file)。
方案二:将动作包改为main_file的子模块
如果不需要动作包独立存在,可将其合并为主包的一部分:
- 删除action1和action2各自的
package.xml,把它们的代码逻辑整合到main_file中。 - 在
main_file的CMakeLists.txt中添加子目录引用:add_subdirectory(actions/action1) add_subdirectory(actions/action2) - 将原动作包的编译规则(如
add_executable、add_library)保留在各自子目录的CMakeLists中,或直接合并到main_file的CMakeLists里。 - 将原动作包的所有依赖(如
actionlib、roscpp等)添加到main_file的package.xml中。
你之前报错的原因
直接用add_subdirectory引入带package.xml的ROS包时,Catkin会将其视为普通CMake项目,而非ROS包,因此会跳过Catkin的包依赖校验逻辑,导致出现"需将catkin列为buildtool依赖"的错误——即便你已经配置了该依赖。
内容的提问来源于stack exchange,提问作者SohaibAJ
相关产品推荐
相关产品推荐

