ORB_SLAM2_modified编译安装(高翔老师版本)

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值,将其改大即可(如下图)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示表示PCL(点云库)中voxelgrid滤波器应用时,设定的体素大小(即leaf size)太小了,无法处理输入的点云数据集。voxelgrid滤波器是将点云数据划分为等大小的体素,再以每个体素中的点云数据平均值作为这个体素的代表点,从而将点云数据以一定精度压缩。 如果设定的体素大小太小,就会导致使用这个滤波器时,每个体素中的点云数据太少,无法平均出较为准确的代表点,最终导致程序无法处理。解决方法是增加体素大小或者减小输入数据集的数量,使得每个体素中的点云数据足够多。 需要注意的是,过大的体素大小会减少点云数据的精度,影响后续处理的效果。因此在使用voxelgrid滤波器时需要合理设定体素大小,权衡处理效率和处理精度。 ### 回答2: 这段话的意思是,输入数据集的叶子大小(Leaf size)太小了,无法应用 pcl::voxelgrid::applyfilter 过滤器。PCL(点云库)中的 voxelgrid 过滤器可以将点云离散化,即将点云分为许多方格,每个方格里只保存一个点云。这样做可以提高点云处理的效率和减少内存占用。叶子大小则是定义方格的大小,可以通过设置不同的值来调整离散化的粒度。 但是,如果叶子大小设置得太小,输入数据集中可能会存在许多重复的点云,导致离散化后得到的方格数过多,进而影响处理效率和内存占用。因此,当提示“leaf size is too small for the input dataset”时,我们需要增加叶子大小的值,来适配输入数据集的大小和特征,以达到更好的处理效果。 ### 回答3: 这个错误信息意思是,pcl::voxelgrid::applyfilter中设置的叶子大小过小,不适用于输入数据集。PCL是一个开源的点云处理库,其中voxelgrid::applyfilter用于对点云进行降采样,把点云分割成规则的网格。在使用该函数时,需要设定叶子大小,即每个体素(三维网格单元)的大小,叶子大小越小,输出的点云精度就越高,但同时也会导致处理时间和内存占用增加。 如果出现上述错误,说明叶子大小设置过小,导致输入数据集的点密度和点数无法适应处理。解决方法是调整叶子大小,增大叶子大小可以降低点云精度,但能满足处理需求,减少内存占用和处理时间。如果输入数据点云的分辨率非常高,可以考虑使用其他的降采样算法,如聚类采样(pcl::RandomSample)或基于网格滤波(pcl::GridMinimum)的降采样方法。在使用任何算法前,需要了解输入点云的特征和处理需求,选取适当的算法和参数进行处理,以达到最佳效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值