Sophus



About

Explanations and code snippets illustrating how to do things in Sophus.


Construction

# Translation Only
Sophus::SE3f(Eigen::Matrix3f::Identity(), Eigen::Vector3f(-0.2f, 0.0f, +0.5f));
# Rotation Matrix
Eigen::Matrix3f R =(Eigen::AngleAxis<float> (static_cast<float> ( 0.0f/180.0f*3.141592f), Eigen::Vector3f::UnitZ ()) *   
                      Eigen::AngleAxis<float> (static_cast<float> ( 0.0f/180.0f*3.141592f), Eigen::Vector3f::UnitY ()) *
                      Eigen::AngleAxis<float> (static_cast<float> ( 0.0f/180.0f*3.141592f), Eigen::Vector3f::UnitX ()) ).matrix();
Sophus::SE3f T = Sophus::SE3f( R, Eigen::Vector3f(-0.2f, 0.0f, +0.5f) );
 
# Quaternion
Sophus::SE3f( Eigen::Quaternionf(0.970296,-0.000085, -0.241922,  0.000021 ), Eigen::Vector3f(-0.105954, 0.049990, -0.056345) );
 
# Two Vector Rotation + Translation
Eigen::Quaternionf orientation = Eigen::Quaternionf::FromTwoVectors(Eigen::Vector3f::UnitX(), new_x_axis);
Eigen::Vector3f translation = transform_pair.first.inverse().translation();
Sophus::SE3f pose(orientation, translation);

Angles

Angle of Rotation About the Rotational Axis
# pose is of type Sophus::SE3f
Eigen::Matrix<float,3,1> axis_angle = pose.so3().log();
double angle = axis_angle.norm();


Angular Difference
 float angular_difference_from_last = T_last.unit_quaternion().angularDistance( T_current.unit_quaternion() );