目录
核心思路:插值 (Interpolation)
详细步骤
1. 数据准备
2. 时间对齐与搜索
3. 计算插值系数 $\alpha$
4. 执行插值
benchmark
总结
这是一个非常典型的传感器数据融合问题。由于相机频率 > 里程计频率(例如相机 30Hz,里程计 10Hz),不能简单地做“最近邻”匹配,否则连续几帧图像会对应同一个里程计位姿,导致轨迹呈阶梯状,这对 VIO 或 SLAM 算法是致命的。
需要做的是基于相机的时间戳,对里程计数据进行插值(Interpolation)。
以下是具体的操作步骤和代码思路:
核心思路:插值 (Interpolation)
为每一帧相机图像的时间戳 timg,根据其前后时刻的里程计数据 Oprev 和 Onext,计算出一个虚拟的里程计位姿 Ointerp。
- 位置 (Position, x,y,z):使用线性插值 (Linear Interpolation / Lerp)。
- 旋转 (Rotation, qx,qy,qz,qw):使用球面线性插值 (Spherical Linear Interpolation / Slerp)。注意:旋转不能直接线性相加。
详细步骤
1. 数据准备
确保两个序列都已按时间戳从小到大排序。
- Camera List: [(tc1,img1),(tc2,img2),...]
- Odom List: [(to1,pose1),(to2,pose2),...]
2. 时间对齐与搜索
遍历相机数据序列。对于每一帧相机图像(时间戳 tc):
- 在里程计序列中找到刚好小于 tc 的帧 Oi (时间戳 to_prev)。
- 找到刚好大于 tc 的帧 Oi+1 (时间戳 to_next)。
- 如果 tc 超出了里程计的时间范围(比如比第一个里程计早,或比最后一个晚),通常选择丢弃该帧图像,或者使用外推法(不推荐,误差大)。
3. 计算插值系数 α
计算相机时间在两个里程计时间之间的比例:
α=to_next−to_prevtc−to_prev
其中 α∈[0,1]。
4. 执行插值
- 位置 P:
Psync=(1−α)⋅Pprev+α⋅Pnext
- 旋转 Q (四元数):
使用 Slerp 算法。
Qsync=Slerp(Qprev,Qnext,α)
benchmark
EVO (轨迹评估工具):
* 为了评估轨迹精度(比如对比 Ground Truth 和 算法输出),可以直接使用 evo 工具包。
* 命令:evo_ape tum data.tum --t_max_diff 0.01。
* 注意:Evo 也是做关联(Association),主要用于对齐两条轨迹,而不是为了给相机帧“造”数据。
总结
,以相机时间戳为基准,对里程计进行线性位置插值和 Slerp 旋转插值。
本文作者:James
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!