common.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #ifndef __NAV_COMM_H__
  2. #define __NAV_COMM_H__
  3. #include <stdio.h>
  4. #include <vector>
  5. #include <cmath>
  6. namespace common
  7. {
  8. using Point = struct _Point;
  9. using Path = std::vector<struct _Point>;
  10. using Twist = struct _Twist;
  11. using Config = struct _Config;
  12. struct _Twist
  13. {
  14. _Twist() : x(0.0), y(0.0), angular(0.0)
  15. {}
  16. float x;
  17. float y;
  18. float angle;
  19. float angular;
  20. };
  21. struct _Point {
  22. _Point() : x(0.0),
  23. y(0.0),
  24. theta(0.0),
  25. head(0.0),
  26. max_linear(0.0)
  27. {}
  28. float x;
  29. float y;
  30. float theta;
  31. float head;
  32. float max_linear;
  33. };
  34. struct _Config
  35. {
  36. _Config() : max_linear(0.5),
  37. max_transla(0.5),
  38. max_angular(0.5),
  39. minmal_next(0.4),
  40. maxmal_next(0.8),
  41. const_next(false),
  42. maxmal_offset(1.2),
  43. close_ad(1.0),
  44. toler_x(0.01),
  45. toler_y(0.01),
  46. toler_theta(0.01), // 1°
  47. toler_start_theta(0.1),
  48. toler_follow(0.2),
  49. toler_follow_theta(0.51), // 30°
  50. angular_slow_p(0.8),
  51. linear_slow_p(0.3)
  52. {}
  53. float max_linear; // 最大线速度
  54. float max_transla; // 最大平移速度
  55. float max_angular; // 最大角速度
  56. float minmal_next; // 最小探测距离
  57. float maxmal_next; // 最大探测距离
  58. bool const_next;
  59. float maxmal_offset; // 最大偏移距离;
  60. float close_ad; // 接近调整
  61. // ()判断局部路劲与全局路径的差异度,差异度超过maxmal_offset则减小next,除非const_next
  62. float toler_x; // x方向误差
  63. float toler_y; // y方向误差
  64. float toler_theta; // 角度方向误差
  65. float toler_start_theta; // 起始角度误差
  66. float toler_follow; // 路径跟随容忍误差
  67. float toler_follow_theta;
  68. float angular_slow_p;
  69. float linear_slow_p;
  70. };
  71. enum NavState {
  72. DATA_MISS = -2,
  73. HEAD_WARN,
  74. HIT_OBSTACLE,
  75. OFF_COURSE,
  76. PATH_BLOCK,
  77. STOP,
  78. PATH_EMPTY,
  79. TOO_CLOSE,
  80. ING,
  81. ROTATE,
  82. DONE
  83. };
  84. enum NavStep {
  85. STANDBY = 0,
  86. TANGENT,
  87. TRACK,
  88. ANGLE,
  89. COMPLETE
  90. };
  91. inline float dist(Point p1, Point p2)
  92. {
  93. return hypot(p1.x - p2.x, p1.y - p2.y);
  94. }
  95. /**
  96. * 路径的长度
  97. */
  98. inline float lineL(common::Path& path, int s, int e)
  99. {
  100. float l = 0;
  101. for (int i = s;i < e - 1;i++) {
  102. l += dist(path[i], path[i + 1]);
  103. }
  104. return l;
  105. }
  106. /**
  107. * p点p1与p2点所构成直线的距离
  108. */
  109. inline float PLD(common::Point& p1, common::Point& p2, common::Point& p)
  110. {
  111. float mu = p.y * (p2.x - p1.x) - p.x * (p2.y - p1.y) + p1.x * (p2.y - p1.y) - p1.y * (p2.x - p1.x);
  112. float z = sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
  113. return fabs(mu) / z;
  114. }
  115. inline float norm(float t)
  116. {
  117. float pi = 3.1415926;
  118. while (t > 2.0 * pi) {
  119. t -= 2.0 * pi;
  120. }
  121. while (t < -2.0 * pi) {
  122. t += 2.0 * pi;
  123. }
  124. if (t > pi) {
  125. t -= 2.0 * pi;
  126. }
  127. if (t < -pi) {
  128. t += 2.0 * pi;
  129. }
  130. return t;
  131. }
  132. } // namespace common
  133. #endif