Ubuntu 20.04 Docker 中运行测试VINS-Fusion、VINS-mono、GVINS,以及VINS-Fusion+gps全局估计精度评估方法(EVO)

安装Docker

安装以及简易教程:

Docker零基础从入门到精通(全)_docker教程_码农研究僧的博客-CSDN博客

docker下编译运行

按照说明下载源码、在docker文件中开始编译,需要注意dockerfile中的ceres的下载地址会报错,改成github的下载地址

git clone https://github.com/ceres-solver/ceres-solver.git

配置文件中修改outdir地址为:

/root/catkin_ws/src/VINS-Fusion/output

地址可以在run.sh文件中获得

        docker run \
        -it \
        --rm \
        --net=host \
        -v ${VINS_FUSION_DIR}:/root/catkin_ws/src/VINS-Fusion/ \

GVINS、vinsfusion以及vinsmono的修改类似。

跑完的结果可以在本地的outdir中查看。

Docker环境下VINS-fusion(kitti 双目+GPS)精度评估

代码修改,目的是输出TUM格式的位姿数据

1、visualization.cpp

/*修改前
        // write result to file
        ofstream foutC(VINS_RESULT_PATH, ios::app);
        foutC.setf(ios::fixed, ios::floatfield);
        foutC.precision(0);
        foutC << header.stamp.toSec() * 1e9 << ",";
        foutC.precision(5);
        foutC << estimator.Ps[WINDOW_SIZE].x() << ","
              << estimator.Ps[WINDOW_SIZE].y() << ","
              << estimator.Ps[WINDOW_SIZE].z() << ","
              << tmp_Q.w() << ","
              << tmp_Q.x() << ","
              << tmp_Q.y() << ","
              << tmp_Q.z() << ","
              << estimator.Vs[WINDOW_SIZE].x() << ","
              << estimator.Vs[WINDOW_SIZE].y() << ","
              << estimator.Vs[WINDOW_SIZE].z() << "," << endl;
        foutC.close();
*/
//修改后
        double truetime = header.stamp.toSec();
        ofstream foutC("/root/catkin_ws/src/VINS-Fusion/output/result.csv", ios::app);
        foutC.setf(ios::fixed, ios::floatfield);
        foutC << truetime <<" ";
        foutC << estimator.Ps[WINDOW_SIZE].x() << " "
              << estimator.Ps[WINDOW_SIZE].y() << " "
              << estimator.Ps[WINDOW_SIZE].z() << " "
              << tmp_Q.x() << " "
              << tmp_Q.y() << " "
              << tmp_Q.z() << " "
              << tmp_Q.w() << endl;
        foutC.close();

注意文件输出位置:"/root/catkin_ws/src/VINS-Fusion/output/result.csv",不是本地位置,是容器中的位置,但是可以在本地得到。

2、pose_graph.cpp

/*修改前
    if (SAVE_LOOP_PATH)
    {
        ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file.precision(0);
        loop_path_file << cur_kf->time_stamp * 1e9 << ",";
        loop_path_file.precision(5);
        loop_path_file  << P.x() << ","
              << P.y() << ","
              << P.z() << ","
              << Q.w() << ","
              << Q.x() << ","
              << Q.y() << ","
              << Q.z() << ","
              << endl;
        loop_path_file.close();
    }
*/
//修改后
    if (SAVE_LOOP_PATH)
    {
        ofstream loop_path_file("/root/catkin_ws/src/VINS-Fusion/output/loop_result.csv", ios::app);
        double turetime = cur_kf->time_stamp;
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file << turetime << " ";
        loop_path_file  << P.x() << " "
              << P.y() << " "
              << P.z() << " "
              << Q.x() << " "
              << Q.y() << " "
              << Q.z() << " "
              << Q.w() << " "
              << endl;
        loop_path_file.close();
    }

3、globalOptNode.cpp

/*修改前
    // write result to file
    std::ofstream foutC("/home/tony-ws1/output/vio_global.csv", ios::app);
    foutC.setf(ios::fixed, ios::floatfield);
    foutC.precision(0);
    foutC << pose_msg->header.stamp.toSec() * 1e9 << ",";
    foutC.precision(5);
    foutC << global_t.x() << ","
            << global_t.y() << ","
            << global_t.z() << ","
            << global_q.w() << ","
            << global_q.x() << ","
            << global_q.y() << ","
            << global_q.z() << endl;
    foutC.close();
*/
//修改后
    std::ofstream foutC("/root/catkin_ws/src/VINS-Fusion/output/vio_global.csv", ios::app);
    foutC.setf(ios::fixed, ios::floatfield);
    foutC.precision(0);
    foutC << pose_msg->header.stamp.toSec() << " ";
    foutC.precision(5);
    foutC << global_t.x() << " "
            << global_t.y() << " "
            << global_t.z() << " "
            << global_q.x() << " "
            << global_q.y() << " "
            << global_q.z() << " "
            << global_q.w() << endl;
    foutC.close();

使用EVO进行精度评估

evo_traj tum vio_global.txt -p

图略。。。

与GT对比计算ATE,RTE。。。

你可能感兴趣的:(docker,容器,运维)