ORB-SLAM2在ubuntu20.04中的复现记录(跑数据集+ROS)(ROS接口失败版)

我滴老天,与其说是复现记录,不如说是踩坑记录。。废话比较多,不想看的就不要往下看了哈哈哈哈,有点疯了

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版本代码。在后续文章中会继续发布。

相关推荐
计算机学姐3 小时前
基于Python的商场停车管理系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
ujainu3 小时前
Flutter + HarmonyOS开发:轻松实现ArkTS页面跳转
人工智能·python·flutter
小猪快跑爱摄影3 小时前
【AutoCad 2025】【Python】零基础教程(一)——简单示例
开发语言·python
秋刀鱼 ..3 小时前
【IEEE出版】第五届高性能计算、大数据与通信工程国际学术会议(ICHBC 2025)
大数据·人工智能·python·机器人·制造·新人首发
测试19984 小时前
软件测试之压力测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
Swizard4 小时前
极限瘦身:将 Python AI 应用从 100MB 砍到 30MB
java·python·ai·移动开发
编织幻境的妖4 小时前
Python代码性能优化工具与方法
开发语言·python·性能优化
Rookie_JE4 小时前
python docxtpl库学习
python
我不是小upper4 小时前
CNN+BiLSTM !!最强序列建模组合!!!
人工智能·python·深度学习·神经网络·cnn