[IGSTK-Developers] Bug in igstkTracker with calibration transform
David Gobbi
dgobbi at atamai.com
Tue Dec 20 14:02:14 EST 2005
Hi Julian,
I agree, changing the CylinderObject as you suggest is the best solution.
I don't like using the Tool CalibrationTransform to put the tip at (0,
h/2, 0),
even as a quick fix.
- David
Julien Jomier wrote:
> Ok, I think everything is working well now :)
>
> > Julien, what do you think of adding a protected method to
> > igstkSpatialObject
> > to allow subclasses to adjust the position/orientation of the object?
>
> I don't really like the idea of modifying the internal object because
> we don't really have to. Basically the CalibrationToolTransform
> defines where the tracker his w.r.t to the origin of the object so you
> don't have to add an offset somewhere else.
>
> I've started an application using IGSTK and the ultrasound probe
> tracking and I've used the CylinderObject without any issues.
>
> Patrick, can you tell me which transform your are optimizing when you
> do your registration? From what I've seen during the demo, the tool is
> already calibrated so the CalibrationTransform should be set to
> identity and you are optimizing the PatientTransform, which is
> correct. However if you are using the CylinderSpatialObject you know
> that the tip of the needle will be roughly h/2 (with h the height of
> the needle) so you have to set the CalibrationTransform accordingly.
>
> That said, I think we should define a common coordinate frame for all
> igstk objects. Meaning that by default the tip of the object will be
> at (0,0,0) and the main orientation will be along the Z-Axis. What do
> you think about changing the CylinderObject to follow this assumption?
>
> Julien
>
> David Gobbi wrote:
>
>> Hi Patrick,
>>
>> It goes to show that I need to spend more time in the lab working
>> with the
>> tracking systems, to make sure that my code works the way it should.
>>
>> At the T-con me an Luis talked about applying translations directly to
>> the spatial object, and we agreed that the safe way to do what you want
>> is to write a new spatial object class that places the origin at the
>> end of the
>> cylinder instead of at the center, and that orients the cylinder
>> along the
>> right axis.
>>
>> Julien, what do you think of adding a protected method to
>> igstkSpatialObject
>> to allow subclasses to adjust the position/orientation of the
>> object? I notice
>> that itkSpatialObject has an IndexToWorldTransform and an
>> ObjectToParentTransform, but I'm not sure what they are meant for.
>>
>> - David
>>
>>
>> Patrick Cheng wrote:
>>
>>> It seems that we have reached a nice agreement here.
>>> To avoid the mis-calculation, we should offer that Transform
>>> concatenation.
>>>
>>> I will go ahead to see if the orientation will look right or not.
>>>
>>> We still need to think about where to put the offset of the
>>> SpatialObject's origin though.
>>>
>>> Patrick
>>>
>>> David Gobbi wrote:
>>>
>>>> Hi Julien,
>>>>
>>>> I agree with you. It certainly does look like the right-left
>>>> ordering of the
>>>> rotation multiplication is wrong. I have identified four places in
>>>> the code
>>>> where a fix is needed, the fix is always as follows:
>>>>
>>>> rotation *= transform.GetRotation(); // WRONG
>>>> rotation = transform.GetRotation()*rotation; // CORRECT
>>>>
>>>> Go ahead and commit the fix.
>>>>
>>>> To avoid this kind of thing in the future, we need a method to
>>>> concatenate
>>>> our igstkTransforms:
>>>>
>>>> /** Set this transform to the concatenation of the two given
>>>> transforms:
>>>> * If you have two transforms and you wish to concatenate them, then
>>>> * t1->Concatenate(t2,t1) implies t1 = t2*t1
>>>> void Transform::Concatenate(const Transform *t1, const Transform
>>>> *t2);
>>>>
>>>> If this makes sense, I can add it to igstkTransform.
>>>>
>>>> - David
>>>>
>>>>
>>>> Julien Jomier wrote:
>>>>
>>>>> 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
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> 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