从零开始做自动驾驶定位(七): 里程计精度评价

文纯属转载,并认真学习一遍,感谢大佬分享!

本文章配套源代码地址:https://github.com/Little-Potato-1990/localization_in_auto_driving

测试数据:https://pan.baidu.com/s/1TyXbifoTHubu3zt4jZ90Wg提取码: n9ys

本篇文章对应的代码Tag为 7.0

代码在后续可能会有调整,如和文章有出入,以实际代码为准

==================================================================================================

一、概述

由于我们的整体思路是逐渐改进来完成这个系列文章,所以每一步改进之后,实现了怎样的效果,提升了多少,是要有一个比较的,也就是这里的里程计精度评价。

我们没必要自己写精度评价算法,有开源的 评价方法evo 可以使用,我们只需要把对应的gnss数据和里程计数据存储下来,在运行完之后使用evo进行数据处理就可以了。

所以本片文章的内容并不多。

二、实现方法

一共分两步:存数据 和 评价

我们在发布里程计的函数PublishData前面再加一个函数 SaveTrajectory 去存储数据就好。自然需要的就是创建文件夹、创建txt文件、往文件里写数据了。

bool FrontEndFlow::SaveTrajectory() {
    static std::ofstream ground_truth, laser_odom;
    static bool is_file_created = false;
    if (!is_file_created) {
        if (!FileManager::CreateDirectory(WORK_SPACE_PATH + "/slam_data/trajectory"))
            return false;
        if (!FileManager::CreateFile(ground_truth, WORK_SPACE_PATH + "/slam_data/trajectory/ground_truth.txt"))
            return false;
        if (!FileManager::CreateFile(laser_odom, WORK_SPACE_PATH + "/slam_data/trajectory/laser_odom.txt"))
            return false;
        is_file_created = true;
    }

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            ground_truth << gnss_odometry_(i, j);
            laser_odom << laser_odometry_(i, j);
            if (i == 2 && j == 3) {
                ground_truth << std::endl;
                laser_odom << std::endl;
            } else {
                ground_truth << " ";
                laser_odom << " ";
            }
        }
    }

    return true;
}

由于创建文件夹和创建文件这类功能是通用功能,所以我们在工程目录tools文件夹下定义一个FileManager类,专门存放此类小功能。

其中此处两个功能对应的函数就分别是CreateDirectory和CreateFile。存数据就是往txt文件里写两个位姿矩阵。

2. EVO评价

1)安装EVO

可以直接pip安装

pip install evo --upgrade --no-binary evo

2)使用EVO评价数据

EVO评价数据有两种模式,对应的指令分别是 evo_rpeevo_ape ,前者评价的是每段距离内的误差,后者评价的是绝对误差随路程的累计。

评价每段距离内的误差可以使用如下指令

evo_rpe kitti ground_truth.txt laser_odom.txt -r trans_part --delta 100 --plot --plot_mode xyz

其中 --delta 100 表示的是每隔100米统计一次误差,这样统计的其实就是误差的百分比,和kitti的odometry榜单中的距离误差指标就可以直接对应了。

执行指令之后会得到如下图形

由于每隔100米计算一次,所以是离散的点连成的折线。具体的统计指标如下

最大误差: 1.843837 %

平均误差: 0.805469 %

最小误差: 0.240367 %

RMSE: 0.903959 %

评价总累计误差可以用如下指令

evo_ape kitti ground_truth.txt laser_odom.txt -r full --plot --plot_mode xyz

会得到这样的图形

其中灰色部分就是累计误差,具体的指标如下

最大值:60.786025 m

平均值:19.478159 m

RMSE: 26.941895 m

从零开始做自动驾驶定位(六): 传感器时间同步

从零开始做自动驾驶定位(八): 点云畸变补偿

编辑于 02-27

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值