interpolate.hpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. /// @file
  2. /// Interpolation for Lie groups.
  3. #ifndef SOPHUS_INTERPOLATE_HPP
  4. #define SOPHUS_INTERPOLATE_HPP
  5. #include <Eigen/Eigenvalues>
  6. #include "interpolate_details.hpp"
  7. namespace Sophus {
  8. /// This function interpolates between two Lie group elements ``foo_T_bar``
  9. /// and ``foo_T_baz`` with an interpolation factor of ``alpha`` in [0, 1].
  10. ///
  11. /// It returns a pose ``foo_T_quiz`` with ``quiz`` being a frame between ``bar``
  12. /// and ``baz``. If ``alpha=0`` it returns ``foo_T_bar``. If it is 1, it returns
  13. /// ``foo_T_bar``.
  14. ///
  15. /// (Since interpolation on Lie groups is inverse-invariant, we can equivalently
  16. /// think of the input arguments as being ``bar_T_foo``, ``baz_T_foo`` and the
  17. /// return value being ``quiz_T_foo``.)
  18. ///
  19. /// Precondition: ``p`` must be in [0, 1].
  20. ///
  21. template <class G, class Scalar2 = typename G::Scalar>
  22. enable_if_t<interp_details::Traits<G>::supported, G> interpolate(
  23. G const& foo_T_bar, G const& foo_T_baz, Scalar2 p = Scalar2(0.5f)) {
  24. using Scalar = typename G::Scalar;
  25. Scalar inter_p(p);
  26. SOPHUS_ENSURE(inter_p >= Scalar(0) && inter_p <= Scalar(1),
  27. "p (%) must in [0, 1].");
  28. return foo_T_bar * G::exp(inter_p * (foo_T_bar.inverse() * foo_T_baz).log());
  29. }
  30. } // namespace Sophus
  31. #endif // SOPHUS_INTERPOLATE_HPP