ROS2 colcon build编译自定义接口包无法生成hpp头文件问题
第一步:修正头文件引用路径
你的msg文件命名是AgvJoy.msg,ROS2的idl代码生成规则会将大驼峰命名的接口名转换为小写下划线分隔的文件名,所以生成的头文件名为agv_joy.hpp,不是你代码里写的agvjoy.hpp。
把joy.h里的引用改成:
#include "agv_interfaces/msg/agv_joy.hpp"
额外说明:自定义接口的生成头文件不会出现在src目录的agv_interfaces源码路径下,编译完成后默认存放在工作空间的install/agv_interfaces/include/agv_interfaces/目录下,只要source过工作空间的setup.bash,其他包就能正常找到这些头文件。
第二步:修正joystick包的配置错误
普通功能包不需要声明为接口包,删掉joystick包的package.xml里这一行冗余配置:
<member_of_group>rosidl_interface_packages</member_of_group>
第三步(可选):显式指定生成C++接口
你看到的文档提到的rosidl_generator_cpp不需要替换默认的rosidl_default_generators,后者本身已经包含了C/C++/Python等语言的生成能力。如果你需要限定只生成C++接口、跳过其他语言生成加快编译速度,可以按下面改agv_interfaces的配置:
修改agv_interfaces的CMakeLists.txt
在依赖查找部分增加rosidl_generator_cpp,同时在接口生成配置里指定编译语言:
find_package(rosidl_generator_cpp REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/AgvJoy.msg" "srv/JoyLimit.srv" GENERATE_COPY_OF_CMAKE_CONFIG TRUE LANGUAGES CXX )
修改agv_interfaces的package.xml
增加对应依赖:
<build_depend>rosidl_generator_cpp</build_depend> <exec_depend>rosidl_runtime_cpp</exec_depend>
注意:这步不是必须操作,使用默认的rosidl_default_generators也可以正常生成hpp头文件
第四步:清理缓存重新全量编译
先删除工作空间下的build、install、log目录,避免之前的错误缓存影响:
rm -rf build install log
先单独编译接口包:
colcon build --packages-select agv_interfaces
然后source当前工作空间的环境变量:
source install/setup.bash
再编译joystick包即可:
colcon build --packages-select joystick
内容的提问来源于stack exchange,提问作者zhoudingjiang

