文章同步更新到github pages,欢迎收藏

文章目录

  • 问题描述
  • 数学关系
  • 求解方法
    • 求解$_{gp}^{gv}T$
    • 求解$_{lp}^{lv}T$
    • 交替迭代优化
  • 时间戳对齐
  • 实验结果
  • 参考文献

问题描述

SLAM中常常碰到对齐(align)两个不同设备采集的轨迹的问题。比如通过VICON跟踪获得了一组轨迹,手机通过SLAM算法也获得一组轨迹,要评估SLAM算法的精度,就需要将手机获得的轨迹与作为真值的VICON轨迹对齐。

数学关系

设lpgpT_{lp}^{gp}Tlpgp​T代表手机(phone)从当前局部坐标系(local)到SLAM算法定义的世界坐标系(global)的变换,即当前手机在SLAM算法定义的世界坐标系下的位姿。

设lvgvT_{lv}^{gv}Tlvgv​T代表从VICON的当前刚体坐标系到VICON定义的世界坐标系的变换,即VICON跟踪的刚体在VICON世界坐标系下的位姿。

设gpgvT_{gp}^{gv}Tgpgv​T代表两个世界坐标系之间的变换

设lplvT_{lp}^{lv}Tlplv​T代表当前刚体坐标系与手机坐标系之间的变换

这几个变换满足:
gpgvT∗lpgpT=lvgvT∗lplvT_{gp}^{gv}T\ *\ _{lp}^{gp}T\ =\ _{lv}^{gv}T\ *\ _{lp}^{lv}T gpgv​T ∗ lpgp​T = lvgv​T ∗ lplv​T

其中lpgpT_{lp}^{gp}Tlpgp​T和lvgvT_{lv}^{gv}Tlvgv​T均是已知量,多个lpgpT_{lp}^{gp}Tlpgp​T和lvgvT_{lv}^{gv}Tlvgv​T各自构成了两条运动轨迹,轨迹中的每一帧记为lpgpTi_{lp}^{gp}T_ilpgp​Ti​和lvgvTj_{lv}^{gv}T_jlvgv​Tj​。gpgvT_{gp}^{gv}Tgpgv​T和lplvT_{lp}^{lv}Tlplv​T是待求解的未知量。如果手机与VICON刚体是刚性连接的,在整个运动过程中,gpgvT_{gp}^{gv}Tgpgv​T和lplvT_{lp}^{lv}Tlplv​T的值是定值。

求解方法

优化的目标函数为:
min⁡gpgvT,lplvT∑i∥gpgvT∗lpgpTi−lvgvTj(i)∗lplvT∥F2\min_{_{gp}^{gv}T,\ _{lp}^{lv}T} \sum_{i}\Vert\ _{gp}^{gv}T\ *\ _{lp}^{gp}T_i\ -\ _{lv}^{gv}T_{j(i)}\ *\ _{lp}^{lv}T\ \Vert_F^2 gpgv​T, lplv​Tmin​i∑​∥ gpgv​T ∗ lpgp​Ti​ − lvgv​Tj(i)​ ∗ lplv​T ∥F2​
其中lvgvTj(i)_{lv}^{gv}T_{j(i)}lvgv​Tj(i)​表示在时间戳上与lpgpTi_{lp}^{gp}T_ilpgp​Ti​对应的某一帧。

上式不好直接优化,原因在于

  1. 自由度过大,如果旋转用四元数表示,上式要同时优化12个自由量。
  2. 约束不足,存在奇异解,比如gpgvT_{gp}^{gv}Tgpgv​T和lplvT_{lp}^{lv}Tlplv​T均为零,显然是上式的一个极小解。

因此考虑分部优化。

求解gpgvT_{gp}^{gv}Tgpgv​T

首先假定lplvT_{lp}^{lv}Tlplv​T已知,只求解gpgvT_{gp}^{gv}Tgpgv​T,相当于是寻找一个刚体变换将已知轨迹lpgpT_{lp}^{gp}Tlpgp​T变换为另一个已知轨迹lvgvT∗lplvT_{lv}^{gv}T\ *\ _{lp}^{lv}Tlvgv​T ∗ lplv​T,并满足最小二乘。这类问题有一个高效的线性解法。

