基于Ubuntu14.04+ROS indigo的ORB-SLAM2 编译调试问题解决
问题来源
由于ORB-SLAM2 在3年前就开源了,当时采用的各种配置环境和依赖包已经进行了相应的更新,造成安装和编译过程出现各种问题。
依赖项安装
Pangolin安装
- 直接git clone https://github.com/stevenlovegrove/Pangolin.git 进行编译和安装会报错。
解决方法:采用先前的版本,根据时间采用3-4年前的版本,本人采用的是Tags下的v0.3版本,直接在上述下载的安装包里面执行命令:git checkout -b v0.3。
采用与开源代码同时期的依赖包是一种能够规避很多问题的方法,需要牢记啊! - 另外一个问题是:ORB-SLAM2编译成功后,调用Pangolin出现 “what(): Pangolin X11: Unable to retrieve framebuffer options”。
解决方法:
注释掉Pangolin/src/display/device/display_x11.cpp文件中的两行代码即可,具体如下:
staticint visual_attribs[] =
{
GLX_X_RENDERABLE , True,
GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT,
GLX_RENDER_TYPE , GLX_RGBA_BIT,
GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR,
GLX_RED_SIZE , 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, 8,
GLX_DEPTH_SIZE, 24,
GLX_STENCIL_SIZE, 8,
GLX_DOUBLEBUFFER , glx_doublebuffer ? True : False,
//注释这一行GLX_SAMPLE_BUFFERS , glx_sample_buffers,
//注释这一行 GLX_SAMPLES , glx_sample_buffers > 0 ? glx_samples : 0,
None
};
Opencv版本带来的问题
- 本人编译ORBSLAM2的opencv版本采用3.3.0,而ros indigo自带的opencv版本是2.4.x的。在运行ROS节点的时候,调用了liborbslam2.so,这里链接了opencv 3.3.0的版本,而cv_bridge是连接到2.4.x的版本,所以形成了冲突。具体运行错误:
/build/buildd/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp, line 740
terminate called after throwing an instance of ‘cv::Exception’
解决方法:
sudo apt-get remove ros-indigo-cv-bridge
然后创建一个catkin工作空间:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros-perception/vision_opencv.git
$ cd ~/catkin_ws/
$ catkin_make
为了编译ORBSLAM2的ROS节点时能找到cv-bridge这个包,还需要将这个包添加到ROS_PACKAGE_PATH里面,操作是:
$ gedit ~/.bashrc
然后在最后添加:
source /home/michael/catkin_ws/src/devel/setup.bash - 如果通过上述方法可能出现下列错误:
cv_bridge depends on non-existent package ‘opencv3’ and rosdep claims that it is not a system dependency. Check the ROS_PACKAGE_PATH or try calling ‘rosdep update’
解决方法:
(1)去掉/Examples/ROS/ORB_SLAM2/manifest.xml中的cv_bridge依赖
(2)通过cmake编译cv_bridge,将其作为lib来调用
$ cd ~/catkin_ws/src/cv_bridge
$ mkdir build
$ cd build
$ cmake …
$ make
$ sudo make install
然后在/Examples/ROS/ORB_SLAM2/cmakelists.txt中添加下列语句
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake)
find_package(cv_bridge REQUIRED)
修改set(LIBS){}为
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${cv_bridge _LIBRARIES}
${PROJECT_SOURCE_DIR}/…/…/…/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/…/…/…/Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/…/…/…/lib/libORB_SLAM2.so
)
最终正常运行结果
- 根据ORB_SLAM2中的README.md运行Example
- 运行结果
参考文献
1: https://github.com/raulmur/ORB_SLAM2
2: https://www.cnblogs.com/Jessica-jie/p/6959309.html
3: https://www.cnblogs.com/yepeichu/p/10896201.html
4: https://blog.csdn.net/JAYSITE/article/details/80224750