common.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #ifndef _COMMON_H_
  2. #define _COMMON_H_
  3. #include <ctime>
  4. #include <chrono>
  5. #include <vector>
  6. #include <cmath>
  7. #include <iostream>
  8. #include <string>
  9. #include <Eigen/Core>
  10. #include <Eigen/Geometry>
  11. #include "space_lib/space_lib.h"
  12. namespace hlzn_slam {
  13. namespace common {
  14. typedef std::chrono::time_point<std::chrono::system_clock> Time;
  15. template <typename T>
  16. T NormalizeAngleDifference(T difference) {
  17. const T kPi = T(M_PI);
  18. while (difference > kPi) difference -= 2. * kPi;
  19. while (difference < -kPi) difference += 2. * kPi;
  20. return difference;
  21. }
  22. struct PointCloud {
  23. std::vector<Eigen::Vector3f> data;
  24. Time time;
  25. };
  26. template <typename FloatType>
  27. class Rigid2 {
  28. public:
  29. using Vector = Eigen::Matrix<FloatType, 2, 1>;
  30. using Rotation2D = Eigen::Rotation2D<FloatType>;
  31. Rigid2() : translation_(Vector::Zero()), rotation_(Rotation2D::Identity()) {}
  32. Rigid2(const Vector& translation, const Rotation2D& rotation) : translation_(translation)
  33. {
  34. rotation_ = Rotation2D(NormalizeAngleDifference(rotation.angle()));
  35. }
  36. Rigid2(const Vector& translation, const double rotation) : translation_(translation)
  37. {
  38. rotation_ = Rotation2D(NormalizeAngleDifference(rotation));
  39. }
  40. static Rigid2 Rotation(const double rotation) {
  41. return Rigid2(Vector::Zero(), rotation);
  42. }
  43. static Rigid2 Rotation(const Rotation2D& rotation) {
  44. return Rigid2(Vector::Zero(), rotation);
  45. }
  46. static Rigid2 Translation(const Vector& vector) {
  47. return Rigid2(vector, Rotation2D::Identity());
  48. }
  49. static Rigid2<FloatType> Identity() { return Rigid2<FloatType>(); }
  50. template <typename OtherType>
  51. Rigid2<OtherType> cast() const {
  52. return Rigid2<OtherType>(translation_.template cast<OtherType>(),
  53. rotation_.template cast<OtherType>());
  54. }
  55. const Vector& translation() const { return translation_; }
  56. Rotation2D rotation() const { return rotation_; }
  57. Rigid2 inverse() const {
  58. const Rotation2D rotation = rotation_.inverse();
  59. const Vector translation = -(rotation * translation_);
  60. return Rigid2(translation, rotation);
  61. }
  62. FloatType normalized_angle() {
  63. rotation_ = Rotation(NormalizeAngleDifference(rotation().angle())).rotation();
  64. return NormalizeAngleDifference(rotation().angle());
  65. }
  66. private:
  67. Vector translation_;
  68. Rotation2D rotation_;
  69. };
  70. template <typename FloatType>
  71. Rigid2<FloatType> operator*(const Rigid2<FloatType>& lhs,
  72. const Rigid2<FloatType>& rhs) {
  73. return Rigid2<FloatType>(
  74. lhs.rotation() * rhs.translation() + lhs.translation(),
  75. lhs.rotation() * rhs.rotation());
  76. }
  77. template <typename FloatType>
  78. typename Rigid2<FloatType>::Vector operator*(
  79. const Rigid2<FloatType>& rigid,
  80. const typename Rigid2<FloatType>::Vector& point) {
  81. return rigid.rotation() * point + rigid.translation();
  82. }
  83. using Rigid2d = Rigid2<double>;
  84. using Rigid2f = Rigid2<float>;
  85. struct TimeRigid2f {
  86. Rigid2f pose;
  87. Time stamp;
  88. float cost;
  89. };
  90. template <typename FloatType>
  91. class Rigid3 {
  92. public:
  93. using Vector = Eigen::Matrix<FloatType, 3, 1>;
  94. using Quaternion = Eigen::Quaternion<FloatType>;
  95. using AngleAxis = Eigen::AngleAxis<FloatType>;
  96. Rigid3() : translation_(Vector::Zero()), rotation_(Quaternion::Identity()) {}
  97. Rigid3(const Vector& translation, const Quaternion& rotation)
  98. : translation_(translation), rotation_(rotation) {}
  99. Rigid3(const Vector& translation, const AngleAxis& rotation)
  100. : translation_(translation), rotation_(rotation) {}
  101. static Rigid3 Rotation(const AngleAxis& angle_axis) {
  102. return Rigid3(Vector::Zero(), Quaternion(angle_axis));
  103. }
  104. static Rigid3 Rotation(const Quaternion& rotation) {
  105. return Rigid3(Vector::Zero(), rotation);
  106. }
  107. static Rigid3 Translation(const Vector& vector) {
  108. return Rigid3(vector, Quaternion::Identity());
  109. }
  110. static Rigid3 FromArrays(const std::array<FloatType, 4>& rotation,
  111. const std::array<FloatType, 3>& translation) {
  112. return Rigid3(Eigen::Map<const Vector>(translation.data()),
  113. Eigen::Quaternion<FloatType>(rotation[0], rotation[1],
  114. rotation[2], rotation[3]));
  115. }
  116. static Rigid3<FloatType> Identity() { return Rigid3<FloatType>(); }
  117. template <typename OtherType>
  118. Rigid3<OtherType> cast() const {
  119. return Rigid3<OtherType>(translation_.template cast<OtherType>(),
  120. rotation_.template cast<OtherType>());
  121. }
  122. const Vector& translation() const { return translation_; }
  123. const Quaternion& rotation() const { return rotation_; }
  124. Rigid3 inverse() const {
  125. const Quaternion rotation = rotation_.conjugate();
  126. const Vector translation = -(rotation * translation_);
  127. return Rigid3(translation, rotation);
  128. }
  129. bool IsValid() const {
  130. return !std::isnan(translation_.x()) && !std::isnan(translation_.y()) &&
  131. !std::isnan(translation_.z()) &&
  132. std::abs(FloatType(1) - rotation_.norm()) < FloatType(1e-3);
  133. }
  134. private:
  135. Vector translation_;
  136. Quaternion rotation_;
  137. };
  138. template <typename FloatType>
  139. Rigid3<FloatType> operator*(const Rigid3<FloatType>& lhs,
  140. const Rigid3<FloatType>& rhs) {
  141. return Rigid3<FloatType>(
  142. lhs.rotation() * rhs.translation() + lhs.translation(),
  143. (lhs.rotation() * rhs.rotation()).normalized());
  144. }
  145. template <typename FloatType>
  146. typename Rigid3<FloatType>::Vector operator*(
  147. const Rigid3<FloatType>& rigid,
  148. const typename Rigid3<FloatType>::Vector& point) {
  149. return rigid.rotation() * point + rigid.translation();
  150. }
  151. using Rigid3d = Rigid3<double>;
  152. using Rigid3f = Rigid3<float>;
  153. struct laserScan {
  154. float angle_increment;
  155. float angle_max;
  156. float angle_min;
  157. float range_max;
  158. float range_min;
  159. std::vector<float> ranges;
  160. };
  161. }
  162. }
  163. #endif