为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 KITTI 里程计数据集评估单眼视觉里程计结果

如何使用 KITTI 里程计数据集评估单眼视觉里程计结果

婷婷同学_ 2023-06-06 16:15:35
我正在尝试使用 KITTI 开放数据集来进行深度单眼视觉测距 我尝试使用此repo它使用此代码将姿势转换为 6DoFdef get6DoFPose(self, p):    pos = np.array([p[3], p[7], p[11]])    R = np.array([[p[0], p[1], p[2]], [p[4], p[5], p[6]], [p[8], p[9], p[10]]])    angles = self.rotationMatrixToEulerAngles(R)    return np.concatenate((pos, angles))def isRotationMatrix(self, R):    Rt = np.transpose(R)    shouldBeIdentity = np.dot(Rt, R)    I = np.identity(3, dtype=R.dtype)    n = np.linalg.norm(I - shouldBeIdentity)    return n < 1e-6def rotationMatrixToEulerAngles(self, R):    assert (self.isRotationMatrix(R))    sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])    singular = sy < 1e-6    if not singular:        x = math.atan2(R[2, 1], R[2, 2])        y = math.atan2(-R[2, 0], sy)        z = math.atan2(R[1, 0], R[0, 0])    else:        x = math.atan2(-R[1, 2], R[1, 1])        y = math.atan2(-R[2, 0], sy)        z = 0    return np.array([x, y, z], dtype=np.float32)模型输出也是相同的格式(6DoF)问题是如何评估 6DoF 结果,因为此评估工具 ( kitti-odom-eval ) 仅支持以下两种格式# First format: skipping frames are allowed99 T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23 # Second format: all poses should be included in the fileT00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23 
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您的模型输出是与平移相关的旋转欧拉角的相对位置。

为了进行评估,您必须:

  1. 将您的旋转和平移转换为齐次矩阵 4x4 -> 为此,您必须将欧拉角转换为旋转矩阵,然后将旋转矩阵 3x3 与平移向量 1x3 连接起来,并附加一个额外的行 [0,0,0,1]矩阵得到齐次矩阵。

  2. 将您的相对位置 4x4 转换为绝对位置-> 您在Tk中的绝对位置是相对位置Trel与先前绝对位置Tk-1的点积,其中 T 是帧索引为 k 的齐次矩阵

Tk = Trel @ Tk-1

第一个绝对位置取决于你的数据集和你想做的工作。默认情况下,基本绝对位置是 4x4 二维数组,对角线为 1,其他位置为零(在 numpy np.eye(4) 中)因此,要转换序列中的整个相对位置,您需要将基本绝对位置乘以所有相对位置

Tk5 = Trel @ Tk4 # 其中 Trel 是第 4 帧和第 5 帧之间的相对位置

  1. 当第 2 步完成后,您将拥有包含Tn绝对位置的绝对位置。那么你必须展平每个齐次 4x4 矩阵并得到一个包含 12 个元素的向量,并将每个展平的齐次 4x4 矩阵写入一个文件作为结果!

查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信