You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义ROS包作为依赖添加到另一个ROS包中?

问题解决:将自定义ROS包作为依赖添加到主包中

首先明确核心误区:Catkin中每个带package.xml的目录都是独立ROS包,不能直接用add_subdirectory把完整ROS包嵌入另一个ROS包的CMakeLists.txt——这会跳过Catkin的包管理逻辑,导致依赖检查报错。以下针对你的需求给出两种可行方案:

方案一:保留action1/action2为独立ROS包(推荐)

这种方式符合ROS包的设计规范,便于后续单独复用动作包:

  1. 按你期望的目录结构放置文件后,确保catkin_ws/src下存在顶层CMakeLists.txt(可通过catkin_init_workspace生成),它会自动扫描所有子目录中的ROS包。
  2. 在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>
    
  3. 在main_file的CMakeLists.txt中,将动作包加入find_package:
    find_package(catkin REQUIRED COMPONENTS
      roscpp
      actionlib
      action1
      action2
      # 其他你的依赖
    )
    
  4. 直接用catkin build或catkin_make构建整个工作空间,Catkin会自动处理包的构建顺序(先编译action1/action2,再编译main_file)。

方案二:将动作包改为main_file的子模块

如果不需要动作包独立存在,可将其合并为主包的一部分:

  1. 删除action1和action2各自的package.xml,把它们的代码逻辑整合到main_file中。
  2. 在main_file的CMakeLists.txt中添加子目录引用:
    add_subdirectory(actions/action1)
    add_subdirectory(actions/action2)
    
  3. 将原动作包的编译规则(如add_executable、add_library)保留在各自子目录的CMakeLists中,或直接合并到main_file的CMakeLists里。
  4. 将原动作包的所有依赖(如actionlib、roscpp等)添加到main_file的package.xml中。

你之前报错的原因

直接用add_subdirectory引入带package.xml的ROS包时,Catkin会将其视为普通CMake项目,而非ROS包,因此会跳过Catkin的包依赖校验逻辑,导致出现"需将catkin列为buildtool依赖"的错误——即便你已经配置了该依赖。

内容的提问来源于stack exchange,提问作者SohaibAJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:46:13