更新于2024.1.8
1. 概要
本文档首次提供了OpenREALM在ubuntu20.04部署成功的方案,在此之前该开源框架只能在ubuntu16.04/18.04上部署。在20.04上部署主要需要解决cv_bridge和openrelam依赖不同opecv版本的问题,应对依赖库等作一系列调整,详见3.5。
2. 参考链接
2.1 原项目链接:
2.2 环境配置参考
3. 配置流程
按以下顺序部署:CMake3.18,OpenCV3.3.1,OpenVSLAM,OpenREALM,OpenREALM_ROS1_Bridge。这些部署2.2.2链接能提供绝大多数解决方案,而涉及到与ubuntu20.04的兼容性问题出要:ros1的cv_bridge依赖于opecv4,而openrealm依赖于opencv3.3,caktin_make的最后可能会出现版本冲突问题,解决方案见3.5
如果安装了conda,建议在整个安装流程中都deactivate。此外,需要的依赖包都要安装,否则后续会出现难以定位源头的问题。
3.1 CMake 3.18
按照链接2.2.1中CMake的安装顺序。如下:
sudo apt install build-essential libssl-dev
wget https://github.com/Kitware/CMake/releases/download/v3.18.4/cmake-3.18.4.tar.gz
tar -zxvf cmake-3.18.4.tar.gz
cd cmake-3.18.4
./bootstrap
make
sudo make install
3.2 OpenCV 3.3.1
步骤一:安装cuda和依赖环境
按照链接2.2.2,如下:
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libjasper
sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
可能存在的问题:Error:Unable to locate package libjasper-dev,解决方案如下:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
安装libpng12-dev可能存在问题,通过以下方法解决:
sudo add-apt-repository ppa:linuxuprising/libpng12
sudo apt update
sudo apt install libpng12-0
sudo apt install libpng12-dev
步骤二:安装opencv3.3.1
按照链接2.2.2。cmake和make之前,需要完成gcc 与g++7版本的安装以及文中“安装前必要的准备工作”。详见原文。
3.3 OpenVSLAM
步骤一:安装依赖库
按照链接2.2.2
步骤二:安装Pangolin-0.5
按照链接2.2.2,其他安装命令参考开源SLAM框架学习——OpenVSLAM源码解析: 第一节 安装和初探 | 码农家园,git checkout不能少。
步骤三:安装gcc 6与g++6
按照链接2.2.2
步骤四:安装OpenVSLAM
按照链接2.2.2
注意链接中提到
首先打开\openvslam\.git\config,将 https://github.com/OpenVSLAM-Community/FBoW.git 修改为:https://github.com/stella-cv/FBoW.git
这里的https://github.com/OpenVSLAM-Community/FBoW.git需要在命令git submodule init后才会在config中出现。
3.4 OpenREALM
按照链接2.2.2
3.5 OpenREALM_ROS1_Bridge
请注意不要直接按照2.2.2的方式部署ros1_bridge,否则在解决cmake error后,make进度到95%左右会出现一系列libopencv相关问题,这是由于:通过sudo apt-get install安装的适用于ubuntu20的cv_bridge依赖于cv4,和openrealm依赖的opencv版本不一致。具体部署按如下步骤进行。
步骤一:安装ros1
步骤二:安装其他依赖
sudo apt install -y -q python3-catkin-tools build-essential git wget # 区别于2.2.2中python-catkin-tools,我们安装的是python3-catkin-tools
sudo apt install -y -q ros-$ROS_DISTRO-geographic-msgs
sudo apt install -y -q ros-$ROS_DISTRO-geodesy
sudo apt install -y -q ros-$ROS_DISTRO-cv-bridge
sudo apt install -y -q ros-$ROS_DISTRO-rviz
sudo apt install -y -q ros-$ROS_DISTRO-pcl-ros
步骤三:在OpenREALM文件夹中生成ROS工作空间
mkdir catkin_ws && cd catkin_ws
mkdir src && cd src
步骤四:部署适用于opencv3.3.1的cv_bridge
注意1,原cv_bridge不用卸载 ,更改后的cv_bridge的CMakeList.txt如下:
package.xml中pakagename也需要改称cv_bridge_cv331
cmake_minimum_required(VERSION 3.0.2)
project(cv_bridge_cv331) #名在得改
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python37)
else()
# Ubuntu Focal
find_package(Boost REQUIRED python)
endif()
else()
find_package(Boost REQUIRED)
endif()
# set(_opencv_version 4)
# find_package(OpenCV 4 QUIET)
# if(NOT OpenCV_FOUND)
# message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
# set(_opencv_version 3)
# endif()
# set(_opencv_version 3)
find_package(OpenCV 3.3.1 REQUIRED
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS rosconsole sensor_msgs
DEPENDS OpenCV
CFG_EXTRAS cv_bridge-extras.cmake
)
catkin_python_setup()
include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
add_subdirectory(test)
endif()
# install the include folder
install(
DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)
步骤四:部署OpenREALM_ROS1_Bridge
git clone到catktin_ws/src
在OpenREALM/catkin_ws/src/OpenREALM_ROS1_Bridge/realm_ros/CMakeLists.txt的find_package中加入cv_bridge_cv331
在/home/zeeco/OpenREALM/catkin_ws/src/OpenREALM_ROS1_Bridge/realm_rviz_plugin/CMakeLists.txt的find_package中加入cv_bridge_cv331。
根据2.2.2的方法更改OpenREALM\catkin_ws\src\OpenREALM_ROS1_Bridge\realm_ros\CMakeList.txt
在catkin_ws文件夹下运行catkin_make -DCMAKE_BUILD_TYPE=Release
解决以下错误:
错误:undefined reference to symbol 'pthread_getspecific@@GLIBC_2.2.5'
解决办法:在OpenREALM/catkin_ws/src/OpenREALM_ROS1_Bridge/realm_ros/CMakeLists.txt中加入link_directories(/usr/lib/x86_64-linux-gnu) ,在target_link_libraries中加入libpthread.so,参考自(已解决)undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'-CSDN博客文章浏览阅读1.6w次,点赞15次,收藏45次。undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command linecollect2: error: ld returned 1 exit status解决方..._undefined reference to symbol 'pthread_create@@glibc_2.2.5https://blog.csdn.net/weixin_45617478/article/details/103447175https://blog.csdn.net/weixin_45617478/article/details/103447175
完整的OpenREALM/catkin_ws/src/OpenREALM_ROS1_Bridge/realm_ros/CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.15)
project(realm_ros)
################################################################################
# Include CMake dependencies
################################################################################
include(CheckLanguage)
################################################################################
# Compiler specific configuration
################################################################################
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
enable_language(CUDA)
message(STATUS "CUDA Support enabled.")
include(FindCUDA)
set(CUDA_ARCH_LIST Auto CACHE STRING "List of CUDA architectures (e.g. Pascal, Volta, etc) or \
compute capability versions (6.1, 7.0, etc) to generate code for. \
Set to Auto for automatic detection (default).")
cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS ${CUDA_ARCH_LIST})
list(APPEND CUDA_NVCC_FLAGS ${CUDA_ARCH_FLAGS})
else()
message(STATUS "CUDA Support disabled.")
endif()
################################################################################
# Dependencies
################################################################################
find_package(catkin REQUIRED COMPONENTS
roscpp
roslib
pcl_ros
geodesy
cv_bridge_cv331 #更改默认的cv_bridge版本
tf
std_msgs
nav_msgs
sensor_msgs
geographic_msgs
realm_msgs
)
find_package(Boost COMPONENTS thread filesystem date_time system REQUIRED) #2.2.2增加的
# Fix to avoid OpenCV package confusion with ROS melodic
find_package(OpenCV 3.3.1 EXACT QUIET)
if (NOT OpenCV_FOUND)
find_package(OpenCV 3 QUIET)
endif()
if (NOT OpenCV_FOUND)
find_package(OpenCV 4 REQUIRED)
message(WARNING "OpenCV 4 Support is experimental, use at your own risk!")
endif()
#find_package(Pangolin REQUIRED)
find_package(cmake_modules REQUIRED)
find_package(OpenREALM REQUIRED)
find_package(openvslam REQUIRED)
find_package(OpenMP REQUIRED)
#find_package(ORB_SLAM2 REQUIRED)
#find_package(ORB_SLAM3 REQUIRED)
#find_package(ov2slam REQUIRED)
find_package(fbow REQUIRED)#2.2.2增加的
find_package(CGAL REQUIRED)#2.2.2增加的
find_package(VTK REQUIRED)
find_package(Eigen3 3.3 REQUIRED NO_MODULE)
################################################################################
# Catkin Package
################################################################################
catkin_package(
INCLUDE_DIRS
include
LIBRARIES
${PROJECT_NAME}
CATKIN_DEPENDS
roscpp
roslib
pcl_ros
geodesy
cv_bridge
tf
std_msgs
nav_msgs
sensor_msgs
geographic_msgs
realm_msgs
cmake_modules
DEPENDS
OpenCV
)
################################################################################
# Build
################################################################################
set(CMAKE_MODULE_PATH "/usr/lib/x86_64-linux-gnu/cmake")#2.2.2增加的
add_library(FLANN::FLANN INTERFACE IMPORTED)#2.2.2增加的
add_library(${PROJECT_NAME} SHARED
src/realm_ros_lib/grabber_ros_node.cpp
src/realm_ros_lib/grabber_exiv2_node.cpp
src/realm_ros_lib/stage_node.cpp
src/realm_ros_lib/conversions.cpp
)
target_include_directories(${PROJECT_NAME} PUBLIC
include
${catkin_INCLUDE_DIRS}
)
link_directories(/usr/lib/x86_64-linux-gnu) # 解决pthread错误
target_link_libraries(${PROJECT_NAME} PUBLIC
${catkin_LIBRARIES}
${cmake_modules_LIBRARIES}
${OpenCV_LIBRARIES}
${Boost_FILESYSTEM_LIBRARIES}
${Boost_SYSTEM_LIBRARIES}
realm_stages
libpthread.so # 解决pthread错误
)
add_dependencies(${PROJECT_NAME}
realm_msgs_generate_messages_cpp
)
################################################################################
# Executables
################################################################################
add_executable(realm_ros_grabber src/grabber_ros_node_main.cpp)
add_dependencies(realm_ros_grabber ${catkin_EXPORTED_TARGETS})
target_link_libraries(realm_ros_grabber PUBLIC ${PROJECT_NAME})
add_executable(realm_exiv2_grabber src/grabber_exiv2_node_main.cpp)
add_dependencies(realm_exiv2_grabber ${catkin_EXPORTED_TARGETS})
target_link_libraries(realm_exiv2_grabber PUBLIC ${PROJECT_NAME})
add_executable(realm_stage_node src/stage_node_main.cpp)
add_dependencies(realm_stage_node ${catkin_EXPORTED_TARGETS})
target_link_libraries(realm_stage_node PUBLIC ${PROJECT_NAME})
################################################################################
# Install
################################################################################
# Mark executables and/or libraries for installation
install(
TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
# Mark cpp header files for installation
install(
DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING
PATTERN "*.h"
PATTERN "*.hpp"
)
错误:make install :ModuleNotFoundError: No module named ‘genmsg
错误:Invalid tag: Cannot load command parameter [rosversion]: command [rosversion roslaunch] returned with code [1].
解决办法:
步骤五:环境变量相关
~/.bashrc
#ros1
source /opt/ros/noetic/setup.bash
#openrealm
source /home/zeeco/OpenREALM/catkin_ws/devel/setup.sh
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/zeeco/OpenREALM/catkin_ws/
export CUDACXX=/usr/local/cuda/bin/nvcc
#opencv
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
4. 成功运行
5. 其他可能的问题
错误:OpenREALM/modules/realm_stages/include/realm_stages/pose_estimation.h:150:10: error: ‘deque’ in namespace ‘std’ does not name a template type
std::deque<Frame::Ptr> m_buffer_no_pose;
解决方案:在对应的头文件加#include <deque>