Exp_mat.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef EXP_MAT_H
  2. #define EXP_MAT_H
  3. #include <math.h>
  4. #include <Eigen/Core>
  5. #include <opencv2/core.hpp>
  6. // #include <common_lib.h>
  7. #define SKEW_SYM_MATRX(v) 0.0,-v[2],v[1],v[2],0.0,-v[0],-v[1],v[0],0.0
  8. template<typename T>
  9. Eigen::Matrix<T, 3, 3> Exp(const Eigen::Matrix<T, 3, 1> &&ang)
  10. {
  11. T ang_norm = ang.norm();
  12. Eigen::Matrix<T, 3, 3> Eye3 = Eigen::Matrix<T, 3, 3>::Identity();
  13. if (ang_norm > 0.0000001)
  14. {
  15. Eigen::Matrix<T, 3, 1> r_axis = ang / ang_norm;
  16. Eigen::Matrix<T, 3, 3> K;
  17. K << SKEW_SYM_MATRX(r_axis);
  18. /// Roderigous Tranformation
  19. return Eye3 + std::sin(ang_norm) * K + (1.0 - std::cos(ang_norm)) * K * K;
  20. }
  21. else
  22. {
  23. return Eye3;
  24. }
  25. }
  26. template<typename T, typename Ts>
  27. Eigen::Matrix<T, 3, 3> Exp(const Eigen::Matrix<T, 3, 1> &ang_vel, const Ts &dt)
  28. {
  29. T ang_vel_norm = ang_vel.norm();
  30. Eigen::Matrix<T, 3, 3> Eye3 = Eigen::Matrix<T, 3, 3>::Identity();
  31. if (ang_vel_norm > 0.0000001)
  32. {
  33. Eigen::Matrix<T, 3, 1> r_axis = ang_vel / ang_vel_norm;
  34. Eigen::Matrix<T, 3, 3> K;
  35. K << SKEW_SYM_MATRX(r_axis);
  36. T r_ang = ang_vel_norm * dt;
  37. /// Roderigous Tranformation
  38. return Eye3 + std::sin(r_ang) * K + (1.0 - std::cos(r_ang)) * K * K;
  39. }
  40. else
  41. {
  42. return Eye3;
  43. }
  44. }
  45. template<typename T>
  46. Eigen::Matrix<T, 3, 3> Exp(const T &v1, const T &v2, const T &v3)
  47. {
  48. T &&norm = sqrt(v1 * v1 + v2 * v2 + v3 * v3);
  49. Eigen::Matrix<T, 3, 3> Eye3 = Eigen::Matrix<T, 3, 3>::Identity();
  50. if (norm > 0.00001)
  51. {
  52. T r_ang[3] = {v1 / norm, v2 / norm, v3 / norm};
  53. Eigen::Matrix<T, 3, 3> K;
  54. K << SKEW_SYM_MATRX(r_ang);
  55. /// Roderigous Tranformation
  56. return Eye3 + std::sin(norm) * K + (1.0 - std::cos(norm)) * K * K;
  57. }
  58. else
  59. {
  60. return Eye3;
  61. }
  62. }
  63. /* Logrithm of a Rotation Matrix */
  64. template<typename T>
  65. Eigen::Matrix<T,3,1> Log(const Eigen::Matrix<T, 3, 3> &R)
  66. {
  67. T &&theta = std::acos(0.5 * (R.trace() - 1));
  68. Eigen::Matrix<T,3,1> K(R(2,1) - R(1,2), R(0,2) - R(2,0), R(1,0) - R(0,1));
  69. return (std::abs(theta) < 0.001) ? (0.5 * K) : (0.5 * theta / std::sin(theta) * K);
  70. }
  71. // template<typename T>
  72. // cv::Mat Exp(const T &v1, const T &v2, const T &v3)
  73. // {
  74. // T norm = sqrt(v1 * v1 + v2 * v2 + v3 * v3);
  75. // cv::Mat Eye3 = cv::Mat::eye(3, 3, CV_32F);
  76. // if (norm > 0.0000001)
  77. // {
  78. // T r_ang[3] = {v1 / norm, v2 / norm, v3 / norm};
  79. // cv::Mat K = (cv::Mat_<T>(3,3) << SKEW_SYM_MATRX(r_ang));
  80. // /// Roderigous Tranformation
  81. // return Eye3 + std::sin(norm) * K + (1.0 - std::cos(norm)) * K * K;
  82. // }
  83. // else
  84. // {
  85. // return Eye3;
  86. // }
  87. // }
  88. #endif