diff --git a/pps_ws/src/d_fall_pps/include/DemoControllerService.h b/pps_ws/src/d_fall_pps/include/DemoControllerService.h index 953c0522fbcd6c47b89e25ea73825398aa718222..765cc803f7417a957d167223c06564c4da2bbd03 100644 --- a/pps_ws/src/d_fall_pps/include/DemoControllerService.h +++ b/pps_ws/src/d_fall_pps/include/DemoControllerService.h @@ -114,11 +114,12 @@ // LQR_MODE_ANGLE LQR controller based on the state vector: // [position,velocity] // -#define LQR_MODE_MOTOR 1 -#define LQR_MODE_ACTUATOR 2 -#define LQR_MODE_RATE 3 // (DEFAULT) -#define LQR_MODE_ANGLE 4 -#define LQR_MODE_ANGLE_RATE_NESTED 5 +#define CONTROLLER_MODE_LQR_MOTOR 1 +#define CONTROLLER_MODE_LQR_ACTUATOR 2 +#define CONTROLLER_MODE_LQR_RATE 3 // (DEFAULT) +#define CONTROLLER_MODE_LQR_ANGLE 4 +#define CONTROLLER_MODE_LQR_ANGLE_RATE_NESTED 5 +#define CONTROLLER_MODE_ANGLE_RESPONSE_TEST 6 // These constants define the method used for estimating the Inertial @@ -194,33 +195,33 @@ float setpoint[4] = {0.0,0.0,0.4,0.0}; // The controller type to run in the "calculateControlOutput" function -int lqr_controller_mode = LQR_MODE_RATE; +int controller_mode = CONTROLLER_MODE_LQR_RATE; -// The LQR Controller parameters for "LQR_MODE_MOTOR" +// The LQR Controller parameters for "CONTROLLER_MODE_LQR_MOTOR" std::vector<float> gainMatrixMotor1 (12,0.0); std::vector<float> gainMatrixMotor2 (12,0.0); std::vector<float> gainMatrixMotor3 (12,0.0); std::vector<float> gainMatrixMotor4 (12,0.0); -// The LQR Controller parameters for "LQR_MODE_ACTUATOR" +// The LQR Controller parameters for "CONTROLLER_MODE_LQR_ACTUATOR" std::vector<float> gainMatrixThrust_TwelveStateVector (12,0.0); std::vector<float> gainMatrixRollTorque (12,0.0); std::vector<float> gainMatrixPitchTorque (12,0.0); std::vector<float> gainMatrixYawTorque (12,0.0); -// The LQR Controller parameters for "LQR_MODE_RATE" +// The LQR Controller parameters for "CONTROLLER_MODE_LQR_RATE" std::vector<float> gainMatrixThrust_NineStateVector (9,0.0); std::vector<float> gainMatrixRollRate (9,0.0); std::vector<float> gainMatrixPitchRate (9,0.0); std::vector<float> gainMatrixYawRate (9,0.0); -// The LQR Controller parameters for "LQR_MODE_ANGLE" +// The LQR Controller parameters for "CONTROLLER_MODE_LQR_ANGLE" std::vector<float> gainMatrixThrust_SixStateVector (6,0.0); std::vector<float> gainMatrixRollAngle (6,0.0); std::vector<float> gainMatrixPitchAngle (6,0.0); -// The LQR Controller parameters for "LQR_MODE_ANGLE_RATE_NESTED" +// The LQR Controller parameters for "CONTROLLER_MODE_LQR_ANGLE_RATE_NESTED" std::vector<float> gainMatrixThrust_SixStateVector_50Hz (6,0.0); std::vector<float> gainMatrixRollAngle_50Hz (6,0.0); std::vector<float> gainMatrixPitchAngle_50Hz (6,0.0); @@ -229,12 +230,24 @@ std::vector<float> gainMatrixRollRate_Nested (3,0.0); std::vector<float> gainMatrixPitchRate_Nested (3,0.0); std::vector<float> gainMatrixYawRate_Nested (3,0.0); -int lqr_angleRateNested_counter = 4; +int lqr_angleRateNested_counter = 4; float lqr_angleRateNested_prev_thrustAdjustment = 0.0; float lqr_angleRateNested_prev_rollAngle = 0.0; float lqr_angleRateNested_prev_pitchAngle = 0.0; float lqr_angleRateNested_prev_yawAngle = 0.0; +// The LQR Controller parameters for "CONTROLLER_MODE_ANGLE_RESPONSE_TEST" +int angleResponseTest_counter = 4; +float angleResponseTest_prev_thrustAdjustment = 0.0; +float angleResponseTest_prev_rollAngle = 0.0; +float angleResponseTest_prev_pitchAngle = 0.0; +float angleResponseTest_prev_yawAngle = 0.0; +float angleResponseTest_pitchAngle_degrees; +float angleResponseTest_pitchAngle_radians; +float angleResponseTest_distance_meters; + + + // The 16-bit command limits float cmd_sixteenbit_min; @@ -390,12 +403,18 @@ void calculateControlOutput_viaLQRforActuators( float stateErrorBody[12] void calculateControlOutput_viaLQRforRates( float stateErrorBody[12], Controller::Request &request, Controller::Response &response); void calculateControlOutput_viaLQRforAngles( float stateErrorBody[12], Controller::Request &request, Controller::Response &response); void calculateControlOutput_viaLQRforAnglesRatesNested( float stateErrorBody[12], Controller::Request &request, Controller::Response &response); +void calculateControlOutput_viaAngleResponseTest( float stateErrorBody[12], Controller::Request &request, Controller::Response &response); // ESTIMATOR COMPUTATIONS void performEstimatorUpdate_forStateInterial(Controller::Request &request); void performEstimatorUpdate_forStateInterial_viaFiniteDifference(); void performEstimatorUpdate_forStateInterial_viaPointMassKalmanFilter(); + +// PUBLISHING OF THE DEBUG MESSAGE +void construct_and_publish_debug_message(Controller::Request &request, Controller::Response &response); + + // TRANSFORMATION FROM INTERIAL ESTIMATE TO BODY FRAME ERROR void convert_stateInertial_to_bodyFrameError(float stateInertial[12], float setpoint[4], float (&bodyFrameError)[12]); diff --git a/pps_ws/src/d_fall_pps/param/DemoController.yaml b/pps_ws/src/d_fall_pps/param/DemoController.yaml index 875e84dc9ad99716d0b3b98c0c1ec850c2116fd0..f16f8f34fdc832cd798dd26815c8819ac7060e40 100644 --- a/pps_ws/src/d_fall_pps/param/DemoController.yaml +++ b/pps_ws/src/d_fall_pps/param/DemoController.yaml @@ -25,21 +25,30 @@ shouldFollowAnotherAgent : false follow_in_a_line_agentIDs : [1, 2, 3] # Boolean indiciating whether the "Debug Message" of this agent should be published or not -shouldPublishDebugMessage : false +shouldPublishDebugMessage : true # Boolean indiciating whether the debugging ROS_INFO_STREAM should be displayed or not shouldDisplayDebugInfo : false -# A flag for which LQR controller mode to use, defined as: -# 1 - LQR controller based on the state vector: [position,velocity,angles,angular velocity] +# A flag for which controller mode to use, defined as: +# 1 CONTROLLER_MODE_LQR_MOTOR +# - LQR controller based on the state vector: [position,velocity,angles,angular velocity] # commands per motor thrusts -# 2 - LQR controller based on the state vector: [position,velocity,angles,angular velocity] +# 2 CONTROLLER_MODE_LQR_ACTUATOR +# - LQR controller based on the state vector: [position,velocity,angles,angular velocity] # commands actuators of total force and bodz torques -# 3 - LQR controller based on the state vector: [position,velocity,angles] -# 4 - LQR controller based on the state vector: [position,velocity] -# 5 - LQR Nester angle and rate controller -lqr_controller_mode : 5 +# 3 CONTROLLER_MODE_LQR_RATE +# - LQR controller based on the state vector: [position,velocity,angles] +# 4 CONTROLLER_MODE_LQR_ANGLE +# - LQR controller based on the state vector: [position,velocity] +# 5 CONTROLLER_MODE_LQR_ANGLE_RATE_NESTED +# - LQR Nested angle and rate controller +# 6 CONTROLLER_MODE_ANGLE_RESPONSE_TEST +# - Swaps between pitch set-points to test angle set-point response time +# i.e., this controller test the assumption that "the inner loop is infinitely fast" +# +controller_mode : 6 # A flag for which estimator to use, defined as: @@ -88,6 +97,14 @@ gainMatrixRollRate_Nested : [ 4.00, 0.00, 0.00] gainMatrixPitchRate_Nested : [ 0.00, 4.00, 0.00] gainMatrixYawRate_Nested : [ 0.00, 0.00, 2.30] + +# The paramters for the "Angle Reponse Test" controller mode +angleResponseTest_pitchAngle_degrees : 20 +angleResponseTest_distance_meters : 0.02 + + + + # The max and minimum thrust for a 16-bit command command_sixteenbit_min : 1000 command_sixteenbit_max : 60000 diff --git a/pps_ws/src/d_fall_pps/src/DemoControllerService.cpp b/pps_ws/src/d_fall_pps/src/DemoControllerService.cpp index 38f548f03ce4cfabfad3569b69f46d9470ca2bfb..4c196ea51f2e5e5c981fafc64dba7c03ddb8c025 100644 --- a/pps_ws/src/d_fall_pps/src/DemoControllerService.cpp +++ b/pps_ws/src/d_fall_pps/src/DemoControllerService.cpp @@ -187,22 +187,23 @@ bool calculateControlOutput(Controller::Request &request, Controller::Response & - - - - - // PERFORM THE BASIC LQR CONTROLLER + // CARRY OUT THE CONTROLLER COMPUTATIONS calculateControlOutput_viaLQR(current_bodyFrameError,request,response); - // PUBLISH THE CURRENT X,Y,Z, AND YAW (if required) if (shouldPublishCurrent_xyz_yaw) { publish_current_xyz_yaw(request.ownCrazyflie.x,request.ownCrazyflie.y,request.ownCrazyflie.z,request.ownCrazyflie.yaw); } + // PUBLISH THE DEBUG MESSAGE (if required) + if (shouldPublishDebugMessage) + { + construct_and_publish_debug_message(request,response); + } + // RETURN "true" TO INDICATE THAT THE COMPUTATIONS WERE SUCCESSFUL return true; } @@ -390,12 +391,12 @@ void performEstimatorUpdate_forStateInterial_viaPointMassKalmanFilter() void calculateControlOutput_viaLQR(float stateErrorBody[12], Controller::Request &request, Controller::Response &response) { // SWITCH BETWEEN THE DIFFERENT LQR CONTROLLER MODES: - switch (lqr_controller_mode) + switch (controller_mode) { // LQR controller based on the state vector: // [position,velocity,angles,angular velocity] // commands per motor thrusts - case LQR_MODE_MOTOR: + case CONTROLLER_MODE_LQR_MOTOR: { // Call the function that performs the control computations for this mode calculateControlOutput_viaLQRforMotors(stateErrorBody,request,response); @@ -404,7 +405,7 @@ void calculateControlOutput_viaLQR(float stateErrorBody[12], Controller::Request // LQR controller based on the state vector: // [position,velocity,angles,angular velocity] // commands actuators of total force and bodz torques - case LQR_MODE_ACTUATOR: + case CONTROLLER_MODE_LQR_ACTUATOR: { // Call the function that performs the control computations for this mode calculateControlOutput_viaLQRforActuators(stateErrorBody,request,response); @@ -412,7 +413,7 @@ void calculateControlOutput_viaLQR(float stateErrorBody[12], Controller::Request } // LQR controller based on the state vector: // [position,velocity,angles] - case LQR_MODE_RATE: + case CONTROLLER_MODE_LQR_RATE: { // Call the function that performs the control computations for this mode calculateControlOutput_viaLQRforRates(stateErrorBody,request,response); @@ -421,7 +422,7 @@ void calculateControlOutput_viaLQR(float stateErrorBody[12], Controller::Request // LQR controller based on the state vector: // [position,velocity] - case LQR_MODE_ANGLE: + case CONTROLLER_MODE_LQR_ANGLE: { // Call the function that performs the control computations for this mode calculateControlOutput_viaLQRforAngles(stateErrorBody,request,response); @@ -430,17 +431,26 @@ void calculateControlOutput_viaLQR(float stateErrorBody[12], Controller::Request // LQR controller based on the state vector: // [position,velocity,angles] - case LQR_MODE_ANGLE_RATE_NESTED: + case CONTROLLER_MODE_LQR_ANGLE_RATE_NESTED: { // Call the function that performs the control computations for this mode calculateControlOutput_viaLQRforAnglesRatesNested(stateErrorBody,request,response); break; } + // LQR controller based on the state vector: + // [position,velocity,angles] + case CONTROLLER_MODE_ANGLE_RESPONSE_TEST: + { + // Call the function that performs the control computations for this mode + calculateControlOutput_viaAngleResponseTest(stateErrorBody,request,response); + break; + } + default: { - // Display that the "lqr_controller_mode" was not recognised - ROS_INFO_STREAM("ERROR: in the 'calculateControlOutput' function of the 'DemoControllerService': the 'lqr_controller_mode' is not recognised."); + // Display that the "controller_mode" was not recognised + ROS_INFO_STREAM("ERROR: in the 'calculateControlOutput' function of the 'DemoControllerService': the 'controller_mode' is not recognised."); // Set everything in the response to zero response.controlOutput.roll = 0; response.controlOutput.pitch = 0; @@ -480,7 +490,7 @@ void calculateControlOutput_viaLQRforMotors(float stateErrorBody[12], Controller motor4_thrustAdjustment -= gainMatrixMotor4[i] * stateErrorBody[i]; } - DebugMsg debugMsg; + //DebugMsg debugMsg; // Fill the debugging message with the data provided by Vicon //debugMsg.vicon_x = request.ownCrazyflie.x; @@ -494,19 +504,19 @@ void calculateControlOutput_viaLQRforMotors(float stateErrorBody[12], Controller // ...................... // debugMsg.value_10 = your_variable_name; - debugMsg.value_1 = stateErrorBody[6]; - debugMsg.value_2 = stateErrorBody[9]; + //debugMsg.value_1 = stateErrorBody[6]; + //debugMsg.value_2 = stateErrorBody[9]; - debugMsg.value_3 = motor1_thrustAdjustment; - debugMsg.value_4 = motor2_thrustAdjustment; - debugMsg.value_5 = motor3_thrustAdjustment; - debugMsg.value_6 = motor4_thrustAdjustment; + //debugMsg.value_3 = motor1_thrustAdjustment; + //debugMsg.value_4 = motor2_thrustAdjustment; + //debugMsg.value_5 = motor3_thrustAdjustment; + //debugMsg.value_6 = motor4_thrustAdjustment; // Publish the "debugMsg" - debugPublisher.publish(debugMsg); + //debugPublisher.publish(debugMsg); @@ -628,7 +638,7 @@ void calculateControlOutput_viaLQRforActuators(float stateErrorBody[12], Control // response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_ANGLE; - DebugMsg debugMsg; + //DebugMsg debugMsg; // Fill the debugging message with the data provided by Vicon //debugMsg.vicon_x = request.ownCrazyflie.x; @@ -642,14 +652,14 @@ void calculateControlOutput_viaLQRforActuators(float stateErrorBody[12], Control // ...................... // debugMsg.value_10 = your_variable_name; - debugMsg.value_1 = motor1_thrustAdjustment; - debugMsg.value_2 = motor2_thrustAdjustment; - debugMsg.value_3 = motor3_thrustAdjustment; - debugMsg.value_4 = motor4_thrustAdjustment; + //debugMsg.value_1 = motor1_thrustAdjustment; + //debugMsg.value_2 = motor2_thrustAdjustment; + //debugMsg.value_3 = motor3_thrustAdjustment; + //debugMsg.value_4 = motor4_thrustAdjustment; // Publish the "debugMsg" - debugPublisher.publish(debugMsg); + //debugPublisher.publish(debugMsg); // An alternate debugging technique is to print out data directly to the // command line from which this node was launched. @@ -725,48 +735,6 @@ void calculateControlOutput_viaLQRforRates(float stateErrorBody[12], Controller: // response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_ANGLE; - - // *********************************************************** - // DDDD EEEEE BBBB U U GGGG M M SSSS GGGG - // D D E B B U U G MM MM S G - // D D EEE BBBB U U G M M M SSS G - // D D E B B U U G G M M S G G - // DDDD EEEEE BBBB UUU GGGG M M SSSS GGGG - - // DEBUGGING CODE: - // As part of the D-FaLL-System we have defined a message type names"DebugMsg". - // By fill this message with data and publishing it you can display the data in - // real time using rpt plots. Instructions for using rqt plots can be found on - // the wiki of the D-FaLL-System repository - if (shouldPublishDebugMessage) - { - // Instantiate a local variable of type "DebugMsg", see the file "DebugMsg.msg" - // (located in the "msg" folder) to see the full structure of this message. - DebugMsg debugMsg; - - // Fill the debugging message with the data provided by Vicon - debugMsg.vicon_x = request.ownCrazyflie.x; - debugMsg.vicon_y = request.ownCrazyflie.y; - debugMsg.vicon_z = request.ownCrazyflie.z; - debugMsg.vicon_roll = request.ownCrazyflie.roll; - debugMsg.vicon_pitch = request.ownCrazyflie.pitch; - debugMsg.vicon_yaw = request.ownCrazyflie.yaw; - - // Fill in the debugging message with any other data you would like to display - // in real time. For example, it might be useful to display the thrust - // adjustment computed by the z-altitude controller. - // The "DebugMsg" type has 10 properties from "value_1" to "value_10", all of - // type "float64" that you can fill in with data you would like to plot in - // real-time. - // debugMsg.value_1 = thrustAdjustment; - // ...................... - // debugMsg.value_10 = your_variable_name; - - // Publish the "debugMsg" - debugPublisher.publish(debugMsg); - } - - // An alternate debugging technique is to print out data directly to the // command line from which this node was launched. if (shouldDisplayDebugInfo) @@ -957,12 +925,138 @@ void calculateControlOutput_viaLQRforAnglesRatesNested( float stateErrorBody[12] response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_RATE; // response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_ANGLE; + // Display some details (if requested) + if (shouldDisplayDebugInfo) + { + ROS_INFO_STREAM("thrust =" << lqr_angleRateNested_prev_thrustAdjustment ); + ROS_INFO_STREAM("rollrate =" << response.controlOutput.roll ); + ROS_INFO_STREAM("pitchrate =" << response.controlOutput.pitch ); + ROS_INFO_STREAM("yawrate =" << response.controlOutput.yaw ); + } +} + + + + +void calculateControlOutput_viaAngleResponseTest( float stateErrorBody[12], Controller::Request &request, Controller::Response &response) +{ + // PERFORM THE NESTED "u=Kx" LQR CONTROLLER COMPUTATION + + // Increment the counter variable + angleResponseTest_counter++; + + if (angleResponseTest_counter > 4) + { + //ROS_INFO("Outer called"); + + // Reset the counter to 1 + angleResponseTest_counter = 1; + + // PERFORM THE OUTER "u=Kx" LQR CONTROLLER COMPUTATION + + // Reset the class variable to zero for the following: + // > body frame roll angle, + // > body frame pitch angle, + // > body frame yaw angle, + // > total thrust adjustment. + // These will be requested from the "inner-loop" LQR controller below + angleResponseTest_prev_rollAngle = 0; + //angleResponseTest_prev_pitchAngle = 0; + angleResponseTest_prev_thrustAdjustment = 0; + + // Perform the "-Kx" LQR computation for the rates and thrust: + for(int i = 0; i < 6; ++i) + { + // BODY FRAME Y CONTROLLER + angleResponseTest_prev_rollAngle -= gainMatrixRollAngle_50Hz[i] * stateErrorBody[i]; + // BODY FRAME X CONTROLLER + //angleResponseTest_prev_pitchAngle -= gainMatrixPitchAngle_50Hz[i] * stateErrorBody[i]; + // > ALITUDE CONTROLLER (i.e., z-controller): + angleResponseTest_prev_thrustAdjustment -= gainMatrixThrust_SixStateVector_50Hz[i] * stateErrorBody[i]; + } + + // BODY FRAME Z CONTROLLER + //angleResponseTest_prev_yawAngle = setpoint[3]; + angleResponseTest_prev_yawAngle = stateErrorBody[8]; + + // COMPUTE THE DISTANCE FROM THE ORIGIN + if (stateErrorBody[0] > angleResponseTest_distance_meters) + { + angleResponseTest_prev_pitchAngle = -angleResponseTest_pitchAngle_radians; + } + else if (stateErrorBody[0] < (-angleResponseTest_distance_meters) ) + { + angleResponseTest_prev_pitchAngle = angleResponseTest_pitchAngle_radians; + } + + + + } + + //ROS_INFO("Inner called"); - ROS_INFO_STREAM("thrust =" << lqr_angleRateNested_prev_thrustAdjustment ); - ROS_INFO_STREAM("rollrate =" << response.controlOutput.roll ); - ROS_INFO_STREAM("pitchrate =" << response.controlOutput.pitch ); - ROS_INFO_STREAM("yawrate =" << response.controlOutput.yaw ); + // PERFORM THE INNER "u=Kx" LQR CONTROLLER COMPUTATION + // Instantiate the local variables for the following: + // > body frame roll rate, + // > body frame pitch rate, + // > body frame yaw rate, + // These will be requested from the Crazyflie's on-baord "inner-loop" controller + float rollRate_forResponse = 0; + float pitchRate_forResponse = 0; + float yawRate_forResponse = 0; + // Create the angle error to use for the inner controller + float temp_stateAngleError[3] = { + stateErrorBody[6] - angleResponseTest_prev_rollAngle, + stateErrorBody[7] - angleResponseTest_prev_pitchAngle, + angleResponseTest_prev_yawAngle + }; + + // Perform the "-Kx" LQR computation for the rates and thrust: + for(int i = 0; i < 4; ++i) + { + // BODY FRAME Y CONTROLLER + rollRate_forResponse -= gainMatrixRollRate_Nested[i] * temp_stateAngleError[i]; + // BODY FRAME X CONTROLLER + pitchRate_forResponse -= gainMatrixPitchRate_Nested[i] * temp_stateAngleError[i]; + // BODY FRAME Z CONTROLLER + yawRate_forResponse -= gainMatrixYawRate_Nested[i] * temp_stateAngleError[i]; + } + + + // UPDATE THE "RETURN" THE VARIABLE NAMED "response" + + // Put the computed rates and thrust into the "response" variable + // > For roll, pitch, and yaw: + response.controlOutput.roll = rollRate_forResponse; + response.controlOutput.pitch = pitchRate_forResponse; + response.controlOutput.yaw = yawRate_forResponse; + // > For the thrust adjustment we must add the feed-forward thrust to counter-act gravity. + // > NOTE: remember that the thrust is commanded per motor, so you sohuld + // consider whether the "thrustAdjustment" computed by your + // controller needed to be divided by 4 or not. + float thrustAdjustment = angleResponseTest_prev_thrustAdjustment / 4.0; + // > NOTE: the "gravity_force_quarter" value was already divided by 4 when + // it was loaded/processes from the .yaml file. + response.controlOutput.motorCmd1 = computeMotorPolyBackward(thrustAdjustment + gravity_force_quarter); + response.controlOutput.motorCmd2 = computeMotorPolyBackward(thrustAdjustment + gravity_force_quarter); + response.controlOutput.motorCmd3 = computeMotorPolyBackward(thrustAdjustment + gravity_force_quarter); + response.controlOutput.motorCmd4 = computeMotorPolyBackward(thrustAdjustment + gravity_force_quarter); + + + // Specify that this controller is a rate controller + // response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_MOTOR; + response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_RATE; + // response.controlOutput.onboardControllerType = CF_COMMAND_TYPE_ANGLE; + + // Display some details (if requested) + if (shouldDisplayDebugInfo) + { + ROS_INFO_STREAM("thrust =" << angleResponseTest_prev_thrustAdjustment ); + ROS_INFO_STREAM("rollrate =" << response.controlOutput.roll ); + ROS_INFO_STREAM("pitchrate =" << response.controlOutput.pitch ); + ROS_INFO_STREAM("yawrate =" << response.controlOutput.yaw ); + } } @@ -974,6 +1068,52 @@ void calculateControlOutput_viaLQRforAnglesRatesNested( float stateErrorBody[12] + +void construct_and_publish_debug_message(Controller::Request &request, Controller::Response &response) +{ + // *********************************************************** + // DDDD EEEEE BBBB U U GGGG M M SSSS GGGG + // D D E B B U U G MM MM S G + // D D EEE BBBB U U G M M M SSS G + // D D E B B U U G G M M S G G + // DDDD EEEEE BBBB UUU GGGG M M SSSS GGGG + + // DEBUGGING CODE: + // As part of the D-FaLL-System we have defined a message type names"DebugMsg". + // By fill this message with data and publishing it you can display the data in + // real time using rpt plots. Instructions for using rqt plots can be found on + // the wiki of the D-FaLL-System repository + + // Instantiate a local variable of type "DebugMsg", see the file "DebugMsg.msg" + // (located in the "msg" folder) to see the full structure of this message. + DebugMsg debugMsg; + + // Fill the debugging message with the data provided by Vicon + debugMsg.vicon_x = request.ownCrazyflie.x; + debugMsg.vicon_y = request.ownCrazyflie.y; + debugMsg.vicon_z = request.ownCrazyflie.z; + debugMsg.vicon_roll = request.ownCrazyflie.roll; + debugMsg.vicon_pitch = request.ownCrazyflie.pitch; + debugMsg.vicon_yaw = request.ownCrazyflie.yaw; + + // Fill in the debugging message with any other data you would like to display + // in real time. For example, it might be useful to display the thrust + // adjustment computed by the z-altitude controller. + // The "DebugMsg" type has 10 properties from "value_1" to "value_10", all of + // type "float64" that you can fill in with data you would like to plot in + // real-time. + // debugMsg.value_1 = thrustAdjustment; + // ...................... + // debugMsg.value_10 = your_variable_name; + debugMsg.value_1 = angleResponseTest_prev_pitchAngle; + + // Publish the "debugMsg" + debugPublisher.publish(debugMsg); +} + + + + // ------------------------------------------------------------------------------ // RRRR OOO TTTTT A TTTTT EEEEE III N N TTTTT OOO // R R O O T A A T E I NN N T O O @@ -1398,7 +1538,7 @@ void fetchYamlParameters(ros::NodeHandle& nodeHandle) // THE CONTROLLER GAINS: // A flag for which controller to use: - lqr_controller_mode = getParameterInt( nodeHandle_for_demoController , "lqr_controller_mode" ); + controller_mode = getParameterInt( nodeHandle_for_demoController , "controller_mode" ); // A flag for which estimator to use: estimator_method = getParameterInt( nodeHandle_for_demoController , "estimator_method" ); @@ -1435,7 +1575,9 @@ void fetchYamlParameters(ros::NodeHandle& nodeHandle) getParameterFloatVector(nodeHandle_for_demoController, "gainMatrixPitchRate_Nested", gainMatrixPitchRate_Nested, 3); getParameterFloatVector(nodeHandle_for_demoController, "gainMatrixYawRate_Nested", gainMatrixYawRate_Nested, 3); - + // The parameters for the "Angle Reponse Test" controller mode + angleResponseTest_pitchAngle_degrees = getParameterFloat(nodeHandle_for_demoController, "angleResponseTest_pitchAngle_degrees"); + angleResponseTest_distance_meters = getParameterFloat(nodeHandle_for_demoController, "angleResponseTest_distance_meters"); // 16-BIT COMMAND LIMITS cmd_sixteenbit_min = getParameterFloat(nodeHandle_for_demoController, "command_sixteenbit_min"); @@ -1476,6 +1618,10 @@ void processFetchedParameters() // Set that the estimator frequency is the same as the control frequency estimator_frequency = vicon_frequency; + // Convert from degrees to radians + angleResponseTest_pitchAngle_radians = (PI/180.0) * angleResponseTest_pitchAngle_degrees; + angleResponseTest_prev_pitchAngle = angleResponseTest_pitchAngle_radians; + // Look-up which agent should be followed if (shouldFollowAnotherAgent) {