如何在ROS中引入Aruco库并解决catkin_make编译错误
ROS Aruco依赖包编译错误修复方案
问题背景
手动编译安装Aruco库(cmake/make/sudo make install均无报错),但ROS工作空间执行catkin_make时出现编译错误,推测原因是Aruco库的头文件与cpp文件同存于src目录,导致CMake无法正确识别头文件路径。当前使用的CMakeLists.txt代码如下:
cmake_minimum_required(VERSION 2.8.3) project(aruco_mapping) find_package(OpenCV REQUIRED) find_package(aruco REQUIRED) find_package(catkin REQUIRED COMPONENTS roscpp message_generation image_transport cv_bridge tf aruco visualization_msgs camera_calibration_parsers) include_directories(${catkin_INCLUDE_DIRS} } ${PROJECT_SOURCE_DIR}/include/) include_directories(${PROJECT_SOURCE_DIR}/src/) SET(SOURCES ${PROJECT_SOURCE_DIR}/src/main.cpp ${PROJECT_SOURCE_DIR}/src/aruco_mapping.cpp) SET(HEADERS ${PROJECT_SOURCE_DIR}/include/aruco_mapping.h) add_message_files(FILES ArucoMarker.msg) generate_messages(DEPENDENCIES std_msgs geometry_msgs) catkin_package( INCLUDE_DIRS include LIBRARIES ) add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS} aruco_mapping_gencpp ) target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${aruco_LIBS} ${ROS_LIBRARIES} ${catkin_LIBRARIES})
修复步骤
1. 修正语法错误
原代码中include_directories行多了一个冗余的闭合大括号,直接导致CMake解析失败,修正后:
include_directories(${catkin_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include/)
2. 添加Aruco头文件路径
由于手动安装的Aruco库头文件存放在src目录,需将该路径添加到include_directories中:
- 若已知Aruco库的src路径(比如
/usr/local/src/aruco),直接添加:include_directories(/path/to/your/aruco/src) - 若不确定路径,用
find_path自动查找:find_path(ARUCO_INCLUDE_DIR aruco.h PATHS /usr/local/src/aruco /usr/src/aruco) include_directories(${ARUCO_INCLUDE_DIR})
3. 移除catkin依赖中的冗余项
原代码在catkin REQUIRED COMPONENTS中重复添加了aruco,但手动安装的Aruco并非ROS组件,catkin无法识别,需删除该条目:
find_package(catkin REQUIRED COMPONENTS roscpp message_generation image_transport cv_bridge tf visualization_msgs camera_calibration_parsers)
4. 优化catkin_package配置
在catkin_package中明确声明依赖的头文件、库和外部依赖,确保其他包能正确引用:
catkin_package( INCLUDE_DIRS include ${ARUCO_INCLUDE_DIR} LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp message_generation image_transport cv_bridge tf visualization_msgs camera_calibration_parsers DEPENDS OpenCV aruco )
5. 简化源文件路径引用
用相对路径替代绝对路径,提升配置文件可读性:
SET(SOURCES src/main.cpp src/aruco_mapping.cpp) SET(HEADERS include/aruco_mapping.h)
6. 清理冗余链接库
${ROS_LIBRARIES}已包含在${catkin_LIBRARIES}中,删除重复项:
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${aruco_LIBS} ${catkin_LIBRARIES})
修改后的完整CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3) project(aruco_mapping) find_package(OpenCV REQUIRED) find_package(aruco REQUIRED) # 自动查找Aruco头文件路径 find_path(ARUCO_INCLUDE_DIR aruco.h PATHS /usr/local/src/aruco /usr/src/aruco) find_package(catkin REQUIRED COMPONENTS roscpp message_generation image_transport cv_bridge tf visualization_msgs camera_calibration_parsers) include_directories(${catkin_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include/ ${ARUCO_INCLUDE_DIR}) SET(SOURCES src/main.cpp src/aruco_mapping.cpp) SET(HEADERS include/aruco_mapping.h) add_message_files(FILES ArucoMarker.msg) generate_messages(DEPENDENCIES std_msgs geometry_msgs) catkin_package( INCLUDE_DIRS include ${ARUCO_INCLUDE_DIR} LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp message_generation image_transport cv_bridge tf visualization_msgs camera_calibration_parsers DEPENDS OpenCV aruco ) add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS} aruco_mapping_gencpp ) target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${aruco_LIBS} ${catkin_LIBRARIES})
内容的提问来源于stack exchange,提问作者George Parlitsis
相关产品推荐
相关产品推荐

