diff --git a/corelib/include/rtabmap/core/OdometryViso2.h b/corelib/include/rtabmap/core/OdometryViso2.h index d1409da7..47e194e7 100644 --- a/corelib/include/rtabmap/core/OdometryViso2.h +++ b/corelib/include/rtabmap/core/OdometryViso2.h @@ -54,6 +54,7 @@ private: bool lost_; bool keep_reference_frame_; Transform reference_motion_; + Transform previousLocalTransform_; ParametersMap viso2Parameters_; }; diff --git a/corelib/src/OdometryViso2.cpp b/corelib/src/OdometryViso2.cpp index 45dad38d..ce8dfaf0 100644 --- a/corelib/src/OdometryViso2.cpp +++ b/corelib/src/OdometryViso2.cpp @@ -86,6 +86,7 @@ void OdometryViso2::reset(const Transform & initialPose) } lost_ = false; reference_motion_.setIdentity(); + previousLocalTransform_.setNull(); #endif } @@ -253,10 +254,19 @@ Transform OdometryViso2::computeTransform( } } - if(!t.isNull() && !t.isIdentity() && !data.stereoCameraModel().localTransform().isIdentity() && !data.stereoCameraModel().localTransform().isNull()) + const Transform & localTransform = data.stereoCameraModel().localTransform(); + if(!t.isNull() && !t.isIdentity() && !localTransform.isIdentity() && !localTransform.isNull()) { // from camera frame to base frame - t = data.stereoCameraModel().localTransform() * t * data.stereoCameraModel().localTransform().inverse(); + if(!previousLocalTransform_.isNull()) + { + t = previousLocalTransform_ * t * localTransform.inverse(); + } + else + { + t = localTransform * t * localTransform.inverse(); + } + previousLocalTransform_ = localTransform; } if(info)