Code:https://github.com/shichaoy/cube_slam
Notes:本文描述笔者再Ubuntu18.04安装Cube-SLAM遇到的相关问题和解决方法。
配置相关问题或者Object SLAM相关科研问题欢迎通过邮件联系笔者交流:lidong8421bcd@gmail.com(基本保证两个工作日内回复邮件)
ROS环境配置:
mkdir -p ~/catkin_ws_Cube-SLAM/src
cd catkin_ws_Cube-SLAM/src/
catkin_init_workspace
cd ..
catkin_make
source devel/setup.sh
catkin_make install
echo "source ~/catkin_ws_Cube-SLAM/devel/setup.bash" >> ~/.bashrc
代码下载:
cd src/
git clone https://github.com/shichaoy/cube_slam.git
编译依赖项:
cd cube-slam/
sh install_dependenices.sh
编译工作空间:
cd ../..
catkin_make -j4
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/src/
下面文件报错如下:
error: ‘std::vector’ has not been declared
error: expected ‘,’ or ‘...’ before ‘<’ token
error: ‘all_strings’ was not declared in this scope
分析:看github的issue,这个问题是Ubuntu18.04编译经常会出现的问题。
解决方法:
1 :在功能包的CMAKELIST中添加 set(CMAKE_CXX_STANDARD 14)
,在几个C++文件中添加:#include
, error: ‘iota’ is not a member of ‘std’
报错问题没了
2:在以下几个文件中添加:#include
相关报错问题解决
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/src/box_proposal_detail.cpp
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/src/object_3d_util.cpp
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/src/matrix_utils.cpp
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/include/detect_3d_cuboid/detect_3d_cuboid.h
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/include/detect_3d_cuboid/matrix_utils.h
catkin_ws_Cube-SLAM/src/cube_slam/detect_3d_cuboid/include/detect_3d_cuboid/object_3d_util.h
error: ‘usleep’ was not declared in this scope
,经典ORB-SLAM2报错问题解决方法:在相关报错的文件上加入头文件 #include
。
#以下文件要添加#include
catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/src/LocalMapping.cc
catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/src/LoopClosing.cc
catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/src/System.cc
catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/src/Viewer.cc
完成之后编译成功。
运行:roslaunch object_slam object_slam_example.launch
demo可以正常跑。
这里因为作者使用的数据集有格式要求,暂且使用作者给的两个数据集(作者处理好了相关格式),后续会自己制作数据集测试。 这里作者给了两个数据集,分别对应静态情况和动态情况。
(1)Static datasets
(2)Dynamic datasets
这里我将两个数据集解压之后放到该路径下:catkin_ws_Cube-SLAM/src/cube_slam/Datasets
(1)跑Static datasets
这里需要先将mono.launch
文件中 中的路径修改为自己数据集的路径,我这里修改为:
/home/cvpr/catkin_ws_Cube-SLAM/src/cube_slam/Datasets/seq_07-20220720T061819Z-001/seq_07
然后报错如下:
Loading ORB Vocabulary. This could take a while...
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
[ros_mono-3] process has died [pid 1257, exit code -6, cmd /home/cvpr/catkin_ws_Cube-SLAM/devel/lib/orb_object_slam/ros_mono /home/cvpr/catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/Vocabulary/ORBvoc.bin /home/cvpr/catkin_ws_Cube-SLAM/src/cube_slam/orb_object_slam/Examples/Monocular/KITTI04-12_me.yaml /camera/image_raw:=/kitti/left/image_raw __name:=ros_mono __log:=/home/cvpr/.ros/log/48a4443c-07f6-11ed-a895-74ee2aeddddc/ros_mono-3.log].
log file: /home/cvpr/.ros/log/48a4443c-07f6-11ed-a895-74ee2aeddddc/ros_mono-3*.log
这里是词袋文件的问题,即mono.launch
中 args="$(find orb_object_slam)/Vocabulary/ORBvoc.bin
并没有找到这个文件;
解决方法:这里 cube_slam/orb_object_slam/Vocabulary
提供了将txt词袋转换为二进制的bin词袋的代码。这里我使用这个代码进行词袋转换有点问题,索性就直接下载了一个二进制词袋:https://github.com/nxyzgf/sgg-dbow2/blob/master/ORBvoc.bin
Gtk-ERROR **: 04:42:33.691: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
;这里这应该是linux系统同时安装了GTK+ 2.x 和 GTK+ 3导致的,参考:https://blog.csdn.net/weixin_39768247/article/details/111855987/,卸载opencv之后又重新装一边,同时将ROS的workspace中的build和devel删除重新编译。运行:roslaunch orb_object_slam mono.launch
正常。
然后跑ROS的bag数据集:rosbag play left_full_gray.bag
(2)跑Dynamic datasets
改为自己数据集的地址:/home/cvpr/catkin_ws_Cube-SLAM/src/cube_slam/Datasets/0018-20220720T062223Z-001/0018
即可运行:
roslaunch orb_object_slam mono_dynamic.launch
rosbag play mono.bag
效果如下: