VI-ORBSLAM2编译运行

源码地址

源码链接:https://github.com/jingpang/LearnVIORB

电脑配置

Ubuntu 18.04 + ROS Melodic + GTSAM 4.0.2 + CERES 1.14.0
pcl1.8+vtk8.2.0+opencv3.2.0

环境配置

之前已经配置过VINS-MOON的环境(可参考之前的博客)

编译

 cd ~/catkin_ws/src
//下载解压https://github.com/jingpang/LearnVIORB
 cd VI_ORBSLAM2
chmod +x build.sh

将build.sh文件中的make -j改为make
将下列文件加入头文件代码

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
Examples/Stereo/ORB_SLAM2/src/AR/ViewerAR.cc
Examples/Ros/stereo_kitti.cc
Examples/ROS/ORB_SLAM2/src/AR/ViewerAR.cc
src/Converter.cc
src/Frame.cc
src/FrameDrawer.cc
src/Initializer.cc
src/KeyFrame.cc
src/KeyFrameDatabase.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/Map.cc
src/MapDrawer.cc
src/MapPoint.cc
src/Optimizer.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/PnPsolver.cc
src/Sim3Solver.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc

添加原因:
(遇到同样的错误,可以添加头文件)
在这里插入图片描述修改所有CMakeLists.txt文件,在set(LIBS xxxxx 的后面加上

-lboost_system
//)

参考链接:https://blog.csdn.net/Robert_Q/article/details/121592896

所有CMakeLists.txt文件,将find_package中的opencv版本号改成自己安装的opencv版本号,EiGen3也改成自己安装的版本号
opencv版本号查看:

pkg-config --modversion opencv

参考链接:https://blog.csdn.net/qin_liang/article/details/127419612

报错

usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:33:40: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

解决方法:
打开VI-ORBSLAM2文件夹下的thirdparty/g2o/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;

参考链接:https://blog.csdn.net/weixin_44401286/article/details/102319719

编译

./build.sh

删除build文件夹,再次编译

mkdir build
cd build
cmake ..
make -j2

编译ROS

 cd ~/catkin_ws2/src/VI-ORBSLAM2/Examples/ROS/ORB_VIO/
 mkdir build
 cd build
 cmake ..
 make -j2

修改.bashrc文件

sudo  gedit ~/.bashrc

在文件尾添加

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws2/src/VI-ORBSLAM2/Examples/ROS

修改后在终端输入

source ~/.bashrc

轨迹保存为tum格式

在include/System.h 中添加

    void SaveTrajectory(const string &filename);

在src/System.cc中添加

 void System::SaveTrajectory(const string &filename)
    {
        cout << endl << "Saving camera trajectory to " << filename << " ..." << endl;
        
        vector<KeyFrame*> vpKFs = mpMap->GetAllKeyFrames();
        sort(vpKFs.begin(),vpKFs.end(),KeyFrame::lId);
        
        // Transform all keyframes so that the first keyframe is at the origin.
        // After a loop closure the first keyframe might not be at the origin.
        cv::Mat Two = vpKFs[0]->GetPoseInverse();
        
        ofstream f;
        f.open(filename.c_str());
        f << fixed;
        
        // Frame pose is stored relative to its reference keyframe (which is optimized by BA and pose graph).
        // We need to get first the keyframe pose and then concatenate the relative transformation.
        // Frames not localized (tracking failure) are not saved.
        
        // For each frame we have a reference keyframe (lRit), the timestamp (lT) and a flag
        // which is true when tracking failed (lbL).
        list<ORB_SLAM2::KeyFrame*>::iterator lRit = mpTracker->mlpReferences.begin();
        list<double>::iterator lT = mpTracker->mlFrameTimes.begin();
        list<bool>::iterator lbL = mpTracker->mlbLost.begin();
        for(list<cv::Mat>::iterator lit=mpTracker->mlRelativeFramePoses.begin(),
            lend=mpTracker->mlRelativeFramePoses.end();lit!=lend;lit++, lRit++, lT++, lbL++)
        {
            if(*lbL)
                continue;
            
            KeyFrame* pKF = *lRit;
            
            cv::Mat Trw = cv::Mat::eye(4,4,CV_32F);
            
            // If the reference keyframe was culled, traverse the spanning tree to get a suitable keyframe.
            while(pKF->isBad())
            {
                Trw = Trw*pKF->mTcp;
                pKF = pKF->GetParent();
            }
            
            Trw = Trw*pKF->GetPose()*Two;
            
            cv::Mat Tcw = (*lit)*Trw;
            cv::Mat Rwc = Tcw.rowRange(0,3).colRange(0,3).t();
            cv::Mat twc = -Rwc*Tcw.rowRange(0,3).col(3);
            
            vector<float> q = Converter::toQuaternion(Rwc);
            
            f << setprecision(6) << *lT << " " <<  setprecision(9) << twc.at<float>(0) << " " << twc.at<float>(1) << " " << twc.at<float>(2) << " " << q[0] << " " << q[1] << " " << q[2] << " " << q[3] << endl;
        }
        f.close();
        cout << endl << "trajectory saved!" << endl;
    }

在Examples/ROS/ORB_VIO/src的主函数中添加

   SLAM.SaveTrajectory(config._tmpFilePath+"trajectory.txt");

参考:https://blog.csdn.net/qq_40464599/article/details/113482823

运行结果

Euroc数据集

下载地址:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets

roslaunch ORB_VIO testeuroc.launch 
rosbag play MH_01_easy.bag  

在这里插入图片描述

evo_traj tum trajectory.txt  -p --plot_mode=xyz

在这里插入图片描述

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vi-ORB-SLAM2是一种视觉惯性(VI)同时定位与地图构建(SLAM)系统,用于无人机和移动机器人的自主导航。它融合了惯性测量单元(IMU)和摄像头信息,通过实时跟踪相机的位置和姿态来构建地图和定位机器人。 Vi-ORB-SLAM2采用了ORB特征描述子和FAST角点特征,以实时地提取和匹配特征点。它利用相机的运动估计来排除误匹配的特征点,从而提高了对动态环境的鲁棒性。 Vi-ORB-SLAM2使用基于滤波器的方法来融合IMU和视觉数据。通过IMU的角速度和加速度数据,可以估计相机的运动和姿态,并根据视觉测量来校准IMU的漂移。这种融合可以提高系统的鲁棒性和精确性,特别是在存在相机运动模糊或视觉信息缺失的情况下。 Vi-ORB-SLAM2还具有回环检测和优化的能力,可以在长时间的导航中自动修正漂移误差。它采用词袋模型来建立地图和检测回环,通过优化相机和地图的位姿关系来实现全局一致性。 Vi-ORB-SLAM2已经在无人机和移动机器人的多个实验平台上进行了验证,并取得了令人满意的性能。它在实时性和精确性方面都有不错的表现,并且相对于传统的视觉SLAM系统更具鲁棒性。 综上所述,Vi-ORB-SLAM2是一种基于视觉惯性融合的SLAM系统,具有鲁棒性、精确性和实时性的优势,适用于无人机和移动机器人的自主导航。 ### 回答2: vi-orb-slam2是一种基于视觉的实时单目SLAM(Simultaneous Localization and Mapping)系统。SLAM是一种能够同时估计相机位姿和环境的三维地图的技术。vi-orb-slam2采用单个摄像头进行定位和地图构建。 vi-orb-slam2使用了一种双目VO(Visual Odometry)和ORB特征的融合方法。VO方法通过连续帧之间的图像匹配和运动估计来计算相机的运动轨迹。ORB特征是一种高效的特征提取算法,它可以在快速实时的情况下提取和匹配特征点。 vi-orb-slam2通过在VO方法中引入ORB特征,进一步提高了系统的鲁棒性和准确性。ORB特征具有自适应的尺度和旋转不变性,可以应对不同尺度和姿态变化的场景。此外,ORB特征的计算效率也很高,可以实现实时的图像处理和跟踪。 vi-orb-slam2在实际应用中具有广泛的应用前景。它可以用于室内导航、增强现实、机器人自主导航等领域。通过实时地建立环境地图和同时估计相机的位姿,vi-orb-slam2可以帮助机器人或者无人机在未知环境中进行自主导航和定位。同时,vi-orb-slam2的实时性和高效性也使得它可以应用于实时监控、虚拟现实等实时场景中。 总的来说,vi-orb-slam2是一种高效、鲁棒和实时的单目SLAM系统,具有广泛的应用前景,可以在多个领域中实现定位和地图构建的任务。 ### 回答3: vi-orb-slam2 是一种基于视觉和惯性传感器数据的实时单目SLAM(Simultaneous Localization and Mapping)系统。SLAM是一种同时利用感知和定位能力,实时构建环境地图并实现自我定位的技术。 vi-orb-slam2利用摄像头和惯性测量单元(IMU)融合数据,可以在没有GPS信号的情况下,实时地建立并更新环境地图,并估计自身相对于地图的位置和姿态信息。 其中,ORB指的是Oriented FAST and Rotated BRIEF,是一种特征检测和描述子提取算法,可以快速地检测和描述图像中的特征点。SLAM系统通过ORB算法提取图像关键点,并利用这些特征点进行特征匹配,从而实现环境地图的构建和定位过程。 vi-orb-slam2还利用IMU的数据,并将其与视觉数据进行融合,从而提高系统的稳定性和鲁棒性。IMU可以提供姿态和加速度信息,用于补偿视觉数据中的相机运动误差,进一步提高SLAM系统的定位精度和鲁棒性。 vi-orb-slam2具有实时性能,可以在实时视频流上运行,并实时地估计相机的位姿。这使得vi-orb-slam2在许多应用中具有广泛的应用前景,例如机器人导航、增强现实和虚拟现实等领域。 总之,vi-orb-slam2是一种基于视觉和惯性传感器的实时单目SLAM系统,通过视觉特征匹配和IMU数据融合,实现了环境地图的构建和自我定位。它具有实时性能和鲁棒性,适用于多种应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值