使用evo将slam中的rosbag的轨迹输出为tum格式的txt文件

1.首先下载好evo工具

1.1首先确定好要python版本,这里安装用python2版本即可,指令:

python --version

 1.2如果不是python2版本,切换为python2版本,(如果用的是python3版本,会有很多ros指令无法使用,笔者之前切换到python3无法使用ctrl+alt+t无法打开终端,切换回python2就好了),(有多个python版本并且设置了优先条件才需要这一步)切换指令:

sudo update-alternatives --config python

 1.3注意python与pip的关系,python2就对应pip,python就对应pip3,我们这里下载的是evo1.1.2,用pip就可以

1.4下载evo(直接在终端运行,HOME中生成evo文件夹)


git clone https://github.com/MichaelGrupp/evo.git

 进入evo

cd evo

检查


git checkout v1.12.0

 下载


sudo pip install  -i https://pypi.tuna.tsinghua.edu.cn/simple --editable . --upgrade --no-binary evo

1.5检查evo安装的软件包,(看一下有没有安装成功)


    pip list//列出pip安装的软件包

 

 如图所示(按照字母顺序排序)

1.6卸载的指令


    pip uninstall evo//卸载

 2.测试一下

进入home里的evo文件夹,然后

cd test/data
evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xyz//测试指令

 (ok,这样代表evo指令没有问题,接下来进入实际测试)

3.实际测试(使用rosbag来测试)

笔者这里是用dlo算法跑数据包,然后记录其中的/robot/dlo/odom_node/odom话题

3.1将算法运行起来(每个人可能用的是不同算法,这里我举例dlo算法)(改了topic所以肯定不是源dlo算法,1_dlo.launch)


beming@beming-G15:~$ cd dlo_wordspace/
beming@beming-G15:~/dlo_wordspace$ source ./devel/setup.bash
beming@beming-G15:~/dlo_wordspace$ roslaunch direct_lidar_odometry 1_.launch 

3.2将数据包运行起来(每个人的数据包也是不一样的,这里举例而已)

rosbag play kys-v_0000000080_0.bag 

3.3这一步我们应该查看一下发布的话题,

rostopic list

 其中的/robot/dlo/odom_node/odom,其实就是里程计,关键就是要知道以odom结尾的话题

3.4录制话题,将算法,数据包运行起来后,记录其中的odom结尾的话题

指令:(enter开始,按ctrl+c录制结束)

rosbag record /robot/dlo/odom_node/odom
(record后面空格后直接接话题,也可以是多个话题)

 (注意在哪个空间录制的,这个包就会存在哪个空间,并且以时间命名包的名字)

(如图蓝色的所示)

我们再查看一下录制的包的话题内容,防止出错,指令是:(XX代表bag的名称)

rosbag info XXXXXX

 这个话题和我们需要录制的是一样的,没有错误

3.5接下来我们需要将录制的包(以odom为topic结尾的)转化为tum格式,

指令:evo_traj bag XXXXX1.bag  XXXXX2  --save_as_tum(XXXX1为包的名字,XXXX2为topic的名字)

 evo_traj bag 2023-07-09-17-01-47.bag /robot/dlo/odom_node/odom --save_as_tum

出现下面的内容就是成功了 

然后你就可以看见一个以tum结尾的文件(在之前的那个bag的空间里) 

 然后就是改一下后缀,将tum的后缀改为txt

 3.6运行指令,显示轨迹图

evo_traj tum odom.txt -p

 (完美实现轨迹图)

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个简单的C++代码片段,用于将ORBSLAM输出轨迹文件TUM数据集真实轨迹进行空间对齐: ``` #include <iostream> #include <fstream> #include <string> #include <Eigen/Core> using namespace std; using namespace Eigen; int main(int argc, char **argv) { if(argc != 4) { cerr << "Usage: align_traj <orbslam_traj> <tum_traj> <output_traj>" << endl; return 1; } // Load ORBSLAM trajectory file ifstream orbslam_file(argv[1]); if(!orbslam_file) { cerr << "Error: unable to open ORBSLAM trajectory file" << endl; return 1; } vector<Vector3d> orbslam_traj; while(!orbslam_file.eof()) { double timestamp, tx, ty, tz; orbslam_file >> timestamp >> tx >> ty >> tz; if(orbslam_file.fail()) break; orbslam_traj.push_back(Vector3d(tx, ty, tz)); } orbslam_file.close(); // Load TUM trajectory file ifstream tum_file(argv[2]); if(!tum_file) { cerr << "Error: unable to open TUM trajectory file" << endl; return 1; } vector<Vector3d> tum_traj; while(!tum_file.eof()) { double timestamp, tx, ty, tz, qx, qy, qz, qw; tum_file >> timestamp >> tx >> ty >> tz >> qx >> qy >> qz >> qw; if(tum_file.fail()) break; tum_traj.push_back(Vector3d(tx, ty, tz)); } tum_file.close(); // Compute transformation between ORBSLAM and TUM trajectories assert(orbslam_traj.size() == tum_traj.size()); int num_poses = orbslam_traj.size(); MatrixXd A(num_poses * 3, 6); VectorXd b(num_poses * 3); for(int i = 0; i < num_poses; i++) { Vector3d p1 = orbslam_traj[i]; Vector3d p2 = tum_traj[i]; A.block<3, 3>(i*3, 0) = Matrix3d::Identity(); A.block<3, 3>(i*3, 3) = skew(p2); b.segment<3>(i*3) = p1 - p2; } VectorXd x = (A.transpose() * A).ldlt().solve(A.transpose() * b); Matrix4d T = Matrix4d::Identity(); T.block<3, 3>(0, 0) = AngleAxisd(x[3], Vector3d::UnitX()) * AngleAxisd(x[4], Vector3d::UnitY()) * AngleAxisd(x[5], Vector3d::UnitZ()).toRotationMatrix(); T.block<3, 1>(0, 3) = x.head<3>(); // Transform ORBSLAM trajectory using computed transformation vector<Vector3d> aligned_traj; for(int i = 0; i < num_poses; i++) { Vector4d p(orbslam_traj[i].x(), orbslam_traj[i].y(), orbslam_traj[i].z(), 1); Vector4d p_aligned = T * p; aligned_traj.push_back(Vector3d(p_aligned.x(), p_aligned.y(), p_aligned.z())); } // Write aligned trajectory to output file ofstream output_file(argv[3]); if(!output_file) { cerr << "Error: unable to open output file" << endl; return 1; } for(int i = 0; i < num_poses; i++) { output_file << fixed << setprecision(6) << (i+1)*0.1; output_file << " " << aligned_traj[i].x(); output_file << " " << aligned_traj[i].y(); output_file << " " << aligned_traj[i].z() << endl; } output_file.close(); return 0; } ``` 这段代码假定ORBSLAM输出轨迹文件TUM数据集真实轨迹文件都是简单的文本文件,每个位姿都包含时间戳和位姿矩阵(在ORBSLAM轨迹文件,位姿矩阵只包含平移部分)。代码读取这两个文件,然后使用最小二乘法计算一个从ORBSLAM轨迹TUM轨迹的刚性变换,最后将ORBSLAM轨迹变换到TUM轨迹的坐标系,并将结果写入输出文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值