我滴老天,与其说是复现记录,不如说是踩坑记录。。废话比较多,不想看的就不要往下看了哈哈哈哈,有点疯了
https://github.com/raulmur/ORB_SLAM2 官方链接
一、依赖安装
首先上官网看看安装步骤,心死。。怎么这么多需要装的东西,相比之下,激光SLAM的安装还是更简单一点啊,怀念fast-lio
网上的资料太杂乱,拼凑了好几篇,感谢这些作者的贡献,没有他们,像我这种菜鸡该怎么办呢:
https://blog.csdn.net/weixin_45442591/article/details/130184936 强烈推荐这篇,很有意思
https://zhuanlan.zhihu.com/p/452256687
https://www.jianshu.com/p/31c95d9a5f97
https://blog.csdn.net/shadowmimii/article/details/129472719
我的电脑git总是失败,你知道我有多痛苦吗,特别是遇到需要git下载依赖库的,所以我选择下载
https://zhuanlan.zhihu.com/p/452256687
这个作者提供的使用SLAMbook提供的安装,我直接下载了这个作者的代码,一下子变得简单了起来。
1. opencv安装
我记得我装过opencv来着。。结果编译报错说没有,QAQ,后来我知道了我原来的版本是4.5,要么版本太高,要么我没有添加库的路径,由于安装的时间久远,不追究了。
https://blog.csdn.net/shadowmimii/article/details/129472719
参照这个博主的安装,去官网下载,我下载的是3.4.5版本,成功
2. Eigen安装
sudo apt-get install libeigen3-dev
成功
3. Pangolin
这个按照教程来踩坑了,我发现好像没别人出现这个问题
第一次安装是成功了,但是编译ORBSLAM的时候出现报错:

报错太长,截图放不下,GPT解释了一下:
Pangolin 在你机器上是"带 Python 支持"编译的,但它链接的是 Python3.10。
然而------你的系统现在没有 Python3.10(或者至少没有对应的 libpython3.10.so.1.0),所以在编译 ORB-SLAM 时,链接器找不到这些 Python API,于是报出一大坨 _Py_*、PyObject_*、PyErr_* 之类的 undefined reference。
这类问题,本质就是:
你系统里有个"残留的" Pangolin,它硬绑了 Python3.10,ORB-SLAM 又被迫去链接它 → 直接炸。
所以我卸载了重新安装了一次,把命令换成:
cd Pangolin
mkdir build
cd build
cmake .. -DBUILD_PANGOLIN_PYTHON=OFF
make -j8
sudo make install
成功!!
二、源码编译
1. 普通跑数据集模式
这个按照教程来就行,编译成功如下:
cd ORB_SLAM2
chmod +x build.sh
./build.sh

(老天保佑!!)
成功后来用数据集跑跑试试看,由于我后续是想用双目模式,所以这里只跑一下官方给的Stereo Examples,用KITTI数据集(em?怎么又是你,伟大的数据集omg)
emmm这个也太大了吧?

算了,还是求助万能的互联网,嘿嘿有好心人单独放了其中一个序列的链接,好人啊:
https://zhuanlan.zhihu.com/p/466737055
./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTI00-02.yaml /home/yz/ORB_SLAM2/dataset/kitti00/dataset/sequences/00
注意,使用不同的数据集序列,指令不一样,贴一个官方的说明:
注意三处需要你根据实际情况修改:
KITTIX.yaml
根据不同序列切换配置文件:
序列 00--02 用:KITTI00-02.yaml
序列 03 用:KITTI03.yaml
序列 04--12 用:KITTI04-12.yaml
PATH_TO_DATASET_FOLDER
替换成你解压的 KITTI 数据集根目录。
SEQUENCE_NUMBER
写你想运行的序号,例如:00、01、02...11
成功跑起来了!!

2. ROS模式
对于科研狗来说,最后还是得用ros模式啊
https://www.jianshu.com/p/31c95d9a5f97 参考这个
我就知道会出问题。。第一次遇到问题是ROS路径找不到,仔细检查了一下这个命令
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:<PATH>/ORB_SLAM2/Examples/ROS
#<PATH>/ORB_SLAM2/Examples/ROS 替换为自己的路径
结果是换自己的路径的时候没把括号里的path删了..晕了,是时候下班了(bushi)
修复好之后出现第二个报错:

