草庐IT

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

李97 2023-04-22 原文

   一

        首先需要保存轨迹,轨迹保存参考下面的代码,最好自己添加一个节点(如下图),用新节点来订阅和保存轨迹至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/odometryh(或者lio_sam/mapping/odometry_incremental,这两个好像没区别)话题,这些都可以在算法的Map节点里找到。我看很多博客上对lego/lio的欧拉角进行了转化再保存,实际上它们都有自己发布的odom信息,直接订阅就可以保存了。

void path_save(nav_msgs::Odometry odomAftMapped ){

	    //保存轨迹,path_save是文件目录,txt文件提前建好,/home/xxx/xxx.txt,
   			std::ofstream pose1(“path_save”, std::ios::app);
			pose1.setf(std::ios::scientific, std::ios::floatfield);
			pose1.precision(9);
	
			static double timeStart = odomAftMapped.header.stamp.toSec();
			auto T1 =ros::Time().fromSec(timeStart) ;
			pose1<< odomAftMapped.header.stamp -T1<< " "
              << -odomAftMapped.pose.pose.position.y << " "
              << odomAftMapped.pose.pose.position.z << " "
              << odomAftMapped.pose.pose.position.x << " "
              << odomAftMapped.pose.pose.orientation.x << " "
              << odomAftMapped.pose.pose.orientation.y << " "
              << odomAftMapped.pose.pose.orientation.z << " "
              << odomAftMapped.pose.pose.orientation.w << std::endl;
			pose1.close();
            
}

