From d7d3b2d25f86b0255daebcf071b713f0ef0ed2a5 Mon Sep 17 00:00:00 2001 From: Angel <roangel@student.ethz.ch> Date: Tue, 26 Sep 2017 12:25:41 +0200 Subject: [PATCH] changed way of changing controllers. need to test --- pps_ws/src/d_fall_pps/param/Crazyflie.db | 3 +- pps_ws/src/d_fall_pps/src/PPSClient.cpp | 99 +++++++++++++----------- 2 files changed, 55 insertions(+), 47 deletions(-) diff --git a/pps_ws/src/d_fall_pps/param/Crazyflie.db b/pps_ws/src/d_fall_pps/param/Crazyflie.db index 7e90e6d4..92f7e458 100644 --- a/pps_ws/src/d_fall_pps/param/Crazyflie.db +++ b/pps_ws/src/d_fall_pps/param/Crazyflie.db @@ -1,2 +1 @@ -1,PPS_CF02,0/8/2M/E7E7E7E702,0,-1.38022,-0.405516,-0.2,-0.481301,0.485645,2 -2,PPS_CF04,0/24/2M,1,-0.412714,-0.376959,-0.2,0.423148,0.384735,2 +5,cfTwo,0/69/2M,0,-0.251699,-1.96387,-0.2,0.0792386,-1.54593,2 diff --git a/pps_ws/src/d_fall_pps/src/PPSClient.cpp b/pps_ws/src/d_fall_pps/src/PPSClient.cpp index 58758a43..ac16cfda 100755 --- a/pps_ws/src/d_fall_pps/src/PPSClient.cpp +++ b/pps_ws/src/d_fall_pps/src/PPSClient.cpp @@ -123,7 +123,7 @@ CrazyflieContext context; int instant_controller; //variable for the instant controller, e.g., we use safe controller for taking off and landing even if custom controller is enabled. This variable WILL change automatically // controller used: -int controller_used = SAFE_CONTROLLER; +int controller_used; ros::Publisher controllerUsedPublisher; @@ -141,36 +141,6 @@ ros::Timer timer_takeoff; ros::Timer timer_land; - -void setControllerUsed(int controller) -{ - controller_used = controller; -} - -int getControllerUsed() -{ - return controller_used; -} - -void useSafeController() -{ - setControllerUsed(SAFE_CONTROLLER); - -} - -void sendMessageUsingController(int controller) -{ - // send a message in topic for the studentGUI to read it - std_msgs::Int32 controller_used_msg; - controller_used_msg.data = controller; - controllerUsedPublisher.publish(controller_used_msg); -} - -void useCustomController() -{ - setControllerUsed(CUSTOM_CONTROLLER); -} - void loadSafeController() { ros::NodeHandle nodeHandle("~"); @@ -201,6 +171,48 @@ void loadCustomController() } +void sendMessageUsingController(int controller) +{ + // send a message in topic for the studentGUI to read it + std_msgs::Int32 controller_used_msg; + controller_used_msg.data = controller; + controllerUsedPublisher.publish(controller_used_msg); +} + +void setInstantController(int controller) //for right now, temporal use +{ + instant_controller = controller; + sendMessageUsingController(controller); + switch(controller) + { + case SAFE_CONTROLLER: + loadSafeController(); + break; + case CUSTOM_CONTROLLER: + loadCustomController(); + break; + default: + break; + } +} + +int getInstantController() +{ + return instant_controller; +} + +void setControllerUsed(int controller) //for permanent configs +{ + controller_used = controller; +} + +int getControllerUsed() +{ + return controller_used; +} + + + //checks if crazyflie is within allowed area and if custom controller returns no data bool safetyCheck(CrazyflieData data, ControlCommand controlCommand) { //position check @@ -284,8 +296,8 @@ void takeOffCF(CrazyflieData& current_local_coordinates) //local because the set ROS_INFO("X: %f, Y: %f, Z: %f", setpoint_msg.x, setpoint_msg.y, setpoint_msg.z); // now, use safe controller to go to that setpoint - useSafeController(); loadSafeController(); + setInstantController(SAFE_CONTROLLER); // when do we finish? after some time with delay? // update variable that keeps track of current setpoint @@ -303,8 +315,8 @@ void landCF(CrazyflieData& current_local_coordinates) safeControllerServiceSetpointPublisher.publish(setpoint_msg); // now, use safe controller to go to that setpoint - useSafeController(); loadSafeController(); + setInstantController(SAFE_CONTROLLER); setCurrentSafeSetpoint(setpoint_msg); } @@ -380,6 +392,7 @@ void viconCallback(const ViconData& viconData) { if(finished_take_off) { finished_take_off = false; + setInstantController(getControllerUsed()); changeFlyingStateTo(STATE_FLYING); } break; @@ -404,6 +417,7 @@ void viconCallback(const ViconData& viconData) { if(finished_land) { finished_land = false; + setInstantController(getControllerUsed()); changeFlyingStateTo(STATE_MOTORS_OFF); } break; @@ -411,14 +425,12 @@ void viconCallback(const ViconData& viconData) { break; } - sendMessageUsingController(getControllerUsed()); - // control part that should always be running, calls to controller, computation of control output if(flying_state != STATE_MOTORS_OFF) { if(!global.occluded) //if it is not occluded, then proceed to compute the controller output. { - if(getControllerUsed() == CUSTOM_CONTROLLER && flying_state == STATE_FLYING) // only enter in custom controller if we are not using safe controller AND the flying state is FLYING + if(getInstantController() == CUSTOM_CONTROLLER && flying_state == STATE_FLYING) // only enter in custom controller if we are not using safe controller AND the flying state is FLYING { bool success = customController.call(controllerCall); if(!success) @@ -426,11 +438,11 @@ void viconCallback(const ViconData& viconData) { ROS_ERROR("Failed to call custom controller, switching to safe controller"); ROS_ERROR_STREAM("custom controller status: valid: " << customController.isValid() << ", exists: " << customController.exists()); ROS_ERROR_STREAM("custom controller name: " << customController.getService()); - useSafeController(); + setInstantController(SAFE_CONTROLLER); } else if(!safetyCheck(global, controllerCall.response.controlOutput)) { - useSafeController(); + setInstantController(SAFE_CONTROLLER); ROS_INFO_STREAM("safety check failed, switching to safe controller"); } } @@ -580,14 +592,12 @@ void commandCallback(const std_msgs::Int32& commandMsg) { switch(cmd) { case CMD_USE_SAFE_CONTROLLER: ROS_INFO("USE_SAFE_CONTROLLER Command received"); - loadSafeController(); - useSafeController(); + setControllerUsed(SAFE_CONTROLLER); break; case CMD_USE_CUSTOM_CONTROLLER: ROS_INFO("USE_CUSTOM_CONTROLLER Command received"); - loadCustomController(); - useCustomController(); + setControllerUsed(CUSTOM_CONTROLLER); break; case CMD_CRAZYFLY_TAKE_OFF: @@ -727,9 +737,8 @@ int main(int argc, char* argv[]) //start with safe controller flying_state = STATE_MOTORS_OFF; - useSafeController(); - loadSafeController(); - sendMessageUsingController(getControllerUsed()); + setControllerUsed(SAFE_CONTROLLER); + setInstantController(SAFE_CONTROLLER); //initialize this also, so we notify GUI std::string package_path; package_path = ros::package::getPath("d_fall_pps") + "/"; -- GitLab