解决ROS含动态参数的Config文件无法正确识别的错误

问题描述

功能包名为paddle_detection

在工作空间下, 通过catkin_make可以正常通过编译且执行无异常,

可以通过bloom-generate rosdebian生成依赖

但是在将其打包成deb包的过程中fakeroot debian/rules binary报错

shell 复制代码
fatal error: paddle_detection/paddle_detectionConfig.h: No such file or directory
   44 | #include <paddle_detection/paddle_detectionConfig.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决思路

之前用过一个局部路径规划包, teb_local_planner, 里面包含了动态参数配置, 而且可以成功编译打包, 因此把他的代码拉了下来去分析他的CMakelists.txt, 最终找到了一些区别, 添加后解决

原因

catkin_make的过程中, 程序会自动根据ros的规则去配置与生成头文件, 即只要在CMakelists.txt中添加了

cmake 复制代码
generate_dynamic_reconfigure_options(
  config/paddle_detection.cfg
  #...
)

就会自动生成 paddle_detectionConfig.h的头文件, 并被其他文件引用

但是在fakeroot debian/rules binary的过程中, 这一步还没有完成时就会同步开启其他文件的编译, 因此会导致无法找到paddle_detection/paddle_detectionConfig.h这个头文件的错误

解决

在添加完上面的语句后, 再添加一句

add_dependencies(paddle_detection ${PROJECT_NAME}_gencfg)

这就指定了 paddle_detection 这个可执行文件的构建依赖于 ${PROJECT_NAME}_gencfg 目标的完成。这里的 ${PROJECT_NAME}_gencfg 是一个由 generate_dynamic_reconfigure_options 自动生成的目标,它负责处理 dynamic_reconfigure 的配置文件(在这个例子中是 paddle_detection.cfg)。

这种依赖关系的具体含义是:

  • 当你运行 make 命令来构建你的项目时,CMake 会首先确保 ${PROJECT_NAME}_gencfg 目标已经完成。这意味着所有与动态配置相关的自动生成的代码都会在尝试构建 paddle_detection 之前完成。
  • 这样做的目的是确保在编译 paddle_detection 时,所有由 dynamic_reconfigure 生成的头文件都已经存在并可用。这些头文件通常包含了必要的配置类和方法,它们由 paddle_detection.cfg 定义的参数生成。

总结

在进行动态参数的生成与配置时, 至少在CMakelist中包含两项内容

cmake 复制代码
generate_dynamic_reconfigure_options(
  config/paddle_detection.cfg
  #...
)
add_dependencies(paddle_detection ${PROJECT_NAME}_gencfg)

补充一点

在生成消息类型时也会遇到这样的问题, ROS会自动把msg, srv等自动转换成.h文件, 但是在进行单独打包时需要注意, 在添加可执行文件时应该完成对这些消息类型的依赖, 否则会报类似的错误

cmake 复制代码
add_executable(getRT src/tool/getRT.cpp 
)
add_dependencies(getRT ${PROJECT_NAME}_generate_messages_cpp) #这一句就是为了保证消息类型先编译
target_link_libraries(getRT ${catkin_LIBRARIES} )
target_include_directories(getRT PRIVATE ${PYTHON_INCLUDE_DIRS})
相关推荐
FII工业富联科技服务5 小时前
Omniverse + Isaac Teleop + 合成数据:工业富联机器人大脑训练+执行落地闭环拆解
大数据·人工智能·深度学习·机器学习·机器人·制造·具身智能
点心的游戏开发世界5 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
RuoZoe6 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
YFJ_mily7 小时前
985中山大学主办|往届3个月EI检索|ACIRA2026先进计算与智能机器人会议 10.31截稿
机器人·rdlink研发家·广州会议·先进计算·智能机器人应用·985高校背书·往届会议历史
事圆则缓7 小时前
Kotlin 协程完全指南
开发语言·kotlin
鱼子星_7 小时前
【C++】继承和多态(上)
c++·笔记
我爱写代码i8 小时前
BeLink - 支持生成多种URL 缩短网址PHP源码
开发语言·php·短网址php源码
Java后端的Ai之路8 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
统计学小王子9 小时前
数学建模国赛倒计时4天——《统计模型精讲(混合效应模型R语言实现)》
开发语言·数学建模·r语言
知无不研9 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while