Рабочая среда:
- Kubuntu 14.04 LTS, 64-разрядная версия
- ROS Indigo (последняя версия, полная установка на рабочий стол)
- OpenCV 2.4.8
По какой-то неизвестной причине я решил установить пакет ros-indigo-opencv3, о чем почти сразу пожалел из-за того, что у меня также есть версия по умолчанию, которая поставляется с Ubuntu 14.04 - OpenCV 2.4.8.
Сначала я заметил, что QtCreator предупреждал меня о возможной несовместимости между 2.4.8 и 3.0.0, когда я создавал свой проект CMake (вы можете увидеть CMakeLists.txt в конце этого сообщения), используя только
find_package(OpenCV REQUIRED)
Затем начали возникать ошибки из-за какой-то недостающей ссылки в модуле cv :: stereoSGBM. Кажется, есть некоторые изменения в пространствах имен или что-то еще, и библиотека, которую я использую, использует ветвь 2.x OpenCV (очевидно, что трудный путь: D), поэтому я сказал себе - я думаю, я удалю вышеупомянутый пакет ROS для OpenCV 3.0.0 и придерживайтесь версии 2.4.8.
После удаления этого пакета все пошло наперекосяк. Хотя в CMakeLists.txt моего проекта я явно указал версию 2.4.8. быть использованным
find_package(OpenCV 2.4.8 REQUIRED)
при запуске мой узел с roslaunch сразу умер со следующей ошибкой:
... / pmd_nano_node: ошибка при загрузке общих библиотек: libopencv_highgui.so.3.0: невозможно открыть файл общих объектов: нет такого файла или каталога
Ха ... Хорошо ... Я проверил, осталось ли что-нибудь в моей системе (возможно, плохой пакет, который не удалось установить и, соответственно, правильно установить?). К моему удивлению после вызова locate и передачи результата с помощью grep
user:~$ locate libopencv | grep 3.0
я получил
/opt/ros/indigo/lib/libopencv_calib3d.so.3.0
/opt/ros/indigo/lib/libopencv_calib3d.so.3.0.0
/opt/ros/indigo/lib/libopencv_core.so.3.0
/opt/ros/indigo/lib/libopencv_core.so.3.0.0
...
(basically all opencv libs)
Так что там все-таки что-то осталось (я кое-что про все: D). Однако представьте мое удивление, когда я cd -ed к / opt / ros / indigo / lib / и обнаружил НЕ ОДИН файл, даже отдаленно связанный с OpenCV, не говоря уже об OpenCV 3.0. 0.
Использование pkg-config возвращает то, что я ожидал, по крайней мере:
user:~$ pkg-config --cflags opencv
-I/usr/include/opencv
user:~$ pkg-config --libs opencv
/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so ...
-lopencv_calib3d ...
Примечание. Я до сих пор не знаю, почему --cflags никогда не показывает папку include opencv2 (аргумент opencv2 не распознается pkg-config)
Дальнейшее расследование заставило меня повторно запустить файл CMakeLists.txt для моего проекта с версией 3.0.0 в качестве требования, и действительно, теперь CMake жалуется, что обнаружен только 2.4.8. По какой причине приложение пытается получить версию 3.0.0 общих библиотек OpenCV, еще предстоит выяснить.
Любой совет или кто-то, кто сталкивался с такой проблемой раньше?
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(pmd_nano)
SET(CMAKE_CXX_FLAGS "-std=c++0x -fpermissive -Wno-deprecated -Wno-sign-compare")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
SET(CMAKE_CXX_LINK_FLAGS_DEBUG "-pg")
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
pcl_conversions
pcl_msgs
pcl_ros
roscpp
sensor_msgs
std_msgs
)
## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
find_package(PCL REQUIRED)
find_package(OpenCV 2.4.8 REQUIRED COMPONENTS highgui imgproc)
# Do NOT use OpenCV 3.0.0 or all hell will break loose. Package incompatilibity will be a fascinating thing to deal with...
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if you package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
INCLUDE_DIRS include
# LIBRARIES pmd_nano
CATKIN_DEPENDS cv_bridge image_transport pcl_conversions pcl_msgs pcl_ros roscpp sensor_msgs std_msgs uvc_camera
DEPENDS
system_lib # Boost PCL OpenCV
boost_system
PCL
opencv_highgui opencv_imgproc
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
## Declare a cpp library
# add_library(pmd_nano
# src/${PROJECT_NAME}/pmd_nano_node.cpp
# )
## Declare a cpp executable
add_executable(pmd_nano_node
src/pmd_nano_node.cpp
src/ColorCamera.cpp
src/DepthCamera.cpp
src/PMDNano.cpp
)
## Add cmake target dependencies of the executable/library
## as an example, message headers may need to be generated before nodes
# add_dependencies(pmd_nano_node pmd_nano_generate_messages_cpp)
## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
#link_directories(${PROJECT_NAME}_node ${Boost_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME}_node boost_system)
link_directories(${PROJECT_NAME}_node ${PCL_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME}_node opencv_highgui opencv_imgproc)
target_link_libraries(${PROJECT_NAME}_node pthread)
target_link_libraries(pmd_nano_node ${PROJECT_SOURCE_DIR}/lib/libpmdaccess2.so)
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_pmd_nano.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
РЕДАКТИРОВАТЬ:
Запуск sudo updatedb по крайней мере решил проблему найти. Однако ошибка во время выполнения все еще присутствует.