设lvgvT∗lplvT=lpgpT_{lv}^{gv}T\ *\ _{lp}^{lv}T\ =\ _{lp}^{gp}Tlvgv​T ∗ lplv​T = lpgp​T,两条轨迹的translation部分分别为lpgpt_{lp}^{gp}tlpgp​t和lpgvt_{lp}^{gv}tlpgv​t,将轨迹中的所有translation求均值得到质心lpgptˉ_{lp}^{gp}\bar{t}lpgp​tˉ和lpgvtˉ_{lp}^{gv}\bar{t}lpgv​tˉ,然后减去质心,得到中心化后的轨迹
Δlpgpti=lpgpti−lpgptˉΔlpgvtj=lpgvtj−lpgvtˉ\begin{aligned} \Delta_{lp}^{gp}t_i&=\ _{lp}^{gp}t_i -\ _{lp}^{gp}\bar{t} \\ \Delta_{lp}^{gv}t_j&=\ _{lp}^{gv}t_j -\ _{lp}^{gv}\bar{t} \end{aligned} Δlpgp​ti​Δlpgv​tj​​= lpgp​ti​− lpgp​tˉ= lpgv​tj​− lpgv​tˉ​

之后计算两条中心化轨迹中所有translation的协方差矩阵,即
S=1n∑inΔlpgpti∗Δlpgvtj(i)TS=\frac{1}{n}\sum_i^n\Delta_{lp}^{gp}t_i\ *\ \Delta_{lp}^{gv}t_{j(i)}^T S=n1​i∑n​Δlpgp​ti​ ∗ Δlpgv​tj(i)T​
对协方差矩阵做奇异值分解:
S=UΣVTS=U\Sigma V^T S=UΣVT
则两条轨迹之间的旋转和位移分别为(证明见参考文献[1]):
gpgvR=VUTgpgvt=lpgvtˉ−gpgvR∗lpgptˉ\begin{aligned} _{gp}^{gv}R &= VU^T \\ _{gp}^{gv}t &=\ _{lp}^{gv}\bar{t} - ~_{gp}^{gv}R\ *\ _{lp}^{gp}\bar{t} \end{aligned} gpgv​Rgpgv​t​=VUT= lpgv​tˉ− gpgv​R ∗ lpgp​tˉ​
若det(VUT)=−1det(VU^T)=-1det(VUT)=−1,将VVV的最后一列乘以−1-1−1后再用上式计算gpgvR_{gp}^{gv}Rgpgv​R。

求解lplvT_{lp}^{lv}Tlplv​T

通过上面的方法求出gpgvT_{gp}^{gv}Tgpgv​T,将其带回等式,并作为已知量固定,再来单独求解lplvT_{lp}^{lv}Tlplv​T。lplvT_{lp}^{lv}Tlplv​T是右乘量,不能描述为刚体变换。这里提供三种求解方法。

第一种方法,使用数值优化,目标函数与约束如下:
min⁡lplvT∑i∥gpgvT∗lpgpTi−lvgvTj(i)∗lplvT∥F2s.t.∥lplvq∥=1\begin{aligned} &\min_{_{lp}^{lv}T} \sum_{i}\Vert\ _{gp}^{gv}T\ *\ _{lp}^{gp}T_i\ -\ _{lv}^{gv}T_{j(i)}\ *\ _{lp}^{lv}T\ \Vert_F^2 \\ &s.t.\ \ \ \ \Vert\ _{lp}^{lv}q\ \Vert = 1 \end{aligned} ​lplv​Tmin​i∑​∥ gpgv​T ∗ lpgp​Ti​ − lvgv​Tj(i)​ ∗ lplv​T ∥F2​s.t.    ∥ lplv​q ∥=1​
其中,lplvT_{lp}^{lv}Tlplv​T中的旋转量使用四元数表示,并要求四元数的模长为1。 将约束项作为惩罚项合并到目标函数中,可以得到无约束的非线性优化问题:
min⁡lplvT∑i∥gpgvT∗lpgpTi−lvgvTj(i)∗lplvT∥F2+w(∥lplvq∥−1)2\min_{_{lp}^{lv}T} \sum_{i}\Vert\ _{gp}^{gv}T\ *\ _{lp}^{gp}T_i\ -\ _{lv}^{gv}T_{j(i)}\ *\ _{lp}^{lv}T\ \Vert_F^2 + w( \Vert\ _{lp}^{lv}q\ \Vert - 1)^2 lplv​Tmin​i∑​∥ gpgv​T ∗ lpgp​Ti​ − lvgv​Tj(i)​ ∗ lplv​T ∥F2​+w(∥ lplv​q ∥−1)2
我们目前将www设为了轨迹中帧的数目。

