文章同步更新到github pages,欢迎收藏
问题描述
SLAM中常常碰到对齐(align)两个不同设备采集的轨迹的问题。比如通过VICON跟踪获得了一组轨迹,手机通过SLAM算法也获得一组轨迹,要评估SLAM算法的精度,就需要将手机获得的轨迹与作为真值的VICON轨迹对齐。
数学关系
设 l p g p T _{lp}^{gp}T lpgpT代表手机(phone)从当前局部坐标系(local)到SLAM算法定义的世界坐标系(global)的变换,即当前手机在SLAM算法定义的世界坐标系下的位姿。
设 l v g v T _{lv}^{gv}T lvgvT代表从VICON的当前刚体坐标系到VICON定义的世界坐标系的变换,即VICON跟踪的刚体在VICON世界坐标系下的位姿。
设 g p g v T _{gp}^{gv}T gpgvT代表两个世界坐标系之间的变换
设 l p l v T _{lp}^{lv}T lplvT代表当前刚体坐标系与手机坐标系之间的变换
这几个变换满足:
g p g v T ∗ l p g p T = l v g v T ∗ l p l v T _{gp}^{gv}T\ *\ _{lp}^{gp}T\ =\ _{lv}^{gv}T\ *\ _{lp}^{lv}T gpgvT ∗ lpgpT = lvgvT ∗ lplvT
其中 l p g p T _{lp}^{gp}T lpgpT和 l v g v T _{lv}^{gv}T lvgvT均是已知量,多个 l p g p T _{lp}^{gp}T lpgpT和 l v g v T _{lv}^{gv}T lvgvT各自构成了两条运动轨迹,轨迹中的每一帧记为 l p g p T i _{lp}^{gp}T_i lpgpTi和 l v g v T j _{lv}^{gv}T_j lvgvTj。 g p g v T _{gp}^{gv}T gpgvT和 l p l v T _{lp}^{lv}T lplvT是待求解的未知量。如果手机与VICON刚体是刚性连接的,在整个运动过程中, g p g v T _{gp}^{gv}T gpgvT和 l p l v T _{lp}^{lv}T lplvT的值是定值。
求解方法
优化的目标函数为:
min g p g v T , l p l v T ∑ i ∥ g p g v T ∗ l p g p T i − l v g v T j ( i ) ∗ l p l v T ∥ F 2 \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 gpgvT, lplvTmini∑∥ gpgvT ∗ lpgpTi − lvgvTj(i) ∗ lplvT ∥F2
其中 l v g v T j ( i ) _{lv}^{gv}T_{j(i)} lvgvTj(i)表示在时间戳上与 l p g p T i _{lp}^{gp}T_i lpgpTi对应的某一帧。
上式不好直接优化,原因在于
- 自由度过大,如果旋转用四元数表示,上式要同时优化12个自由量。
- 约束不足,存在奇异解,比如 g p g v T _{gp}^{gv}T