BehaviorStateMachine.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /// \file BehaviorStateMachine.h
  2. /// \author Hatem Darweesh
  3. /// \brief OpenPlanner's state machine implementation for different driving behaviors
  4. /// \date Jun 19, 2016
  5. #ifndef BEHAVIORSTATEMACHINE_H_
  6. #define BEHAVIORSTATEMACHINE_H_
  7. #include "RoadNetwork.h"
  8. #include <sstream>
  9. namespace PlannerHNS
  10. {
  11. class BehaviorStateMachine
  12. {
  13. public:
  14. virtual BehaviorStateMachine* GetNextState() = 0;
  15. virtual void Init();
  16. virtual void ResetTimer();
  17. virtual void InsertNextState(BehaviorStateMachine* nextState);
  18. BehaviorStateMachine(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* nextState);
  19. virtual ~BehaviorStateMachine() ;
  20. STATE_TYPE m_Behavior;
  21. int m_currentStopSignID ;
  22. int m_currentTrafficLightID ;
  23. double decisionMakingTime;
  24. int decisionMakingCount;
  25. double m_zero_velocity;
  26. PreCalculatedConditions* GetCalcParams()
  27. {
  28. if(!m_pCalculatedValues)
  29. m_pCalculatedValues = new PreCalculatedConditions();
  30. return m_pCalculatedValues;
  31. }
  32. void SetBehaviorsParams(PlanningParams* pParams)
  33. {
  34. if(!pParams)
  35. m_pParams = new PlanningParams;
  36. else
  37. m_pParams = pParams;
  38. }
  39. PreCalculatedConditions* m_pCalculatedValues;
  40. PlanningParams* m_pParams;
  41. timespec m_StateTimer;
  42. std::vector<BehaviorStateMachine*> pNextStates;
  43. BehaviorStateMachine* FindBehaviorState(const STATE_TYPE& behavior);
  44. void UpdateLogCount(BehaviorStateMachine* pState);
  45. BehaviorStateMachine* FindBestState(int nMinCount);
  46. private:
  47. std::vector<std::pair<BehaviorStateMachine*, int> > m_BehaviorsLog;
  48. };
  49. class ForwardState : public BehaviorStateMachine
  50. {
  51. public:
  52. ForwardState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  53. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FORWARD_STATE;}
  54. virtual ~ForwardState(){}
  55. virtual BehaviorStateMachine* GetNextState();
  56. };
  57. class ForwardStateII : public BehaviorStateMachine
  58. {
  59. public:
  60. ForwardStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  61. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FORWARD_STATE;}
  62. virtual ~ForwardStateII(){}
  63. virtual BehaviorStateMachine* GetNextState();
  64. };
  65. class MissionAccomplishedState : public BehaviorStateMachine
  66. {
  67. public:
  68. MissionAccomplishedState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  69. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FINISH_STATE;}
  70. virtual ~MissionAccomplishedState(){}
  71. virtual BehaviorStateMachine* GetNextState();
  72. };
  73. class MissionAccomplishedStateII : public BehaviorStateMachine
  74. {
  75. public:
  76. MissionAccomplishedStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  77. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FINISH_STATE;}
  78. virtual ~MissionAccomplishedStateII(){}
  79. virtual BehaviorStateMachine* GetNextState();
  80. };
  81. class FollowState : public BehaviorStateMachine
  82. {
  83. public:
  84. FollowState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  85. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FOLLOW_STATE;}
  86. virtual ~FollowState(){}
  87. virtual BehaviorStateMachine* GetNextState();
  88. };
  89. class FollowStateII : public BehaviorStateMachine
  90. {
  91. public:
  92. FollowStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  93. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = FOLLOW_STATE;}
  94. virtual ~FollowStateII(){}
  95. virtual BehaviorStateMachine* GetNextState();
  96. };
  97. class SwerveState : public BehaviorStateMachine
  98. {
  99. public:
  100. SwerveState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  101. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = OBSTACLE_AVOIDANCE_STATE;}
  102. virtual ~SwerveState(){}
  103. virtual BehaviorStateMachine* GetNextState();
  104. };
  105. class SwerveStateII : public BehaviorStateMachine
  106. {
  107. public:
  108. SwerveStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  109. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = OBSTACLE_AVOIDANCE_STATE;}
  110. virtual ~SwerveStateII(){}
  111. virtual BehaviorStateMachine* GetNextState();
  112. };
  113. class StopState : public BehaviorStateMachine
  114. {
  115. public:
  116. StopState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  117. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = STOPPING_STATE;}
  118. virtual BehaviorStateMachine* GetNextState();
  119. };
  120. class TrafficLightStopState : public BehaviorStateMachine
  121. {
  122. public:
  123. TrafficLightStopState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  124. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = TRAFFIC_LIGHT_STOP_STATE;}
  125. virtual ~TrafficLightStopState(){}
  126. virtual BehaviorStateMachine* GetNextState();
  127. };
  128. class TrafficLightWaitState : public BehaviorStateMachine
  129. {
  130. public:
  131. TrafficLightWaitState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  132. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = TRAFFIC_LIGHT_WAIT_STATE;}
  133. virtual ~TrafficLightWaitState(){}
  134. virtual BehaviorStateMachine* GetNextState();
  135. };
  136. class StopSignStopState : public BehaviorStateMachine
  137. {
  138. public:
  139. StopSignStopState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  140. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = STOP_SIGN_STOP_STATE;}
  141. virtual ~StopSignStopState(){}
  142. virtual BehaviorStateMachine* GetNextState();
  143. };
  144. class StopSignStopStateII : public BehaviorStateMachine
  145. {
  146. public:
  147. StopSignStopStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  148. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = STOP_SIGN_STOP_STATE;}
  149. virtual ~StopSignStopStateII(){}
  150. virtual BehaviorStateMachine* GetNextState();
  151. };
  152. class StopSignWaitState : public BehaviorStateMachine
  153. {
  154. public:
  155. StopSignWaitState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  156. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = STOP_SIGN_WAIT_STATE;}
  157. virtual ~StopSignWaitState(){}
  158. virtual BehaviorStateMachine* GetNextState();
  159. };
  160. class StopSignWaitStateII : public BehaviorStateMachine
  161. {
  162. public:
  163. StopSignWaitStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  164. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = STOP_SIGN_WAIT_STATE;}
  165. virtual ~StopSignWaitStateII(){}
  166. virtual BehaviorStateMachine* GetNextState();
  167. };
  168. class WaitState : public BehaviorStateMachine
  169. {
  170. public:
  171. WaitState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  172. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = WAITING_STATE;}
  173. virtual ~WaitState(){}
  174. virtual BehaviorStateMachine* GetNextState();
  175. };
  176. class InitState : public BehaviorStateMachine
  177. {
  178. public:
  179. InitState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  180. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = INITIAL_STATE;}
  181. virtual ~InitState(){}
  182. virtual BehaviorStateMachine* GetNextState();
  183. };
  184. class InitStateII : public BehaviorStateMachine
  185. {
  186. public:
  187. InitStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  188. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = INITIAL_STATE;}
  189. virtual ~InitStateII(){}
  190. virtual BehaviorStateMachine* GetNextState();
  191. };
  192. class GoalState : public BehaviorStateMachine
  193. {
  194. public:
  195. GoalState(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  196. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = GOAL_STATE;}
  197. virtual ~GoalState(){}
  198. virtual BehaviorStateMachine* GetNextState();
  199. };
  200. class GoalStateII : public BehaviorStateMachine
  201. {
  202. public:
  203. GoalStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  204. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = GOAL_STATE;}
  205. virtual ~GoalStateII(){}
  206. virtual BehaviorStateMachine* GetNextState();
  207. };
  208. class TrafficLightStopStateII : public BehaviorStateMachine
  209. {
  210. public:
  211. TrafficLightStopStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  212. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = TRAFFIC_LIGHT_STOP_STATE;}
  213. virtual ~TrafficLightStopStateII(){}
  214. virtual BehaviorStateMachine* GetNextState();
  215. };
  216. class TrafficLightWaitStateII : public BehaviorStateMachine
  217. {
  218. public:
  219. TrafficLightWaitStateII(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* pNextState)
  220. : BehaviorStateMachine(pParams, pPreCalcVal, pNextState){m_Behavior = TRAFFIC_LIGHT_WAIT_STATE;}
  221. virtual ~TrafficLightWaitStateII(){}
  222. virtual BehaviorStateMachine* GetNextState();
  223. };
  224. } /* namespace PlannerHNS */
  225. #endif /* BEHAVIORSTATEMACHINE_H_ */