第二种方法,可以推导出一种线性解法。设已知量gpgvT∗lpgpTi=lpgvTi_{gp}^{gv}T\ *\ _{lp}^{gp}T_i\ =\ _{lp}^{gv}T_igpgv​T ∗ lpgp​Ti​ = lpgv​Ti​,并将所有的变换矩阵TTT表示为旋转矩阵RRR和位移矢量ttt,由
lpgvTi=lvgvTj(i)∗lplvT_{lp}^{gv}T_i\ =\ _{lv}^{gv}T_{j(i)}\ *\ _{lp}^{lv}T lpgv​Ti​ = lvgv​Tj(i)​ ∗ lplv​T
可得
lplvR=lvgvRj(i)T∗lpgvRilplvt=lvgvRj(i)T∗(lpgvti−lvgvtj(i))\begin{aligned} _{lp}^{lv}R\ &=\ _{lv}^{gv}R^T_{j(i)}\ *\ _{lp}^{gv}R_i \\ _{lp}^{lv}t\ &=\ _{lv}^{gv}R^T_{j(i)}\ *\ (\ _{lp}^{gv}t_i\ -\ _{lv}^{gv}t_{j(i)}\ ) \end{aligned} lplv​R lplv​t ​= lvgv​Rj(i)T​ ∗ lpgv​Ri​= lvgv​Rj(i)T​ ∗ ( lpgv​ti​ − lvgv​tj(i)​ )​
其中,每一对lpgvTi_{lp}^{gv}T_ilpgv​Ti​和lvgvTj(i)_{lv}^{gv}T_{j(i)}lvgv​Tj(i)​均能求出一组lplvR_{lp}^{lv}Rlplv​R和lplvt_{lp}^{lv}tlplv​t。最终的位移矢量lplvt_{lp}^{lv}tlplv​t只需对所有通过上式求得的矢量取平均即可。但是,旋转量由于分布在流形上,要用特殊的方式进行平均。

首先设上式求得的每一个旋转量为lplvRi_{lp}^{lv}R_ilplv​Ri​,将他们全部转换为四元数lplvqi_{lp}^{lv}q_ilplv​qi​,将四元数视为4x1的矢量,构成如下4xN矩阵:
Q=[lplvq1,lplvq2,...,lplvqn]Q=[\ _{lp}^{lv}q_1,\ _{lp}^{lv}q_2,\ ...,\ _{lp}^{lv}q_n\ ] Q=[ lplv​q1​, lplv​q2​, ..., lplv​qn​ ]
然后对4x4矩阵Q∗QTQ*Q^TQ∗QT求特征值和特征向量,平均后的旋转量lplvq_{lp}^{lv}qlplv​q即为最大特征值对应的特征向量(证明见参考文献[2])

第三种方法,将其也转换为刚体变换问题。设已知量gpgvT∗lpgpTi=lpgvTi_{gp}^{gv}T\ *\ _{lp}^{gp}T_i\ =\ _{lp}^{gv}T_igpgv​T ∗ lpgp​Ti​ = lpgv​Ti​,则将原问题中的变换矩阵都求逆后,可得到如下优化问题:
min⁡lvlpT∑i∥gvlpTi−lvlpT∗gvlvTj(i)∥F2\min_{_{lv}^{lp}T} \sum_{i}\Vert\ _{gv}^{lp}T_i\ -\ _{lv}^{lp}T * \ _{gv}^{lv}T_{j(i)}\ \Vert_F^2 lvlp​Tmin​i∑​∥ gvlp​Ti​ − lvlp​T∗ gvlv​Tj(i)​ ∥F2​
然后使用求解gpgvT_{gp}^{gv}Tgpgv​T的方法求出lvlpT_{lv}^{lp}Tlvlp​T,最终有lplvT=lvlpT−1_{lp}^{lv}T~=~_{lv}^{lp}T^{-1}lplv​T = lvlp​T−1。

三种方法在相同的输入与停止条件下,得到的结果基本上是一致的,只存在较小差异。某些输入下,某种方法要略好于其他,而另一种输入下,又可能略逊与其他。

交替迭代优化

求解出lplvT_{lp}^{lv}Tlplv​T后,又可以带回原等式,作为已知量,然后再次求解gpgvT_{gp}^{gv}Tgpgv​T。即不断进行上文的两个求解过程,交替优化gpgvT_{gp}^{gv}Tgpgv​T和lplvT_{lp}^{lv}Tlplv​T,直到两个轨迹的绝对误差不再缩小或小于某个阈值。

这个迭代的开始需要给lplvT_{lp}^{lv}Tlplv​T一个初值,由于VICON刚体与手机Body之间的位置差异不大,因此以单位变换作为初值即可。

时间戳对齐

以上算法求解的关键在于找到两个轨迹的对应帧lpgvTi_{lp}^{gv}T_ilpgv​Ti​和lvgvTj(i)_{lv}^{gv}T_{j(i)}lvgv​Tj(i)​,如果两个设备采集时的时间戳是完全同步的,即j(i)=ij(i)=ij(i)=i,则直接根据时间戳找对应关系即可。但是,实际上大多数设备在时间同步后,任然会有不同长度的时间差,少则几毫秒,多则几秒。为了解决这个问题,在执行上文算法前需要对两个轨迹数据估计时间差,并对齐时间戳。

时间戳和轨迹是离散记录的,无法直接使用优化方法得出时间差。常用方法为将轨迹通过样条插值变为连续曲线,这样就得到了时间和位姿的近似连续量,然后使用非线性优化的方式求时间差,详细可见参考文献[3]。

我们使用了一种搜索算法,实现更简单,计算效率更高,但精度稍低(毫秒级精度)。

首先假设两个轨迹的时间差在±10\pm 10±10秒以内,以某条轨迹作为reference(一般选帧率较高的一个,比如VICON),改变另外一条轨迹的时间戳,减10秒,减9秒,直到加9秒,加10秒,步长为1秒。这样就得到20条修改时间戳后的轨迹,每一条轨迹都和reference通过时间戳找对应帧(时间戳相差最小的帧),然后使用求解gpgvT_{gp}^{gv}Tgpgv​T的算法拟合两条轨迹,并计算绝对误差(只考虑帧之间的位置,不考虑姿态),取误差最小的轨迹对应的时间差,比如说−5-5−5秒。然后在−5±0.1-5\pm 0.1−5±0.1秒的区间内以0.10.10.1秒的步长再次做上述操作。直到以0.0010.0010.001秒作为步长搜索后结束。本质上是一种分层次搜索算法。为了提高搜索精度,还可以在使绝对误差最小的时间差附近拟合一条二次曲线(自变量是时间差,因变量是绝对误差),取二次曲线的最小值处的时间差作为最终结果。

实验结果

使用一条VICON轨迹(true_trajectory)人为添加外参变换和刚体变换后得到另外一条轨迹(fake_trajectory),同时也人为的加入噪声(0.1度的角度随机偏差,1cm的位置随机偏差)、时间差(与原轨迹相差5.421秒),并降采样(帧率为原轨迹的四分之一)。

拟合前

拟合后

两条轨迹高度重合,放大后可以看清彼此

参考文献

  1. Least-Squares Rigid Motion Using SVD
  2. Quaternion Averaging
  3. Unified Temporal and Spatial Calibration for Multi-Sensor Systems

