Merged in fix/ExpmapFunctor (pull request #420)
fix bug in ExpmapFunctor caused by square root of theta2 Approved-by: Frank Dellaert <dellaert@cc.gatech.edu>release/4.3a0
commit
92bb0d71a4
|
|
@ -31,7 +31,6 @@ namespace so3 {
|
|||
void ExpmapFunctor::init(bool nearZeroApprox) {
|
||||
nearZero = nearZeroApprox || (theta2 <= std::numeric_limits<double>::epsilon());
|
||||
if (!nearZero) {
|
||||
theta = std::sqrt(theta2); // rotation angle
|
||||
sin_theta = std::sin(theta);
|
||||
const double s2 = std::sin(theta / 2.0);
|
||||
one_minus_cos = 2.0 * s2 * s2; // numerically better than [1 - cos(theta)]
|
||||
|
|
@ -39,7 +38,7 @@ void ExpmapFunctor::init(bool nearZeroApprox) {
|
|||
}
|
||||
|
||||
ExpmapFunctor::ExpmapFunctor(const Vector3& omega, bool nearZeroApprox)
|
||||
: theta2(omega.dot(omega)) {
|
||||
: theta2(omega.dot(omega)), theta(std::sqrt(theta2)) {
|
||||
const double wx = omega.x(), wy = omega.y(), wz = omega.z();
|
||||
W << 0.0, -wz, +wy, +wz, 0.0, -wx, -wy, +wx, 0.0;
|
||||
init(nearZeroApprox);
|
||||
|
|
@ -50,7 +49,7 @@ ExpmapFunctor::ExpmapFunctor(const Vector3& omega, bool nearZeroApprox)
|
|||
}
|
||||
|
||||
ExpmapFunctor::ExpmapFunctor(const Vector3& axis, double angle, bool nearZeroApprox)
|
||||
: theta2(angle * angle) {
|
||||
: theta2(angle * angle), theta(angle) {
|
||||
const double ax = axis.x(), ay = axis.y(), az = axis.z();
|
||||
K << 0.0, -az, +ay, +az, 0.0, -ax, -ay, +ax, 0.0;
|
||||
W = K * angle;
|
||||
|
|
|
|||
|
|
@ -103,6 +103,20 @@ Rot3 slow_but_correct_Rodrigues(const Vector& w) {
|
|||
return Rot3(R);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( Rot3, AxisAngle)
|
||||
{
|
||||
Vector axis = Vector3(0., 1., 0.); // rotation around Y
|
||||
double angle = 3.14 / 4.0;
|
||||
Rot3 expected(0.707388, 0, 0.706825,
|
||||
0, 1, 0,
|
||||
-0.706825, 0, 0.707388);
|
||||
Rot3 actual = Rot3::AxisAngle(axis, angle);
|
||||
CHECK(assert_equal(expected,actual,1e-5));
|
||||
Rot3 actual2 = Rot3::AxisAngle(axis, angle-2*M_PI);
|
||||
CHECK(assert_equal(expected,actual2,1e-5));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST( Rot3, Rodrigues)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -82,6 +82,34 @@ TEST(SO3, ChartDerivatives) {
|
|||
CHECK_CHART_DERIVATIVES(R2, R1);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
TEST(SO3, Expmap) {
|
||||
Vector axis = Vector3(0., 1., 0.); // rotation around Y
|
||||
double angle = 3.14 / 4.0;
|
||||
Matrix expected(3,3);
|
||||
expected << 0.707388, 0, 0.706825, 0, 1, 0, -0.706825, 0, 0.707388;
|
||||
|
||||
// axis angle version
|
||||
so3::ExpmapFunctor f1(axis, angle);
|
||||
SO3 actual1 = f1.expmap();
|
||||
CHECK(assert_equal(expected, actual1.matrix(), 1e-5));
|
||||
|
||||
// axis angle version, negative angle
|
||||
so3::ExpmapFunctor f2(axis, angle - 2*M_PI);
|
||||
SO3 actual2 = f2.expmap();
|
||||
CHECK(assert_equal(expected, actual2.matrix(), 1e-5));
|
||||
|
||||
// omega version
|
||||
so3::ExpmapFunctor f3(axis * angle);
|
||||
SO3 actual3 = f3.expmap();
|
||||
CHECK(assert_equal(expected, actual3.matrix(), 1e-5));
|
||||
|
||||
// omega version, negative angle
|
||||
so3::ExpmapFunctor f4(axis * (angle - 2*M_PI));
|
||||
SO3 actual4 = f4.expmap();
|
||||
CHECK(assert_equal(expected, actual4.matrix(), 1e-5));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
namespace exmap_derivative {
|
||||
static const Vector3 w(0.1, 0.27, -0.2);
|
||||
|
|
|
|||
Loading…
Reference in New Issue