Skip to content

Latest commit

 

History

History
22 lines (18 loc) · 2.03 KB

issue.md

File metadata and controls

22 lines (18 loc) · 2.03 KB

Issues of generating ground truth poses in former repos

In preprocess/generate_kitti_pairs.py, we follow FCGF, PREDATOR, CoFiNet, SuperGlue, and GeoTransformer to refine the ground truth relative poses using ICP. However, we find a same issue occurred in these repos, which may originates from FCGF.

Take FCGF as example. When generating ground truth pairs, it follows (line 456-467 in lib/data_loaders.py):

M = (self.velo2cam @ positions[0].T @ np.linalg.inv(positions[1].T)
             @ np.linalg.inv(self.velo2cam)).T
xyz0_t = self.apply_transform(xyz0[sel0], M)
pcd0 = make_open3d_point_cloud(xyz0_t)
pcd1 = make_open3d_point_cloud(xyz1[sel1])
reg = o3d.pipelines.registration.registration_icp(
pcd0, pcd1, 0.2, np.eye(4),
o3d.pipelines.registration.TransformationEstimationPointToPoint(),
o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=200))
pcd0.transform(reg.transformation)
# pcd0.transform(M2) or self.apply_transform(xyz0, M2)
M2 = M @ reg.transformation

The above code first calculates the relative pose M from scan xyz1 to scan xyz0 using ground truth poses. Due to issues with the ground truth poses in KITTI, there can be significant drift between xyz1 and transformed xyz0_t, where xyz0_t is transformed xyz0 using M. It then calculates the pose drift reg.transformation from scan xyz0_t to scan xyz1 using ICP. We denote M as T_0t_to_0 referring to the transformation from scan xyz0_t to scan xyz0, and reg.transformation as T_1_to_0t referring to the transformation from scan xyz0_t to scan xyz1. The refined pose M2 should be T_1_to_0 = T_1_to_0t * T_0t_to_0, or reg.transformation @ M. We have corrected this issue in our ground truth generation process.