ethz-asl / kitti_to_rosbag

Dataset tools for working with the KITTI dataset raw data ( http://www.cvlibs.net/datasets/kitti/raw_data.php ) and converting it to a ROS bag. Also allows a library for direct access to poses, velodyne scans, and images.
248 stars 100 forks source link

Issue with tf Accuracy #5

Closed vkee closed 7 years ago

vkee commented 7 years ago

Hi,

I was able to generate the bag with the raw dataset but I noticed that there are some issues with the tf generated by this tool. It is not consistent with what is in the figure from the paper image

As you can see in a screenshot I made from playing the bag generated of 2011_09_30_drive_0020, the cameras are not in the correct poses. Additionally, it appears that the left and right cameras are flipped, as well as their relative positions (order from left to right is 1, 3, 0, 2 instead of 2, 0, 3, 1). The displacement between the GPS/IMU and the velodyne along the y axis should be 0.32 but it is over a centimeter off while the calibration file was correct). image

Do you have any ideas about this discrepancy?

Thanks!

helenol commented 7 years ago

@vkee thanks so much for pointing this out! I spent the morning looking into it... And here's what I found. You presented 2 issues:

  1. Camera TFs don't match schematic, also don't match the images.
  2. Velodyne to IMU transform doesn't match schematic, differs from what's in the calibration file.

Camera TFs

You're totally right here! The camera transformation was flipped, and the changed are so small with respect to the average distance to the obstacles that I didn't notice this qualitatively.

Here's the before (white is SGM stereo overlay): overlay_kitti_old

Here's the after: overlay_kitti_new

And here's a super crappy screenshot of the TF layout with the fix: new_layout

IMU to Velodyne

This one is correct in my version. There's 2 options here: inverting the transform or not inverting it. If you don't invert it, the velodyne ends up behind the IMU, etc. etc. The reason that the TF is not exactly matching the calibration file is just that: because it's inverted. Why do we need to invert it, since the TF has the IMU as the parent and the velodyne as the child? Because KITTI uses different transformation conventions from ROS: ROS uses passive transformations (the transformation between IMU and Velodyne would be the transformation that would take the coordinate frame of the IMU to the coordinate frame of the velodyne), and KITTI uses active transformations (the transformation that would take points in the IMU coordinate frame to the velodyne coordinate frame). It can be seen that these are inverses of each other. If you look at the calibration data from calib_imu_to_velo.txt you will also see this: the rotation is (almost) identity but the transformation is -0.8 0.3 -0.8. If you compare that to what you see in the photo, clearly this needs to be inverted if you consider passive transformations; the IMU is below the velodyne, etc.

So the IMU and velodyne is already correct, as far as I can tell. And the passive-vs-active confusion was exactly the same issue that caused the cam reversal... So again, thanks for catching that!

Cheers, Helen

vkee commented 7 years ago

Thanks for explaining and fixing it so fast, I was so confused what was happening!