我正在尝试使用KITTI开放数据集进行深单目视觉Odometry我试着使用这个回购
它使用这个代码将姿态转换为6DoF
def 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-6
def 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 allowed
99 T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
# Second format: all poses should be included in the file
T00 T01 T02 T03 T10 T11 T12 T13 T20 T21 T22 T23
您的模型输出是相对位置和旋转的欧拉角,该角度与平移相凹。
要进行评估,您必须:
-
将旋转和平移转换为齐次矩阵4x4->要做到这一点,你必须将你的欧拉角转换为旋转矩阵,然后用平移向量1x3连接旋转矩阵3x3,并在矩阵的末尾附加一行[0,0,0,1],以获得齐次矩阵。
-
将相对位置4x4转换为绝对位置->您在Tk中的绝对位置是相对位置Trel与先前绝对位置Tk-1的点积,其中T是帧索引为k 的齐次矩阵
Tk=Trel@Tk-1
第一个绝对位置取决于您的数据集和您想要做的工作。默认情况下,基本绝对位置是2-D阵列4x4,对角线上有1,其他地方有0(在numpy np.eye(4(中(因此,要转换序列中的整个相对位置,需要相乘基本绝对位置到所有相对位置
Tk5=Trel@Tk4#,其中Trel是帧4和5 之间的相对位置
- 当步骤2完成时,您将拥有包含Tn绝对位置的绝对位置。然后你必须将每个均匀4x4矩阵展平,得到一个有12个元素的向量,并将每个展平的均匀4x4阵写入一个文件中
KITTI是视觉里程计中必须流行的数据集我认为阅读本主题和参考链接可以帮助您:视觉里程计,KITTI数据集