SLAM算法评估中的轨迹拟合与外参求解相关推荐

  1. SLAM论文阅读:M-Loam:具有在线外参校准功能的多LiDAR系统的稳健里程表和建图

    基于loam的多激光雷达slam 论文题目: Robust Odometry and Mapping for Multi-LiDAR Systems with Online Extrinsic Cal ...

  2. SLAM算法评估篇:EVO

      当我们需要评估一个SLAM/VO算法的表现时,可以从时耗.精度多个角度分析,其中对精度的评价是我们最关注的.精度评估依据主要是绝对轨迹误差和相对位姿误差,最早在TUM数据集benchmark中定义 ...

  3. SLAM系统性能评估:绝对轨迹误差(ATE)和相对位姿误差(RPE)

    绝对轨迹误差 直接计算相机位姿的真实值与SLAM系统的估计值之间的差,程序首先根据位姿的时间戳将真实值和估计值进行对齐, 然后计算每对位姿之间的差值, 并最终以图表的形式输出, 该标准非常适合于评估视 ...

  4. 基于神经网络算法的鱼类迁徙轨迹拟合研究

    本试验采用HTI Model 291便携型声学标签接收系统,包括的基本部件有:291便携型声学标签接收器1台,590型水听器4根,最新795型声学标签40枚,490-LP 型标签编程器1台,690系列 ...

  5. 4.从单应矩阵中分离得到内参和外参(需要拍摄n=3张标定图片)

    https://blog.csdn.net/weixin_43206570/article/details/85037869

  6. halcon算法库中各坐标系,位姿的解释及原理

    halcon算法库中各坐标系,位姿的解释及原理 前言 在学习halcon和光学原理的过程中,经常会听到像素坐标系,窗口坐标系,世界坐标系等等,很多时候会一头雾水,这时候一定要仔细甄别,了解其原理,才能 ...

  7. 多传感器融合感知:传感器外参标定及在线标定算法详解

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 后台回复[相机标定]获取超详细的单目双目相机模型介绍.内外参标定 ...

  8. 八种常用激光雷达和视觉SLAM算法的评估与比较

    文章:Evaluation and comparison of eight popular Lidar and Visual SLAM algorithms 作者:Bharath Garigipati ...

  9. SLAM算法中的数据关联问题

    数据关联一直是SLAM实际应用中一个非常重要的问题.在将数据融入到地图中前,新的测量与地图中已存在的地标的关联,在融合后,这些关联不能被修改.这样的问题是单个的错误数据关联可能诱导地图估计的发散,经常 ...

最新文章

  1. java 类型推理_java 11 局部变量类型推断
  2. php jwt token 解析,JSON Web Token(JWT)入坑详解
  3. navicat premium使用教程 Navicat Premium mac的基本使用
  4. android ui机制的学习笔记
  5. 【图像压缩】基于matlab行程编码(RLE)图像压缩【含Matlab源码 404期】
  6. readelf 显示文件完整段表
  7. 【合肥黑马程序员】SpringBoot应用Docker化
  8. ie显示的html页面乱码,IE10、IE11页面中文乱码解决方案
  9. 同济版《线性代数》再遭口诛笔伐,网友:它真的不太行
  10. 【MMD tools for bleander,Bleander的插件】
  11. 手机dpi修改工具_手机dpi修改器
  12. qt 5.15.2 版本安装脱坑指南
  13. react引入antd报错找不到antd/dist/antd.css Module not found: Error: Can‘t resolve ‘antd/dist/antd.css‘ in
  14. web项目406错误的解决
  15. 狂神说 Redis笔记
  16. 欧拉函数与积性函数(互质数)
  17. 快捷方式右键菜单、任务管理器等,使用“打开文件所在位置”出现“该文件没有与之关联的应用来执行该操作”的问题解决方案
  18. android wi-fi_如何在Android上限制计量Wi-Fi网络的背景数据
  19. 編程之美﹣電梯調度算法
  20. Uboot学习笔记①---(文件目录结构、README摘要、uImage的64字节头信息)

热门文章

  1. Ubuntu20.04如何新建.txt文件
  2. “中国IT服务管理论坛”2010年全国巡讲拉开帷幕
  3. Linux下获取WIFI状态信息(c语言)
  4. 如何设置窗口函数中窗口的大小
  5. oracle 修改po税api_PO退回接收API报错,大神来看下
  6. siki Unity - A计划
  7. 魔术之间:自变量与因变量的交互
  8. 讯景XFX战狼 rx560 4G
  9. 蔚来汽车提前批2022年7月13日
  10. 联想台式计算机 恢复出厂设置,联想台式电脑怎么恢復出厂设置