evo README 展示的三维轨迹、姿态与速度同步回放界面

evo

Stars

面向里程计与 SLAM 系统的 Python 评测工具,提供轨迹对齐、绝对位姿误差(APE)、相对位姿误差(RPE)、结果统计和可视化,支持 KITTI、TUM、EuRoC 等常见轨迹格式。

Odometry · SLAMAPE · RPEPython · NumPy
ODOMETRY EVALUATION · RPE PAIRING

轨迹第一段,也属于误差统计

距离型连续 RPE 应从 pose 0 开始覆盖整条轨迹;阈值命中的 pose 是区间终点,不能同时取代最初的起点。

DETERMINISTIC STRAIGHT PATHdelta = 2 m
0 m1 m2 m3 m4 m

pose index follows distance on this test path

BEFORE · START OMITTED
0 → 2MISSING2 → 4COUNTED
1 PAIR

initial trajectory error is absent from RPE statistics

AFTER · COMPLETE COVERAGE
0 → 2COUNTED2 → 4COUNTED
2 PAIRS

ids = [0] · accumulate from pose 1

起点缺失

首个阈值命中之前没有区间起点

距离型 RPE 在 `all_pairs=False` 时只收集累计路径首次达到各个距离阈值的 pose,再把相邻端点配成非重叠区间,却没有把 pose 0 放入端点列表。对于位置为 `0, 1, 2, 3, 4 m`、`delta=2 m` 的直线路径,旧逻辑只返回 `(2, 4)`,完整漏掉 `(0, 2)`,使轨迹起始阶段的误差不进入统计。

统计后果

少一个 Pair,也漏掉开头累计误差

连续 RPE pair 的端点列表描述整条轨迹的区间边界,而第一条边界必须是起点。仅在达到阈值时记录终点,会天然丢失首段;但如果从 pose 0 重新参与距离累积,又会构造起点与自身的无效关系。因此应先固定起点,再从第二个 pose 开始累计实际路程。

边界修复

固定 Pose 0,再从第二帧累计距离

将连续模式的端点初始化为 `ids = [0]`,随后使用 `enumerate(poses[1:], start=1)` 从 pose 1 开始累积距离,保留原始全局索引;阈值判断、区间清零以及 `all_pairs=True` 路径均保持不变。回归用五个等距 pose 直接锁定 `[(0, 2), (2, 4)]`。

回归验证

0–4 m 路径恢复两个连续区间

非重叠的米制 RPE 现在从轨迹起点开始形成完整分段,不再少算一个区间或忽略开头累计的位姿误差;行为也与基于 frame 和 angle 的连续过滤器保持一致。针对过滤器的 11 项测试、全量 111 项测试以及类型检查全部通过。

evo README 展示的轨迹误差分布统计图
误差分布图展示 evo 如何把不同轨迹估计的位姿误差整理成可比较的统计结果。距离型 RPE 的每一个轨迹区间都会贡献一条相对运动误差,因此首段是否进入 pair 列表会直接影响样本数量与最终分布。