So I have a quad with a black-box estimator on it. The black box estimates the pose of the quad. I also have a Vicon system that I'm using to get the ground truth pose of the quad. I'm trying to transform the output from the black-box system into the coordinate frame of the Vicon system so I can compare the two.

I have two series' of points recorded using the whole setup that I am trying to use to compute this transformation (from one world frame to the other world frame).

If you're not familiar, it is possible to compute a transformation between two frames given a set of points in each frame.

I have implemented the method described in the paper Least-Squares Rigid Motion Using SVD

But I'm getting wonky results: X position: Transformation fitted over first 100 data points

If it's not clear, if the transformation were working correctly, the points labeled 'transformed' displayed on the graph below would roughly overlap with those labeled 'Vicon'. As you can see, they only overlap for less than half a second.

Any suggestions? Ideas about what could be wrong?

  • 1
    $\begingroup$ Can you post example data and code? Or just example code? it is hard to tell what might be the problem might be from just the graph $\endgroup$
    – Mark Omo
    Commented May 31, 2017 at 20:15
  • 1
    $\begingroup$ To reiterate what @MarkOmo said: how exactly are you getting those results? Maybe you're only running through the first 0.5 seconds of data. Maybe you're using degrees as though they were radians. The paper read like you should get only one rotation and only one translation, but it looks like you have a scale term also somehow, which is compressing your raw points. Maybe the rotation matrix isn't pure rotation? Point is, without code and numbers, it's a lot of guessing. You can get better answers, and faster, by providing as much (relevant!) information as possible. $\endgroup$
    – Chuck
    Commented Jun 1, 2017 at 3:29

1 Answer 1


Turns out I was transforming before interpolating the data, and my interpolation function assumed that the two streams of data were taken at the same time stamps. A simple mistake. So I was comparing data from different points in time. Consequently, it makes sense that resulting fitted transformation was incorrect.

@Chuck -- The resulting (correct) transform could indeed look like it involves scaling because I am dealing with 3-D data. Above, only a single axis of data is displayed. When rotating a a vector from one frame to another, the magnitude of the x-component may very well change -- what falls along the 'x-axis' depends on the frame definition.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.