MichaelGrupp / evo

Python package for the evaluation of odometry and SLAM
https://michaelgrupp.github.io/evo/
GNU General Public License v3.0
3.41k stars 746 forks source link

KITTI dataset strange rotation results #181

Closed George-Gi closed 5 years ago

George-Gi commented 5 years ago

I would like to ask if anyone can translate the rotation results for the KITTI dataset. I get the following:

all1_rpy_view

Yaw is fine, however I can't understand why pitch and roll get such high values. The thing is that they get these values even in the provided groundtruth data.

MichaelGrupp commented 5 years ago

I'm not sure what you mean exactly, but take into account that the axis is normalized to [-180, 180] degrees. So sign flips can happen when the values are close to 180 degrees.

George-Gi commented 5 years ago

Yes I know that they are normalized, however if pitch is 90 deg as it shows, then the car should point to the sky, also roll has very high values and the car does not do roll at all, am I misunderstanding something?

MichaelGrupp commented 5 years ago

Dunno, which sequence is this?

mnik17 commented 5 years ago

That's sequence 00, I've been having the same issues.

trajectory

rpy

For that plot I've used the ground truth data as provided from KITTI, that means in their camera coordinate system. That's why the plot is rotated. It also means that when the car turns left or right, the change is reflected in the pitch, since the y-axis is pointing to the ground. So because the car obviously moves on a relatively flat road it's obviously not possible for the roll and yaw angles to spike so steeply and not to this extent.

However following the sequnce trajectory, even the pitch is not entirely correct. I sadly don't have the plot right now, but I'll try to explain. The car makes right turn(pitch +90 deg), then a left (0 deg), left (-90 deg), right (0 deg), left (-90 deg). So far it's completely true. Then it makes another two lefts and the pitch goes to 0 and then to 90 degrees, in other words starts turning in the wrong direction.

Interestingly enough while I was trying to transform the ground truth data to the lidar coordinate system I got very interesting results:

rot_xyz rot_rpy

For the transformation I multiplied the poses with two rotational matrices in order to rotate the axes. First of all I rotated by 90 degrees w.r.t. the y-axis and then by -90 degrees w.r.t the x-axis. The rotation matrices that I used: R_y:
0 0 1
0 1 0
-1 0 0

R_x: 1 0 0 0 0 1 0 -1 0

As you can see in the pictures, after the transformation all angles have reasonable metrics (bear in mind they don't correspond exactly to the ones in the first pictures, because of the rotation). However I can't explain why the amplitude were affected when I just rotated the trajectory. They also seem to correspond correctly to the ones I got from ALOAM (the SLAM alogrithm that I used for comparison), however the raw and yaw angles start from -90 deg (although that might be because of the rotation itself, I'm not sure).

And a further question: are the roll, pitch and yaw relevant for the APE, RPE?

MichaelGrupp commented 5 years ago

roll, pitch and yaw relevant for the APE, RPE?

In this code RPY angles are only used for this one plot in evo_traj.

Rotation in general is relevant in APE or RPE depending on your choice of --pose_relation. The math is described briefly here: https://github.com/MichaelGrupp/evo/blob/master/notebooks/metrics.py_API_Documentation.ipynb

MichaelGrupp commented 5 years ago

So it looks like the problem is that the names "roll pitch yaw" interpretation is not what you expect here.

As I said, here I also just use it for this one plot. This is done using a more or less arbitrarily chosen sxyz rotation order by default as specified by the transformations.py module. This might not necessarily be the right order for any case. In the KITTI case of a camera frame mounted on a car, szxy makes probably more sense, then the plot looks like this: image


But: Besides visualization I wouldn't care too much about RPY for anything serious, it's a very weak 3d rotation representation for various reasons.

Roshnee commented 5 years ago

So it looks like the problem is that the names "roll pitch yaw" interpretation is not what you expect here.

As I said, here I also just use it for this one plot. Thi is done using a more or less arbitrarily chosen sxyz rotation order by default as specified by the transformations.py module. This might not necessarily be the right order for any case. In the KITTI case of a camera frame mounted on a car, szxy makes probably more sense, then the plot looks like this: image

Alright!! This makes sense now. Then that has to be changed in the code. I have installed a non-editable version with only executables. Can i install an editable version using pip install --editable . --upgrade --no-binary evo on top of it?

Also is this the same case for ape and rpe?

But: Besides visualization I wouldn't care too much about RPY for anything serious, it's a very weak 3d rotation representation for various reasons.

But the values that it takes and the comparison of results were affected i guess??

MichaelGrupp commented 5 years ago

Can i install an editable version using pip install --editable . --upgrade --no-binary evo on top of it?

It should just replace the installed one.

But the values that it takes and the comparison of results were affected i guess??

Nope. Rotational error calculation is not based on RPY, see the link to the math above or the code.

Roshnee commented 5 years ago

Okay, I will try it. Thank you!!

YznMur commented 1 year ago

Hi @MichaelGrupp @Roshnee I have the same problem with rotation angles for KITTI here. I changed the axis as you mentioned earlier to SZXY but it still doesn't work (the values are not real). cloud you please tell me how did you manage to fix that and where to modify in the code? thanks.

photo_2022-11-29_11-35-05

MichaelGrupp commented 1 year ago

FYI: This was added as a configuration option, no change in the code needed anymore.

evo_config set euler_angle_sequence szxy
evo_config show | grep euler -A2