我想将我的视觉里程计结果与 KITTI 数据集提供的地面实况进行比较。
对于groundthruth 中的每一帧,我都有一个投影矩阵。
例如:
1.000000e+00 9.043683e-12 2.326809e-11 1.110223e-16 9.043683e-12 1.000000e+00 2.392370e-10 2.220446e-16 2.326810e-11 2.392370e-10 9.999999e-01 -2.220446e-16
这里是自述文件提供的说明:
Row i represents the i'th pose of the left camera coordinate system (i.e., z pointing forwards) via a 3x4 transformation matrix. The matrices are stored in row aligned order (the first entries correspond to the first row), and take a point in the i'th coordinate system and project it into the first (=0th) coordinate system. Hence, the translational part (3x1 vector of column 4) corresponds to the pose of the left camera coordinate system in the i'th frame with respect to the first (=0th) frame
但我不知道如何为我生成相同类型的数据。
在我的情况下,我对每一帧都有什么:
有了这些数据,我如何与真实情况进行比较?所以我需要从上面的数据中找到投影矩阵,但不知道如何去做。
在大图中,我想获得一个投影矩阵或知道如何分解由地面实况提供的投影矩阵,以便将转换与我的数据进行比较。
有人能帮我吗 ?
谢谢
最佳答案
您确定要投影矩阵吗?相机投影矩阵通常是一个 3x4 矩阵,它将 R3 中的(同质)点投影到图像平面中 R2 中的(同质)点,达到一定比例(参见 wikipedia entry)。听起来您有兴趣将计算出的视觉里程计与 KITTI 网站上提供的地面实况里程计进行比较;在这种情况下,您将比较来自 VO 估计的刚性变换矩阵与 KITTI 地面实况变换。
如果您使用“原始”数据集,则“地面实况”作为 OXTS 数据记录提供 - 即组合的 IMU 和 GPS 数据。此数据位于全局框架中,需要做更多的工作才能与您的数据进行比较。但是,听起来您正在使用里程计基准数据;地面实况转换已经在左相机的框架中,这应该会使任务更容易一些(这就是我将要讨论的)。
由于您还没有指定一种语言,我将在这里更一般地说,但 ROS 确实提供了 C++(tf 和 Eigen)和 Python(transformations.py)中的工具来执行诸如从四元数转换为旋转矩阵之类的任务......
您有 t
和 q
,平移和旋转表示为四元数。您可以将四元数转换为旋转矩阵(通常为 'sxyz' 形式),反之亦然。 KITTI 数据指定为 3x4 矩阵,这是与平移向量连接的旋转矩阵(即第 4 列是 tgt)。
r11 r12 r13 t1
r21 r22 r23 t2
r31 r32 r33 t3
您可以通过计算 L2 范数来简单地计算翻译误差:||t - tgt||。计算旋转误差有点困难;一种方法是使用诸如 QuaternionBase::angularDistance()
之类的函数。来自 Eigen,因为两个测量值都应该在同一个坐标系中。为此,您需要使用 Eigen 或transformations.py 库将ground truth 旋转矩阵转换为四元数。
请记住,这是里程计帧中的误差 - 即您的第 i 个估计姿势相对于初始姿势帧中第 i 个地面实况姿势的误差。有时,比较帧与帧之间的平均误差也很有用,特别是因为里程计倾向于随时间显着漂移,即使算法在帧之间平均相对准确。
总之:
关于matrix - 如何从里程计/tf 数据中获取投影矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693838/