如何从odometry / tf数据中获取投影矩阵?

时间:2015-04-17 08:15:54

标签: matrix camera dataset ros projection-matrix

我想将我的视觉测距结果与KITTI数据集提供的groundtruth进行比较。 对于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

以下是自述文件提供的说明:

  

第i行代表第i个姿势   左相机坐标系(即z   通过3x4指向前方)   变换矩阵。矩阵   以行对齐的顺序存储(   第一个条目对应第一个条目   ()),并在第一点采取一点   坐标系并将其投影到   第一个(= 0)坐标系。   因此,翻译部分(3x1   第4列的向量对应于   左相机坐标的姿势   系统在第i帧中尊重   到第一个(= 0)帧

但我不知道如何为我生成相同类型的数据。 在我的案例中,我对每一帧都有什么:

  • 从init_camera(从(0,0,0)修复一个)到正在移动的左镜头的Tf转换。所以我有翻译向量和四元数旋转。
  • 测距数据:姿势和扭曲
  • 相机校准参数

根据这些数据,我如何与groundtruth比较?所以我需要从上面的数据中找到投影矩阵,但不知道该怎么做。

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

有人可以帮助我吗?

感谢

2 个答案:

答案 0 :(得分:2)

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

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

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

您有tq,翻译和轮播表示为四元数。您可以将四元数转换为旋转矩阵(通常为'sxyz'形式),反之亦然。 KITTI数据被指定为3x4矩阵,这是与平移向量连接的旋转矩阵(即第4列是t gt )。

r 11 r 12 r 13 t 1
r 21 r 22 r 23 t 2
r 31 r 32 r 33 t 3

您可以通过计算L2范数简单地计算转换误差:|| t - t gt ||。计算旋转误差有点困难;一种方法是使用来自Eigen的QuaternionBase::angularDistance()函数,因为两个测量应该在同一坐标系中。为此,您需要使用Eigen或transformations.py库将地面实况旋转矩阵转换为四元数。

请记住,这是里程表框架中的错误 - 即第i个估计姿势相对于初始姿势框架中第i个地面实况姿势的误差。有时,同样地比较帧与帧的平均误差也是有用的,特别是因为即使算法在帧之间平均相对准确,测距也会随着时间的推移而显着漂移。

总结:

  • 将旋转矩阵转换为四元数以计算角度误差(注意坐标框架),
  • 并使用公式|| t - t gt ||计算翻译错误。
  • 再次注意你的坐标框架。

答案 1 :(得分:0)

我对计算机视觉不太实用,但请查看sensor_msgs/CameraInfo Messageimage_geometry::PinholeCameraModel Class参考。

它应该是这样的:

void imageCallback([...], const sensor_msgs::CameraInfoConstPtr& info_msg) {
  // initialize cam_model with sensor_msgs::CameraInfo
  image_geometry::PinholeCameraModel cam_model_;
  cam_model_.fromCameraInfo(info_msg);

  // get the projection matrix
  cv::Matx34d projection_matrix;
  projection_matrix = cam_model_.projectionMatrix();
}