1.下载源代码
源码连接:GitHub - gaoxiang12/ORBSLAM2_with_pointcloud_map
git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git
2.编译准备
解压 orbslam2_modified.zip,解压过程选择替换文件(覆盖部分ORB_SLAM2_modified文件夹下文件)
3.编译g2o_with_orbslam2
① 修改 g2o_with_orbslam2/CMakeList.txt
注释部分代码
② 修改 g2o_with_orbslam2/g2o/CMakeList.txt
注释部分代码
③ 修改 g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp
将
t.setRotation(t.rotation().angle()+_measurement);
改为
t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));
未经修改,将报错 error: no matching function for call to ‘g2o::SE2::setRotation (Eigen::Rotation2D<double>::Scalar
④ 修改 g2o_with_orbslam2/g2o/solvers/linear_solver_eigen.h
将
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;
改为
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;
未经修改,将报错 error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_ TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
将
VectorXd probLimits(MO_NUM_ELEMS);
for (int i = 0; i < probLimits.size(); ++i)
probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;
改为
VectorXd probLimits;
probLimits.resize(MO_NUM_ELEMS);
for (int i = 0; i < probLimits.size(); ++i)
probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;
未经修改,将报错 error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__ INTEGER_WAS_EXPECTED’ is not a member of ‘Eigen::internal::static_asse
⑤ 编译
cd g2o_with_orbslam2
mkdir build
cmake ..
make -j8
sudo make install
4.编译DBoW2
cd ORB_SLAM2_modified/Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
5.编译ORB_SLAM2
① 修改 CMakeList.txt
修改CMakeList中的各个package版本与本机版本匹配
# 均选择对应的版本号
find_package(OpenCV 3.2.0 REQUIRED)
find_package(Eigen3 3.4.0 REQUIRED)
find_package(PCL 1.7 REQUIRED)
② 编译
mkdir build
cd build
cmake ..
make -j8
6.编译ROS例程
① 修改 CMakeList.txt
find_package(PCL 1.9.1 REQUIRED ) #添加了稠密点云显示,用到了pcl库,要找到PCL库并添加进来
include_directories(
${PROJECT_SOURCE_DIR}
${PCL_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
)
link_directories( ${PCL_LIBRARY_DIRS} )
set(LIBS
${OpenCV_LIBS}
${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
${Boost_SYSTEM_LIBRARY}
${PCL_LIBRARIES}
)
修改包版本,并添加PCL点云库。
未经修改,可能报错 fatal error: pcl/common/transforms.h: No such file or directory
② 编译
chmod +x build_ros.sh
./build_ros.sh
如果遇到报错:
Traceback (most recent call last):
File “/opt/ros/kinetic/share/ros/core/rosbuild/bin/check_same_directories.py”, line 48, in
raise Exception
Exception
CMake Error at /opt/ros/kinetic/share/ros/core/rosbuild/private.cmake:102 (message):
[rosbuild] rospack found package “ORB_SLAM2” at
“/opt/ros/kinetic/share/ORB_SLAM2”, but the current directory is
“/home/ckq/TextSLAM/ORB_SLAM2-master/Examples/ROS/ORB_SLAM2”. You should
double-check your ROS_PACKAGE_PATH to ensure that packages are found in the
correct precedence order.
Call Stack (most recent call first):
/opt/ros/kinetic/share/ros/core/rosbuild/public.cmake:177 (_rosbuild_check_package_location)
CMakeLists.txt:4 (rosbuild_init)
cd /opt/ros/kinetic/share
sudo ln -s /home/...(具体路径).../Examples/ROS/ORB_SLAM2 /opt/ros/kinetic/share/ORB_SLAM
后记:ORB-SLAM2在线点云地图构建与ROS点云消息发布,参考熊猫飞天老师的博客:https://rupingcen.blog.csdn.net/article/details/88899163
食用时注意:
a.安装过程中,需要修改ROS包、ORB_SLAM2、g2o、DBoW2包下的CMakeLists.txt,删除其中“-march=native”(不起用优化),否则有可能造成运行时卡死。
b.如果出现以下问题:Leaf size is too small for the input dataset. Integer indices would overflow
修改ORB_SLAM2下/src/pointcloudmapping.cc中resolution值,将其改大即可(如下图)