int main(int argc, char **argv){
    ros::init(argc, argv, "path_save");
    ros::NodeHandle nh;
    ros::Subscriber save_path = nh.subscribe<nav_msgs::Odometry>("/aft_mapped_to_init",     100, path_save);	    //保存轨迹,a_loam直接订阅话题/aft_mapped_to_init。

    ros::spin();
     }

        轨迹文件的时间戳得按(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为位移。

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
T: -7.137748e-03 -7.482656e-02 -3.336324e-01

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

(lidar->camera(world))  
Eigen::Vector3d pose_t;  
Eigen::Matrix3d  pose_R;            
  pose_t <<-7.137748e-03 ,-7.482656e-02, -3.336324e-01;
  pose_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
  
Eigen::Vector3d pose;
        pose(0)=odomAftMapped.pose.pose.position.x;
        pose(1)=odomAftMapped.pose.pose.position.y;
        pose(2)=odomAftMapped.pose.pose.position.z;
Eigen::Vector3d pose_s;
   //可以只 +pose_t
        pose_s = pose_R * pose + pose_t;

 总结

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

有关LOAM、Lego-liom、Lio-sam轨迹保存,与Kitti数据集真值进行评估的更多相关文章

  1. 软约束、硬约束、Minimum Snap的轨迹优化方法 - 2

    文章目录前言约束硬约束的轨迹优化Corridor-BasedTrajectoryOptimizationBezierCurveOptimizationOtherOptions软约束的轨迹优化Distance-BasedTrajectoryOptimization优化方法前言可以看看我的这几篇Blog1,Blog2,Blog3。上次基于MinimumSnap的轨迹生成,有许多优点,比如:轨迹让机器人可以在某个时间点抵达某个航点。任何一个时刻,都能数学上求出期望的机器人的位置、速度、加速度、导数。MinimumSnap可以把问题转换为凸优化问题。缺点:MnimumSnap可以控制轨迹一定经过中间的

  2. Segment Anything(SAM)的demo的简单使用 - 2

    如果觉得文章还行,能点个赞嘛?您的点赞是我更新的动力!!目录SAM的demo源码使用结合SAM,进行人机交互ui使用的案例介绍:最近新发现的,可以利用这个模型,进行一个简单的UI使用,效果如下:labelimg结合SAM实现半自动标注软件SAM的demo源码使用首先说明这个链接里面的代码是关于demo的,目前还不能训练。原仓库https://github.com/facebookresearch/segment-anything我们都知道在CV领域比较重要的处理图像的几个方向有:识别,测量(标定),三维物体重建等。识别是最基础也是最重要的,那么分割在识别里面更是重中之重,所以这个大模型分割真的

  3. javascript - 如何在 Plotly 中添加轨迹,并为 x 轴上的每个数据点设置自定义顺序? - 2

    我正在尝试创建一个具有(x,y)坐标的折线图,其中x轴对应于日期,y轴对应于值。日期格式为DD-MM-YYYY,即15-04-2015。当我添加我的第一条轨迹时:vartrace={x:["9-10-2016","6-12-2016","8-12-2016"],y:[30,11,38],name:"trace1",mode:'lines,我只是使用javascript数组的自定义排序方法按日期对数组的x轴和y轴进行排序。但是当我向图表中添加一条新轨迹时,似乎没有明显的方法可以让这些点相对于图表上的其他轨迹按日期排序。它们似乎总是位于第一条轨迹上所有内容的右侧,即使第二条轨迹中的某些点的

  4. javascript - 如何在具有纬度和经度的图层上显示轨迹 - 2

    我只是想在我的map上显示一条轨迹我试过如下但问题是我不想从GPX文件加载图层中的轨迹点(因为我不想从我得到的坐标生成文件从GPS设备编程)有没有办法从经度和纬度添加轨道层//AddtheLayerwiththeGPXTrackvarlgpx=newOpenLayers.Layer.Vector("Cartrack",{strategies:[newOpenLayers.Strategy.Fixed()],protocol:newOpenLayers.Protocol.HTTP({url:"testTrack.GPX",format:newOpenLayers.Format.GPX()

  5. javascript - 与轨迹网格碰撞 - 2

    我想避免我的播放器能够站在墙内。每个游戏刻我的玩家移动一小段距离和/或旋转。TL;DR请提供经典线段->-三Angular形交集算法的变体,该算法也返回未命中,或以其他方式解决问题如果线段在三Angular形的给定距离内通过,则该线段相交。这个问题有很多微妙之处,比如三Angular形的轨迹Angular是圆的,线段是否与三Angular形相切。我有通常的射线/三Angular形相交代码。但是,射线对于移动玩家的近似值非常差!我遇到了播放器中心缺失边缘但播放器网格穿过它们的问题。您如何有效地确定玩家在3D环境中何时何地与墙壁和障碍物发生碰撞?一种通用方法是使用近乎未命中的三Angula

  6. kitti数据集解析以及在mmdection3d中的pkl文件参数解析 - 2

    kiiti数据集介绍kitti数据集存在4个相机,其中0和1为灰度相机,2和3为彩色相机,各设备之间的安装示意图如下所示:如图所示:相机坐标系:x轴向右,y轴向下,z轴向前雷达坐标系:x轴向前,y轴向左,z轴向上GPS/IMU坐标系:x轴向前,y轴向左,z轴向上(与车base_link坐标系相同)从上图可知,kitti数据集的训练集中存在5个文件夹,最后一个暂时忽略(为mmdet3d中用于多模态任务将无颜色信息的点云去除后剩余的有用点云数据信息)。下面逐个分析上面4个文件夹:calib文件夹中如下:由上图可以看出,每组图像和点云数据都会对应一个标定文件,由于数据集是在不同场景得到的,已经被打乱

  7. c# - Microsoft Sam,SAPI 替代品 - 2

    我们有一个应用程序,我们计划使用Microsoft语音API。现在,我们使用MicrosoftSam语音在WindowsXP上对其进行了测试,坦率地说,它听起来很糟糕......几乎不可能听到声音试图说什么。还有其他更好的声音吗?是否有更好的更新或更新版本。是否有其他产品、开源项目等可以作为替代方案?澄清一下-它需要某种API,以便我实际上可以针对它进行编程。 最佳答案 在Windows上,我发现最好的是使用来自AT&TNaturalVoices的语音API和语音:https://nextup.com/attnv.html然而,如果

  8. 用CloudFormation或SAM部署身份提供商 - 2

    我有一个CodeStar项目,使用控制台我为OpenIDConnect创建了一个身份提供商和一个身份池。这起作用了,我可以验证我的所有资源。我会将手动过程变成更加自动化的东西。前两件事是创建身份提供商为该提供商创建一个身份池。理想的解决方案是,在代码星项目中添加几个说明。我试图查看SAM文档,似乎对身份提供商创建没有一些有用的东西。我看了云形式设计师,似乎没有任何需求。这怎么可能?如何自动化并将这些信息放在源控制下?看答案CloudFormation现在支持OpenIDConnect和SAML身份提供商:AWS::IAM::SAMLProvider资源类型用于SAML提供商和AWS::IAM:

  9. Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外 - 2

    导读ChatGPT、GPT-4无疑是2023年年初人工智能界最大的「爆款」。3月26日,OpenAICEO、ChatGPT之父SamAltman接受了著名学者与科技播客、麻省理工大学研究员LexFridman的专访,Sam分享了从OpenAI内部视角如何看待ChatGPT和GPT-4的里程碑式意义。智源社区整理了其中关于GPT-4的部分,供读者参考。要点▲ 我无法知晓历史书会对GPT的各个版本怎么评价。但如果非要我挑出一个至今看到的关键节点,我认为仍然是ChatGPT。GPT-4并没有太令我惊讶,ChatGPT则让我有些喜出望外。▲从某种程度上来说,GPT-4系统增强了人类智能,可以被应用于各

  10. javascript - 在没有轨迹球控件或其他相机控制库的情况下在 threeJS 中缩放相机 - 2

    我正在尝试使用threeJS来控制场景中的摄像机。我目前使用键盘上的左右键将相机设置为围绕我的物体旋转。但有谁知道我会如何缩放?这是我当前的代码:camera=newTHREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,1,10000);camera.position.set(0,20,35);varrotSpeed=.02;functioncheckRotation(){varx=camera.position.x,y=camera.position.y,z=camera.position.z;if(keybo

随机推荐