[IGSTK-Developers] Bug in igstkTracker with calibration transform
Julien Jomier
jjomier at cs.unc.edu
Tue Dec 20 11:03:50 EST 2005
Hi David,
Thanks for the explanation. I think I understand the way it works and I
agree with the design but I think the implementation is wrong.
Let me try to explain.
From the documentation:
T ' = P * R^-1 * T * C
where:
" T " is the original tool transform reported by the device,
" R^-1 " is the inverse of the transform for the reference tool,
" P " is the Patient transform (it specifies the position of
the reference with respect to patient coordinates), and
" T ' " is the transformation that is reported to the spatial objects
" C " is the tool calibration transform.
So we are interested by this part of the equation here:
T*C = RotationT * (RotationC+TranslationC)+ TranslationT
T*C = RotationT*RotationC + RotationT*TranslationC + TranslationT (1)
Looking at the code:
// start with ToolCalibrationTransform
rotation = toolCalibrationTransform.GetRotation();
translation = toolCalibrationTransform.GetTranslation();
// transform by the tracker's tool transform
rotation *= transform.GetRotation();
translation = transform.GetRotation().Transform(translation);
translation += transform.GetTranslation();
Which can be written as:
T*C = RotationC*RotationT + RotationT*TranslationC + TranslationT (2)
Therefore, comparing (1) and (2) the rotation is computed in the wrong
order or maybe I'm missing something really obvisous...
And the m_PatientTransform is following the same implementation so might
be wrong as well.
Let me know what you think,
Julien
David Gobbi wrote:
> Hi Julien,
>
> I think that the tool calibration transform code is correct the way it
> is, but note that the
> way the code is written, the tool calibration transform goes from the
> "calibrated tool"
> coordinate system to the "raw tool" coordinate system. This might be
> the opposite of
> what you expect.
>
> There is a very good reason for having the calibration transform go in
> this direction.
> You know how an igstkTransform defines a rotation followed by a
> translation? Since the tool tip is at (0,0,0) in the "calibrated" coord
> system, our "calibration transform"
> applies a rotation about the tool tip, which is at (0,0,0) in the
> calibrated coord system,
> followed by a translation to the "raw" tool tip location.
>
> This means that even if the rotation portion of the calibration
> transformation is incorrect,
> the "tool tip" portion of the calibration will still give the correct
> tool tip location, since the
> rotation part of the calibration occurs around the tool tip position.
> If the calibration
> transform was the other way around, then we would not get this nice
> independence of
> translation from rotation.
>
> If you already had your calibration transformation going in this
> direction, email me and I
> will take a close look at the code to make sure that there is no bug.
>
> - David
>
>
> Julien Jomier wrote:
>
>> Hello,
>>
>> There is an important bug in the igstkTracker class preventing any
>> calibration matrix to be applied correctly.
>>
>> The problem is in the UpdateStatusSuccessProcessing() function.
>>
>> The calibration transform should be applied first (rotation variable)
>> and then the transform from the tracker (transform variable).
>> However the code is as follow:
>>
>> rotation *= transform.GetRotation();
>>
>> whis is in the wrong order and should be:
>>
>> rotation = transform.GetRotation()*rotation;
>>
>> Let me know if I should fix it, or if someone else is currently on the
>> igstkTracker class right now or if I'm missing something...
>>
>> Julien
>> _______________________________________________
>> IGSTK-Developers mailing list
>> IGSTK-Developers at public.kitware.com
>> http://public.kitware.com/cgi-bin/mailman/listinfo/igstk-developers
>>
>
>
>
More information about the IGSTK-Developers
mailing list