matrix - 如何从里程计/tf 数据中获取投影矩阵?

标签 matrix camera dataset ros projection-matrix

我想将我的视觉里程计结果与 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



但我不知道如何为我生成相同类型的数据。
在我的情况下,我对每一帧都有什么:
  • 从 init_camera(来自 (0,0,0) 的固定摄像机)到正在移动的左侧摄像机的 Tf 转换。所以我有平移向量和四元数旋转。
  • 里程计数据:姿势和扭曲
  • 相机标定参数

  • 有了这些数据,我如何与真实情况进行比较?所以我需要从上面的数据中找到投影矩阵,但不知道如何去做。

    在大图中,我想获得一个投影矩阵或知道如何分解由地面实况提供的投影矩阵,以便将转换与我的数据进行比较。

    有人能帮我吗 ?

    谢谢

    最佳答案

    您确定要投影矩阵吗?相机投影矩阵通常是一个 3x4 矩阵,它将 R3 中的(同质)点投影到图像平面中 R2 中的(同质)点,达到一定比例(参见 wikipedia entry)。听起来您有兴趣将计算出的视觉里程计与 KITTI 网站上提供的地面实况里程计进行比较;在这种情况下,您将比较来自 VO 估计的刚性变换矩阵与 KITTI 地面实况变换。

    如果您使用“原始”数据集,则“地面实况”作为 OXTS 数据记录提供 - 即组合的 IMU 和 GPS 数据。此数据位于全局框架中,需要做更多的工作才能与您的数据进行比较。但是,听起来您正在使用里程计基准数据;地面实况转换已经在左相机的框架中,这应该会使任务更容易一些(这就是我将要讨论的)。

    由于您还没有指定一种语言,我将在这里更一般地说,但 ROS 确实提供了 C++(tf 和 Eigen)和 Python(transformations.py)中的工具来执行诸如从四元数转换为旋转矩阵之类的任务......

    您有 tq ,平移和旋转表示为四元数。您可以将四元数转换为旋转矩阵(通常为 '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 个地面实况姿势的误差。有时,比较帧与帧之间的平均误差也很有用,特别是因为里程计倾向于随时间显着漂移,即使算法在帧之间平均相对准确。

    总之:

  • 将旋转矩阵转换为四元数以计算角度误差(注意坐标系),
  • 并使用公式 ||t - tgt||计算翻译误差。
  • 再次注意你的坐标系。
  • 关于matrix - 如何从里程计/tf 数据中获取投影矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693838/

    相关文章:

    c# - 从 DataSet 中获取列的所有值

    Delphi - 在运行时动态添加所有字段在数据集中生成重复项

    image-processing - 相机标定和图像处理

    c++ - opengl矩阵乘法

    matlab - 如何将函数应用于 MATLAB 中矩阵的每一行/列?

    r - 如何更改 R 中的矩阵列类型

    android - 小米5 'It seems that your device does not support camera(or it is locked) Application will be closed'问题

    c - memcpy 取虚拟地址还是物理地址?

    c# - Telerik GridView : How to refresh grid view after Database change

    matlab - 为什么matlab中的a^Inf返回0矩阵?