安装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。。。