Matrix 如何从里程计/tf数据中获取投影矩阵?
我想将我的视觉里程测量结果与KITTI数据集提供的地面真相进行比较。 对于groundthruth中的每一帧,我都有一个投影矩阵。 例如:Matrix 如何从里程计/tf数据中获取投影矩阵?,matrix,camera,dataset,ros,projection-matrix,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 以下是自述文件提供的说明: 第i行代表第i个
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
变换矩阵。矩阵
以行对齐顺序存储(
第一个条目对应于第一个条目
行),并在i'th中取一分
坐标系并将其投影到
第一个(=0)坐标系。
因此,平移部分(3x1
第4)列的向量对应于
左侧摄影机坐标的姿势
第i帧中的系统
到第一(=0)帧
但我不知道如何为我生成相同类型的数据。
我的案例中每一帧的内容:
- 从init_摄像机(从(0,0,0)到正在移动的左摄像机的Tf变换。我有平移向量和四元数旋转
- 里程计数据:姿势和扭曲
- 摄像机标定参数
谢谢我对计算机视觉不是很实用,但请看一看并参考一下 应该是这样的:
void imageCallback([…],常数传感器\u msgs::Cameranforoconstr&info\u msg){
//使用传感器msgs::Cameranfo初始化cam_模型
图像几何:针孔几何模型cam模型;
来自Cameranfo(信息信息)的凸轮模型;
//得到投影矩阵
cv::Matx34d投影矩阵;
投影矩阵=cam模型投影矩阵();
}
您确定要使用投影矩阵吗?相机投影矩阵通常为3x4矩阵,将图像平面中R3中的(同质)点投影到R2中的(同质)点,并达到一定比例(请参见)。听起来你对比较你的计算视觉里程计和KITTI网站上提供的地面真实里程计感兴趣;在本例中,您将比较VO估计中的刚性变换矩阵与KITTI地面真值变换
如果您使用的是“原始”数据集,“地面真相”将作为OXTS数据记录提供,即IMU和GPS组合数据。此数据位于全局框架中,与您的数据相比需要做更多的工作。但是,听起来您使用的是里程计基准数据;地面真相转换已经在左摄像机的框架中,这将使任务变得更容易(这就是我将要讨论的)
因为您没有指定语言,我这里会更一般地说,但是ROS确实提供C++(TF和EGEN)和Python(Trime.Py)中的工具来执行任务,例如从四元数转换为旋转矩阵……/P> 您有
t
和q
,平移和旋转表示为四元数。可以将四元数转换为旋转矩阵(通常为“sxyz”形式),反之亦然。KITTI数据指定为3x4矩阵,这是与平移向量连接的旋转矩阵(即第4列为tgt)
r11 r12 r13 t1r21 r22 r23 t2
r31 r32 r33 t3 您可以通过计算L2范数来简单地计算转换错误:| | t-tgt | |。计算旋转中的误差有点困难;一种方法是使用来自Eigen的函数,例如
QuaternionBase::angularDistance()
,因为两个测量值应该在同一坐标系中。为此,需要使用Eigen或transformations.py库将地面真值旋转矩阵转换为四元数
请记住,这是里程计帧中的错误-即,相对于初始姿势帧中的第i个地面真实姿势,您的第i个估计姿势的错误。有时,比较帧与帧之间的平均误差也很有用,特别是因为里程计往往随时间显著漂移,即使算法在平均帧之间相对准确
总之:
- 将旋转矩阵转换为四元数以计算角度误差(注意坐标系)
- 并使用公式| | t-tgt | |计算平移误差
- 再次注意你的坐标系