当前位置:   article > 正文

LOAM、Lego-liom、Lio-sam轨迹保存,与Kitti数据集真值进行评估_legoloam保存轨迹

legoloam保存轨迹

   一

        首先需要保存轨迹,轨迹保存参考下面的代码,最好自己添加一个节点(如下图),用新节点来订阅和保存轨迹至txt文件,因为直接在算法的线程中加入此步骤我试了好像保存不了,好像是在不同线程间的参数传递格式的问题(也可能是我个人的问题)。

        

Kitti数据集真值评估需要将kitti 类型轨迹转化为tum格式的轨迹,用evo转化需要下载evo源码。

(223条消息) KITTI数据集基准、转换成tum以及十个groundtruth对应图_kitti转tum_小海盗haner的博客-CSDN博客

(223条消息) 【KITTI】KITTI数据集简介(四) — 标定校准数据calib_tr_velo_to_cam_Coding的叶子的博客-CSDN博客

     a_loam在节点中订阅话题/aft_mapped_to_init,如下。lego同样操作订阅话题 /aft_mapped_to_init,lio-sam要订阅lio_sam/mapping/odometry话题(或者lio_sam/mapping/odometry_incremental,这两个都行,odometry_incremental是odometry使用IMU加权过的,差别不大),这些都可以在算法的Map节点里找到。我看很多博客上对lego/lio的欧拉角进行了转化再保存,实际上它们都有自己发布的odom信息,直接订阅就可以保存了。

  1. void path_save(nav_msgs::Odometry odomAftMapped ){
  2. //保存轨迹,path_save是文件目录,txt文件提前建好,/home/xxx/xxx.txt,
  3. std::ofstream pose1(“path_save”, std::ios::app);
  4. pose1.setf(std::ios::scientific, std::ios::floatfield);
  5. pose1.precision(9);
  6. static double timeStart = odomAftMapped.header.stamp.toSec();
  7. auto T1 =ros::Time().fromSec(timeStart) ;
  8. pose1<< odomAftMapped.header.stamp -T1<< " "
  9. << -odomAftMapped.pose.pose.position.y << " "
  10. << odomAftMapped.pose.pose.position.z << " "
  11. << odomAftMapped.pose.pose.position.x << " "
  12. << odomAftMapped.pose.pose.orientation.x << " "
  13. << odomAftMapped.pose.pose.orientation.y << " "
  14. << odomAftMapped.pose.pose.orientation.z << " "
  15. << odomAftMapped.pose.pose.orientation.w << std::endl;
  16. pose1.close();
  17. }
  18. int main(int argc, char **argv){
  19. ros::init(argc, argv, "path_save");
  20. ros::NodeHandle nh;
  21. ros::Subscriber save_path = nh.subscribe<nav_msgs::Odometry>("/aft_mapped_to_init", 100, path_save); //保存轨迹,a_loam直接订阅话题/aft_mapped_to_init。
  22. ros::spin();
  23. }

        轨迹文件的时间戳得按(xxx.header.stamp -T1)这样写,保存的是当前时间与第一帧位置时间的差值,因为Kitti真值的轨迹时间戳是这样保存的,与真值时间戳不同步之后没法评估。数据的z、y、z写入顺序是人为的将坐标轴与Kitti数据集的对齐了(也可以按原来的写,或者用左乘外参矩阵进行调整,因为之后会用evo按时间戳对齐进行评估),如下图一KItti真值是x_z轴的,你跑出来可能是横着的,但是只要时间戳没问题你还是可以把它们对齐(图二)。对齐命令如下,具体评估可以看以下博客。 

(223条消息) 轨迹评估工具使用总结(一) evo从安装到入门_evo评估工具怎么对齐起点_Techblog of HaoWANG的博客-CSDN博客

evo_traj tum 07_tum.txt lego_07.txt  --ref=07_tum.txt -p -a

图一

 

 图二

        Kitti数据集是有外参标定信息的就是lidar->camera(world)的参数矩阵,也可以使用输出值左乘外参矩阵,参数如下,R为旋转,T为位移。

  1. R: 7.027555e-03 -9.999753e-01 2.599616e-05 -2.254837e-03 -4.184312e-05 -9.999975e-01 9.999728e-01 7.027479e-03 -2.255075e-03
  2. T: -7.137748e-03 -7.482656e-02 -3.336324e-01

 然后把要输出的位置同样放进矩阵里,用外参矩阵进行调整就行了。也可以不旋转,只进行平移,因为evo可以根据时间戳对齐,不需要坐标轴一致。实际测试后发现加不加外参差别好像不大。

  1. (lidar->camera(world))
  2. Eigen::Vector3d pose_t;
  3. Eigen::Matrix3d pose_R;
  4. pose_t <<-7.137748e-03 ,-7.482656e-02, -3.336324e-01;
  5. pose_R <<7.027555e-03, -9.999753e-01, 2.599616e-05,
  6. -2.254837e-03, -4.184312e-05 ,-9.999975e-01,
  7. 9.999728e-01 ,7.027479e-03 , -2.255075e-03
  8. Eigen::Vector3d pose;
  9. pose(0)=odomAftMapped.pose.pose.position.x;
  10. pose(1)=odomAftMapped.pose.pose.position.y;
  11. pose(2)=odomAftMapped.pose.pose.position.z;
  12. Eigen::Vector3d pose_s;
  13. //可以只 +pose_t
  14. pose_s = pose_R * pose + pose_t;

 总结

                其实整体步骤并不多,但中间测试时遇到过很多问题,比如主线程中无法将位姿写入轨迹文件,保存的归家与真值时间戳的对齐问题,轨迹图不在一个平面上的问题等。但后来发现只要将轨迹时间戳相互对齐,就不用管轨迹坐标轴角度的不同,直接用evo根据时间戳对齐即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/238248
推荐阅读
相关标签
  

闽ICP备14008679号