[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Toon-members] SE3: relation of input-translation to output-translation
From: |
Rafael Spring |
Subject: |
[Toon-members] SE3: relation of input-translation to output-translation |
Date: |
Tue, 23 Jun 2009 17:10:02 +0200 |
Hello gentlemen,
I am using TooN for a while now and I really appreciate it. Scope,
usability and speed are really great and I couldn't imagine working
without it.
However, today, I've had some weird behavior and I'm unsure if TooN
is supoosed to behave like that (Btw. I am using TooN beta3) or if my
understanding of SE3s is insufficient. The question boils down to
what happens to an input translation after exponentiating.
Consider the following sourcecode:
----
Vector<3> rotation = makeVector(0.4, 0.6, 0.15); //arbitrary numbers..
Vector<3> translation = makeVector(-1, 0, 0.5); //arbitrary numbers..
Vector<6> mu;
mu.slice(0,3) = translation;
mu.slice(3,3) = rotation;
SE3<> se = SE3<>::exp(mu);
Vector<3> t = se.get_translation();
----
Now, I was expecting:
t == (-1, 0, 0.5)
following the assumption that a euclidean transformation by an SE3
equals to an orthogonal transformation (exp'ing the rotation part of
mu) + a translation.
The true value, however, is:
t == (-0.789750 , -0.19886, 0.734775)
So I reversed my assumption: It could be a translation by t followed
by an orthogonal transform (this would correspond to the translation-
part of mu being the inverse camera translation as seen from camera 1
and get_translation() being the inverse translation as seen from
camera 2). This assumption, however, was neither confirmed:
----
// make a rotation-only SE3
Vector<6> mu_ = mu;
mu_.slice(0,3) = makeVector(0,0,0);
SE3<> se_ = SE3<>::exp(mu_);
// make a translation-only SE3
Vector<6> mu__ = mu;
mu__.slice(3,3) = makeVector(0,0,0);
SE3<> se__ = SE3<>::exp(mu__);
// 1st translate then rotate
Vector3 t_ = (se_ * se__).get_translation();
// t_ == (-0.5293 , -0.412372 , 0.89431)
----
Now to the part beyond my understanding: The second assumption holds
(roughly) if I halve the rotation amount in mu:
----
Vector<6> mu_;
mu_.slice(0,3) = makeVector(0,0,0);
mu_.slice(3,3) = rotation / 2.0;
SE3<> se_ = SE3<>::exp(mu_); //se_ is half the rotation
Vector<6> mu__ = mu;
mu__.slice(3,3) = makeVector(0,0,0);
SE3<> se__ = SE3<>::exp(mu__); //se__ is only translation
Vector3 t__ = (se_ * se__).get_translation(); // 1st translate then
rotate
// t__ == (-0.8024 , -0.19517 , 0.75371)
// t__ is roughly == t
----
Is this within the general logic of SE3 members (am I missing
something?) or might there be something wrong with the SE3 class?
Thanks!
Rafael
- [Toon-members] SE3: relation of input-translation to output-translation,
Rafael Spring <=