ASCO Aerial Autonomy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pick_place_state_machine.h
Go to the documentation of this file.
1 #pragma once
2 
18 // back-end
20 
21 // front-end
22 #include <boost/msm/front/state_machine_def.hpp>
23 
24 // functors
25 #include <boost/msm/front/functor_row.hpp>
26 
27 // Actions and guards used
29 
30 // Robot System used
32 
33 // Logging library
34 #include <glog/logging.h>
35 
36 // Store state machine states
37 #include <array>
38 
39 // Base state machine
41 
42 // Events
43 #include <aerial_autonomy/pick_place_events.h>
44 
46 
47 namespace msmf = boost::msm::front;
48 namespace vse = visual_servoing_events;
49 namespace pe = pick_place_events;
50 namespace be = uav_basic_events;
51 
52 // Forward Declaration
54 
62 
67 
72  : public msmf::state_machine_def<PickPlaceStateMachineFrontEnd>,
73  public BaseStateMachine<UAVArmSystem> {
74 public:
81  template <class Event, class FSM> void on_entry(Event const &evt, FSM &fsm) {
82  VLOG(1) << "entering: PickPlace system";
83  int dummy_source_state = 0, dummy_target_state = 0;
84  psa::ArmPowerOn()(evt, fsm, dummy_source_state, dummy_target_state);
85  }
92  template <class Event, class FSM> void on_exit(Event const &evt, FSM &fsm) {
93  VLOG(1) << "leaving: PickPlace system";
94  int dummy_source_state = 0, dummy_target_state = 0;
95  psa::ArmPowerOff()(evt, fsm, dummy_source_state, dummy_target_state);
96  }
97 
105  : BaseStateMachine(uav_system) {}
106 
115  : boost::mpl::vector<
116  // Start Event Next Action Guard
117  // +--------------+-------------+--------------+---------------------+---------------------------+
118  msmf::Row<psa::Landed, be::Takeoff, psa::ArmPreTakeoffFolding,
119  psa::ArmPowerOnFold, msmf::none>,
120  // +--------------+-------------+--------------+---------------------+---------------------------+
121  msmf::Row<psa::Landed, ManualControlEvent,
122  psa::ManualControlArmState, msmf::none, msmf::none>,
123  // +--------------+-------------+--------------+---------------------+---------------------------+
124  msmf::Row<psa::ArmPreTakeoffFolding, Completed, psa::TakingOff,
125  psa::TakeoffAction, psa::TakeoffGuard>,
126  // +--------------+-------------+--------------+---------------------+---------------------------+
127  msmf::Row<psa::ArmPreTakeoffFolding, be::Abort, psa::Landed,
128  psa::ArmPowerOff, msmf::none>,
129  // +--------------+-------------+--------------+---------------------+---------------------------+
130  msmf::Row<psa::TakingOff, Completed, psa::Hovering,
131  psa::ArmRightFold, msmf::none>,
132  // +--------------+-------------+--------------+---------------------+---------------------------+
133  msmf::Row<psa::Hovering, PositionYaw, psa::ReachingGoal,
134  psa::ReachingGoalSet, psa::ReachingGoalGuard>,
135  // +--------------+-------------+--------------+---------------------+---------------------------+
136  msmf::Row<psa::Hovering, pe::Pick, psa::PrePickState,
137  psa::PrePickTransitionAction, psa::PickTransitionGuard>,
138  // +--------------+-------------+--------------+---------------------+---------------------------+
139  msmf::Row<psa::PrePickState, Completed, psa::PickState,
140  psa::PickTransitionAction, msmf::none>,
141  // +--------------+-------------+--------------+---------------------+---------------------------+
142  msmf::Row<psa::Hovering, vse::GoHome, psa::ReachingGoal,
143  psa::GoHomeTransitionAction, psa::GoHomeTransitionGuard>,
144  // +--------------+-------------+--------------+---------------------+---------------------------+
145  msmf::Row<psa::Hovering, be::Land, psa::ArmPreLandingFolding,
146  psa::ArmFold, msmf::none>,
147  // +--------------+-------------+--------------+---------------------+---------------------------+
148  msmf::Row<psa::ArmPreLandingFolding, Completed, psa::Landing,
149  psa::LandingAction, msmf::none>,
150  // +--------------+-------------+--------------+---------------------+---------------------------+
151  msmf::Row<psa::ArmPreLandingFolding, be::Abort, psa::Landing,
152  psa::LandingAction, msmf::none>,
153  // +--------------+-------------+--------------+---------------------+---------------------------+
154  msmf::Row<psa::Hovering, ManualControlEvent,
155  psa::ManualControlArmState, msmf::none, msmf::none>,
156  // +--------------+-------------+--------------+---------------------+---------------------------+
157  msmf::Row<psa::ReachingGoal, be::Abort, psa::Hovering,
158  psa::AbortUAVControllerArmRightFold, msmf::none>,
159  // +--------------+-------------+--------------+---------------------+---------------------------+
160  msmf::Row<psa::ReachingGoal, be::Land, psa::ArmPreLandingFolding,
161  psa::ArmFold, msmf::none>,
162  // +--------------+-------------+--------------+---------------------+---------------------------+
163  msmf::Row<psa::PrePickState, be::Abort, psa::Hovering,
164  psa::AbortUAVArmController, msmf::none>,
165  // +--------------+-------------+--------------+---------------------+---------------------------+
166  msmf::Row<psa::PrePickState, be::Land, psa::ArmPreLandingFolding,
167  psa::AbortUAVControllerArmFold, msmf::none>,
168  // +--------------+-------------+--------------+---------------------+---------------------------+
169  msmf::Row<psa::PickState, be::Abort, psa::Hovering,
170  psa::AbortUAVArmController, msmf::none>,
171  // +--------------+-------------+--------------+---------------------+---------------------------+
172  msmf::Row<psa::PickState, be::Land, psa::ArmPreLandingFolding,
173  psa::AbortUAVControllerArmFold, msmf::none>,
174  // +--------------+-------------+--------------+---------------------+---------------------------+
175  msmf::Row<psa::Landing, Completed, psa::Landed, psa::ArmPowerOff,
176  msmf::none>,
177  // +--------------+-------------+--------------+---------------------+---------------------------+
178  msmf::Row<psa::ReachingGoal, Completed, psa::Hovering,
179  psa::AbortUAVControllerArmRightFold, msmf::none>,
180  // +--------------+-------------+--------------+---------------------+---------------------------+
181  msmf::Row<psa::PickState, Completed, psa::Hovering,
182  psa::AbortUAVArmController, psa::PickGuard>,
183  // +--------------+-------------+--------------+---------------------+---------------------------+
184  msmf::Row<psa::ManualControlArmState, be::Takeoff, psa::Hovering,
185  psa::ManualControlSwitchAction,
186  psa::ManualControlSwitchGuard>,
187  // +--------------+-------------+--------------+---------------------+---------------------------+
188  msmf::Row<psa::ManualControlArmState, be::Land, psa::Landed,
189  psa::ManualControlSwitchAction,
190  psa::ManualControlSwitchGuard>> {};
195 };
196 
200 static constexpr std::array<const char *, 10> state_names = {
201  "Landed", "ArmPreTakeoffFolding", "Takingoff", "Hovering",
202  "PrePickState", "ArmPreLandingFolding", "ReachingGoal", "PickState",
203  "Landing", "ManualControlArmState"};
211 const char *pstate(PickPlaceStateMachine const &p) {
212  return state_names.at(p.current_state()[0]);
213 }
UAV vision system with an arm.
Definition: uav_arm_system.h:12
PickPlaceStateMachineFrontEnd(UAVArmSystem &uav_system)
Constructor with arguments to store robot system.
Definition: pick_place_state_machine.h:104
Thread safe state machine class that extends boost::msm::back::state_machine class.
Definition: thread_safe_state_machine.h:28
ArmPoweroffTransitionActionFunctor_< LogicStateMachineT > ArmPowerOff
Action to poweroff arm.
Definition: pick_place_states_actions.h:70
front-end: define the FSM structure
Definition: pick_place_state_machine.h:71
void on_exit(Event const &evt, FSM &fsm)
Action to take on leaving state machine.
Definition: pick_place_state_machine.h:92
void on_entry(Event const &evt, FSM &fsm)
Action to take on entering state machine.
Definition: pick_place_state_machine.h:81
const char * pstate(PickPlaceStateMachine const &p)
Get current state name.
Definition: pick_place_state_machine.h:211
Class to provide typedefs for all basic uav states and actions.
Definition: pick_place_states_actions.h:17
State that checks arm status along with regular manual control state.
Definition: pick_place_states_actions.h:137
Transition table for State Machine.
Definition: pick_place_state_machine.h:114
Base state machine.
Definition: base_state_machine.h:18
ArmPoweronTransitionActionFunctor_< LogicStateMachineT > ArmPowerOn
Action to poweroff arm.
Definition: pick_place_states_actions.h:66