看了下原因,应该是opencv的版本冲突了,(和前面的报错闭环了啊家人们!),ros安装时自带了opencv,后来我们又装了一个(为啥这些教程都没提到这个问题呢,难道只有我一个人遇到了QAQ)。所以冲突了。
到这里,网上出现了两种解决办法:
一种是直接使用opencv4来编译orb-slam2,并去修改一些源文件;
https://blog.csdn.net/qq_49164258/article/details/129375322
另一种是定位到报错的文件,去把他复制到slam的文件夹里:
https://blog.csdn.net/YLYwj/article/details/131766994
感觉风险都很大哈哈哈哈,我不希望等我把这个改完,普通模式下不能跑了哈哈。
努力一把吧,选择第二种。结果是险赢,编译成功(虽然有警告,不过能跑就行)

可以看到,mono stereo rgbd monoar都成功了。
(但我还是有隐隐的不安感QAQ)所以我赶紧试了下普通模式还能不能编译成功,还好没事
下一个ros包:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
rosbag play your_file.bag -l 播放一下这个bag:
查看一下topic:

我在rviz看到的就是/cam0/image_raw,/cam1/image_raw这两个话题。
运行:
rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true
完蛋了,我就知道会有问题,报错:
ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.
Input sensor was set to: Stereo
Segmentation fault (core dumped)
查了一下:https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/286 里面全是疑惑哈哈
遇到这个问题的人还真不少。。最终的问题还是在noetic自带的opencv是4.5版本,而ORB-SLAM2需要的是3.*版本,所以当我们安装3.5版本后,在普通模式下运行成功。
但ROS模式下,使用3.*版本会报错,因为ROS 的 cv_bridge 强依赖 OpenCV 4.*版本,所以产生了冲突。到这里,有两种解决办法:
一是,卸载掉后来安装的3.5版本,用原始的4.5版本,但这样得去修改源码中的文件,比较考验水平,显而易见我没有水平,但互联网处处是大佬:
https://blog.csdn.net/KID_yuan/article/details/101272481 有大佬重写了opncv4版本,但是我后续还要跑其他算法,似乎很多都依赖opencv3.*,所以我不选择这种做法
二是,重新编译opencv,三步之类,必有解药:https://blog.csdn.net/Funny799/article/details/145233011 重新使用cv3.*编译cv_bridge(因为原来的是使用4.*编译的)
在操作之前先看看自己的环境里到底有哪些opencv:
接下来开始安装noetic对应的cv_bridge:
参考:
https://blog.csdn.net/qq_41816368/article/details/133843917
https://zhuanlan.zhihu.com/p/392939687
https://zhuanlan.zhihu.com/p/672147848
https://github.com/ros-perception/vision_opencv/tree/noetic 官网下载对应版本
(1)这里按照教程里的来就行,修改cmakelist:
cmake_minimum_required(VERSION 3.0.2)
project(cv_bridge)
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_DIR "/usr/local/share/OpenCV") #这里指向自己的opencv3通过源码安装的路径
set(_opencv_version 3)
find_package(OpenCV 3.4.5 QUIET)
# if(NOT OpenCV_FOUND)
# message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
# set(_opencv_version 3)
# endif()
find_package(OpenCV ${_opencv_version} 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()
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " catkin libraries: ${catkin_LIBRARIES}")
# install the include folder
install(
DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)
遇到报错:
cmake -DCMAKE_BUILD_TYPE=Release -DSETUPTOOLS_DEB_LAYOUT=OFF CMake Warning: No source or binary directory provided. Both will be assumed to be the same as the current working directory, but note that this warning will become a fatal error in future CMake releases. CMake Error: The source directory "/home/yz/vision_opencv-noetic/cv_bridge/build" does not appear to contain CMakeLists.txt. Specify --help for usage, or press the help button on the CMake GUI
(不要慌。。我可以我可以)
找到办法,编译时用以下命令不会报错:
https://blog.csdn.net/qq_17130909/article/details/97933582
cd vision_opencv/cv_bridge
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DSETUPTOOLS_DEB_LAYOUT=OFF -DCMAKE_INSTALL_PREFIX=$HOME/cv_bridge_installed .. #这里我指定了安装路径cv_bridge_installed 文件夹,是为了方便后续修改slam文件夹里的cmakelist编译使用的路径(这里是我在后面经历反复报错后得出的经验)
make
sudo make install
然而这个问题解决之后出现新的报错:
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: in function `main':
ros_stereo.cc:(.text.startup+0xf55): undefined reference to `cv::FileStorage::FileStorage(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: ros_stereo.cc:(.text.startup+0x17ff): undefined reference to `cv::FileNode::operator int() const'
/usr/bin/ld: ros_stereo.cc:(.text.startup+0x181f): undefined reference to `cv::FileNode::operator int() const'
/usr/bin/ld: ros_stereo.cc:(.text.startup+0x183f): undefined reference to `cv::FileNode::operator int() const'
/usr/bin/ld: ros_stereo.cc:(.text.startup+0x185f): undefined reference to `cv::FileNode::operator int() const'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/Stereo.dir/build.make:214: ../Stereo] Error 1
make[1]: *** [CMakeFiles/Makefile2:176: CMakeFiles/Stereo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
暂时没解决
以下没有参考价值,尚未完成
(2)cv_bridge编译成功后,要去ORBSLAM里的工作空间修改对应的cmakelist.txt
这里我踩了好多坑,折腾了半天,这里贴出最终的cmake文件,注意这里修改的是ORB_SLAM2/Examples/ROS/ORB_SLAM2这个路径下的文件
cmake_minimum_required(VERSION 2.4.6)
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
rosbuild_init()
IF(NOT ROS_BUILD_TYPE)
SET(ROS_BUILD_TYPE Release)
ENDIF()
MESSAGE("Build type: " ${ROS_BUILD_TYPE})
# 编译优化
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native")
# C++11 支持
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-DCOMPILEDWITHC11)
message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_definitions(-DCOMPILEDWITHC0X)
message(STATUS "Using flag -std=c++0x.")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../../cmake_modules)
# -------------------------------
# 指定 OpenCV 3.4.5
# -------------------------------
set(OpenCV_DIR "/usr/local/share/OpenCV")#修改为自己的路径
find_package(OpenCV 3 REQUIRED)
# -------------------------------
# 指定自编 cv_bridge
# -------------------------------
set(cv_bridge_DIR "/home/yz/cv_bridge_installed/share/cv_bridge/cmake")#修改为自己的路径
find_package(cv_bridge REQUIRED)
# -------------------------------
# 其他依赖
# -------------------------------
find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
# -------------------------------
# include directories,优先使用自编 cv_bridge
# -------------------------------
include_directories(
${cv_bridge_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
)
# -------------------------------
# 库列表,cv_bridge 和 OpenCV 放前面
# -------------------------------
set(LIBS
${OpenCV_LIBS} # OpenCV 放最前
${cv_bridge_LIBRARIES}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)
# -------------------------------
# Monocular camera
# -------------------------------
rosbuild_add_executable(Mono
src/ros_mono.cc
)
target_link_libraries(Mono
${LIBS}
)
# -------------------------------
# Monocular camera (AR Demo)
# -------------------------------
rosbuild_add_executable(MonoAR
src/AR/ros_mono_ar.cc
src/AR/ViewerAR.h
src/AR/ViewerAR.cc
)
target_link_libraries(MonoAR
${LIBS}
)
# -------------------------------
# Stereo camera
# -------------------------------
rosbuild_add_executable(Stereo
src/ros_stereo.cc
)
target_link_libraries(Stereo
${LIBS}
)
# -------------------------------
# RGB-D camera
# -------------------------------
rosbuild_add_executable(RGBD
src/ros_rgbd.cc
)
target_link_libraries(RGBD
${LIBS}
)
message(STATUS "OpenCV_DIR: ${OpenCV_DIR}")
message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")
message(STATUS "OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "cv_bridge_DIR: ${cv_bridge_DIR}")
message(STATUS "cv_bridge_INCLUDE_DIRS: ${cv_bridge_INCLUDE_DIRS}")
message(STATUS "cv_bridge_LIBRARIES: ${cv_bridge_LIBRARIES}")
#以上是为了打印 看是否正确链接到opencv3版本
# -------------------------------
# 完成
# -------------------------------
message(STATUS "ORB-SLAM2 ROS build configured to use OpenCV 3.4.5 + self-compiled cv_bridge")
最后仍然没能成功。就是因为opencv的版本问题,因为我不想卸载原来的opencv4编译的cv_brodge,最后询问了师兄,师兄建议使用opencv4.2编译,而且官方仓库的ros版本并不能在后续发布话题实现进一步的栅格地图构建和规划,所以放弃ros接口编译,重新去使用改编的ros版本代码。在后续文章中会继续发布。