Проблемы с привязкой OpenCV к ROS

Я пытаюсь скомпилировать этот проект (следуя приведенным инструкциям). При сборке с rosmake я получаю кучу undefined reference to cv::String::deallocate() и undefined reference to cv::String::allocate(unsigned long). Мне любопытно, что я получаю сообщение об ошибке только в этих функциях, в то время как остальные функции OpenCV работают правильно.

Я знаю, что это происходит потому, что компоновщик не может найти объекты, в которые были скомпилированы эти функции, но я новичок в системе сборки ROS и не могу найти, что не так.

Я пробовал использовать предоставленный файл CMakeLists.txt, а также добавлять find_package(OpenCV REQUIRED) и target_link_libraries(xxx xxx ${OpenCV_LIBRARIES}), но это не имело никакого значения. Я знаю, что OpenCV установлен и скомпилирован правильно (я использовал его раньше), и я без проблем установил ROS.

Я использую OpenCV 3, ROS Indigo, Ubuntu 14.04.


person ButterDog    schedule 06.04.2015    source источник


Ответы (4)


У меня была точно такая же проблема - те же сообщения об ошибках, те же настройки. Мне удалось решить эту проблему, хотя я не совсем уверен в шагах, которые я сделал, которые действительно способствовали. Насколько я могу судить, это произошло из-за конфликта версий OpenCV — я думаю, что у меня были старые версии OpenCV, которые загромождали мои файлы /usr/include и /usr/local. Я удалил все пакеты OpenCV (включая пакеты ROS) и включая мою установку OpenCV3 из исходного кода (также в /usr/local). Затем я установил пакет ROS vision_opencv, который, похоже, установил OpenCV 2.4.8 (кстати, тот, который рекомендовал LSD SLAM). Конечно, это может раздражать, если вам нужен OpenCV3 для других целей, но теперь у меня есть это как локальная установка в моем домашнем каталоге (я не мог понять, как заставить ROS ссылаться на это).

Я думаю, что это решило проблему, единственная оставшаяся проблема заключалась в том, что я получил сообщение об ошибке, в котором говорилось, что не найдено. Это произошло потому, что установка пакета оставляет его внутри (аналогично для всех подключаемых файлов модулей), тогда как шаг установки установки из исходного кода копирует их в родительскую папку. Чтобы обойти это, я просто отредактировал #include в единственном файле, в котором он используется (lsd_slam_core/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp). Это, казалось, решило это!

Я надеюсь, что это поможет, я могу дать более подробную информацию, если это необходимо.

person Osian    schedule 17.04.2015

Я использую OpenCV 3.1.0 (Bleeding Edge), ROS Indigo, Ubuntu 14.04. Я столкнулся с подобной проблемой при попытке скомпилировать LSD-SLAM.

Я добавил:

find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)

Я также добавил библиотеки opencv для целевых библиотек ссылок:

target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)

Вот мой файл CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.12)
project(lsd_slam_core)
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)

# Set the build type.  Options are:
#  Coverage       : w/ debug symbols, w/o optimization, w/ code-coverage
#  Debug          : w/ debug symbols, w/o optimization
#  Release        : w/o debug symbols, w/ optimization
#  RelWithDebInfo : w/ debug symbols, w/ optimization
#  MinSizeRel     : w/o debug symbols, w/ optimization, stripped binaries
set(ROS_BUILD_TYPE Release)

rosbuild_init() 

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_MODULE_PATH   ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

find_package(Eigen3 REQUIRED)
find_package(SuiteParse REQUIRED) # Apparently needed by g2o
find_package(X11 REQUIRED)

# FabMap
# uncomment this part to enable fabmap
#add_subdirectory(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap)
#include_directories(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap/include)
#add_definitions("-DHAVE_FABMAP")
#set(FABMAP_LIB openFABMAP )

# Dynamic Reconfigure Services
rosbuild_find_ros_package(dynamic_reconfigure)
include(${dynamic_reconfigure_PACKAGE_PATH}/cmake/cfgbuild.cmake)
gencfg()

# SSE flags
rosbuild_check_for_sse()
add_definitions("-DUSE_ROS")
add_definitions("-DENABLE_SSE")

# Also add some useful compiler flag
set(CMAKE_CXX_FLAGS
   "${CMAKE_CXX_FLAGS} ${SSE_FLAGS} -march=native  -std=c++0x"
) 

# Set source files
set(lsd_SOURCE_FILES
  ${PROJECT_SOURCE_DIR}/src/DataStructures/Frame.cpp
  ${PROJECT_SOURCE_DIR}/src/DataStructures/FramePoseStruct.cpp
  ${PROJECT_SOURCE_DIR}/src/DataStructures/FrameMemory.cpp
  ${PROJECT_SOURCE_DIR}/src/SlamSystem.cpp
  ${PROJECT_SOURCE_DIR}/src/LiveSLAMWrapper.cpp
  ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMap.cpp
  ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMapPixelHypothesis.cpp
  ${PROJECT_SOURCE_DIR}/src/util/globalFuncs.cpp
  ${PROJECT_SOURCE_DIR}/src/util/SophusUtil.cpp
  ${PROJECT_SOURCE_DIR}/src/util/settings.cpp
  ${PROJECT_SOURCE_DIR}/src/util/Undistorter.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/Sim3Tracker.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/Relocalizer.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/SE3Tracker.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/TrackingReference.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/Timestamp.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/FabMap.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/KeyFrameGraph.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/g2oTypeSim3Sophus.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/TrackableKeyFrameSearch.cpp
)
set(SOURCE_FILES
  ${lsd_SOURCE_FILES}
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSImageStreamThread.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSOutput3DWrapper.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp
)

include_directories(
  ${EIGEN3_INCLUDE_DIR}
  ${PROJECT_SOURCE_DIR}/src
  ${PROJECT_SOURCE_DIR}/thirdparty/Sophus
  ${CSPARSE_INCLUDE_DIR} #Has been set by SuiteParse
  ${CHOLMOD_INCLUDE_DIR} #Has been set by SuiteParse
)

# build shared library.
rosbuild_add_library(lsdslam SHARED ${SOURCE_FILES})
target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
rosbuild_link_boost(lsdslam thread)


# build live ros node
rosbuild_add_executable(live_slam src/main_live_odometry.cpp)
target_link_libraries(live_slam lsdslam)


# build image node
rosbuild_add_executable(dataset_slam src/main_on_images.cpp)
target_link_libraries(dataset_slam lsdslam)
person Yonatan Simson    schedule 03.05.2016

У вас есть мультиверсии Opencv? если у вас есть, возможно, вам следует добавить путь к OpenCVConfig.cmake в CmakeList.txt. Прямо под cmake_minimum_required(VERSION 2.8.12), вот так:

set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build")

Это все.

person Joe wang    schedule 15.10.2016

У меня тоже была такая же проблема. Не могу прокомментировать решение Осиана из-за отсутствия репутации, но это процедура, которую я использовал:

sudo apt-get remove libopencv*

Если вы по какой-то причине установили OpenCV из исходного кода, войдите в каталог сборки и выполните:

sudo make uninstall

Затем, наконец,

sudo apt-get install ros-indigo-desktop-full
person alf    schedule 25.05.2015