diff --git a/quad/sw/modular_quad_pid/gen_diagram/gen_diagram b/quad/sw/modular_quad_pid/gen_diagram/gen_diagram index 5ecd8da3b67c09fcecc9879100ab1bc41dd31b42..c39dfb12558e81c2f9a4d6d6932afa7e726249ba 100755 Binary files a/quad/sw/modular_quad_pid/gen_diagram/gen_diagram and b/quad/sw/modular_quad_pid/gen_diagram/gen_diagram differ diff --git a/quad/sw/modular_quad_pid/gen_diagram/network.dot b/quad/sw/modular_quad_pid/gen_diagram/network.dot index 2d0ae44ff6860531b5914db9576a75986c681ad9..8ebddda8b107ed93a0ca7dfd9d35f1b9ee11b33e 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/network.dot +++ b/quad/sw/modular_quad_pid/gen_diagram/network.dot @@ -12,6 +12,9 @@ label="<f0>Pitch PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> "dT" -> "Pitch PID":f3 [label="Constant"] "Yaw PID"[shape=record label="<f0>Yaw PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=2.600] |<f5> [Ki=0.000] |<f6> [Kd=0.000]"] +"Yaw" -> "Yaw PID":f1 [label="Constant"] +"Yaw Setpoint" -> "Yaw PID":f2 [label="Constant"] +"dT" -> "Yaw PID":f3 [label="Constant"] "Roll Rate PID"[shape=record label="<f0>Roll Rate PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=4600.000] |<f5> [Ki=0.000] |<f6> [Kd=550.000]"] "dPhi" -> "Roll Rate PID":f1 [label="Constant"] @@ -28,11 +31,34 @@ label="<f0>Yaw Rate PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f "RC Yaw" -> "Yaw Rate PID":f2 [label="Constant"] "dT" -> "Yaw Rate PID":f3 [label="Constant"] "X pos PID"[shape=record -label="<f0>X pos PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000]"] +label="<f0>X pos PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-0.015] |<f5> [Ki=-0.005] |<f6> [Kd=-0.030]"] +"VRPN X" -> "X pos PID":f1 [label="Constant"] +"X Setpoint" -> "X pos PID":f2 [label="Constant"] +"dT" -> "X pos PID":f3 [label="Constant"] "Y pos PID"[shape=record -label="<f0>Y pos PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000]"] -"Altitude"[shape=record -label="<f0>Altitude |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000]"] +label="<f0>Y pos PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.015] |<f5> [Ki=0.005] |<f6> [Kd=0.030]"] +"VRPN Y" -> "Y pos PID":f1 [label="Constant"] +"Y Setpoint" -> "Y pos PID":f2 [label="Constant"] +"dT" -> "Y pos PID":f3 [label="Constant"] +"Altitude PID"[shape=record +label="<f0>Altitude PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=9804.000] |<f5> [Ki=817.000] |<f6> [Kd=7353.000]"] +"VRPN Alt" -> "Altitude PID":f1 [label="Constant"] +"Alt Setpoint" -> "Altitude PID":f2 [label="Constant"] +"dT" -> "Altitude PID":f3 [label="Constant"] +"X Setpoint"[shape=record +label="<f0>X Setpoint |<f1> [Constant=0.000]"] +"Y Setpoint"[shape=record +label="<f0>Y Setpoint |<f1> [Constant=0.000]"] +"Alt Setpoint"[shape=record +label="<f0>Alt Setpoint |<f1> [Constant=0.000]"] +"Yaw Setpoint"[shape=record +label="<f0>Yaw Setpoint |<f1> [Constant=0.000]"] +"Throttle trim"[shape=record +label="<f0>Throttle trim |<f1> [Constant=0.000]"] +"T trim add"[shape=record +label="<f0>T trim add |<f1> --\>Summand 1 |<f2> --\>Summand 2"] +"Altitude PID" -> "T trim add":f1 [label="Correction"] +"Throttle trim" -> "T trim add":f2 [label="Constant"] "P PWM Clamp"[shape=record label="<f0>P PWM Clamp |<f1> --\>Bounds in |<f2> [Min=-20000.000] |<f3> [Max=20000.000]"] "Pitch Rate PID" -> "P PWM Clamp":f1 [label="Correction"] @@ -60,6 +86,12 @@ label="<f0>dTheta |<f1> [Constant=0.000]"] label="<f0>dPhi |<f1> [Constant=0.000]"] "dPsi"[shape=record label="<f0>dPsi |<f1> [Constant=0.000]"] +"VRPN X"[shape=record +label="<f0>VRPN X |<f1> [Constant=0.000]"] +"VRPN Y"[shape=record +label="<f0>VRPN Y |<f1> [Constant=0.000]"] +"VRPN Alt"[shape=record +label="<f0>VRPN Alt |<f1> [Constant=0.000]"] "RC Pitch"[shape=record label="<f0>RC Pitch |<f1> [Constant=0.000]"] "RC Roll"[shape=record diff --git a/quad/sw/modular_quad_pid/gen_diagram/network.png b/quad/sw/modular_quad_pid/gen_diagram/network.png index f68b5ba73ade931574e1f9ebfd61edb93bd5c293..1bd106753a9455c264e618a90ad12518196160f2 100644 Binary files a/quad/sw/modular_quad_pid/gen_diagram/network.png and b/quad/sw/modular_quad_pid/gen_diagram/network.png differ diff --git a/quad/sw/modular_quad_pid/src/control_algorithm.c b/quad/sw/modular_quad_pid/src/control_algorithm.c index 3623d4d6f92a3c0c2e67af047d9f919fff9e4165..ba6a8733b2589b7fe044188b505e1279d750798f 100644 --- a/quad/sw/modular_quad_pid/src/control_algorithm.c +++ b/quad/sw/modular_quad_pid/src/control_algorithm.c @@ -12,13 +12,30 @@ #include "graph_blocks/node_bounds.h" #include "graph_blocks/node_constant.h" #include "graph_blocks/node_mixer.h" +#include "graph_blocks/node_add.h" #include "PID.h" #include "util.h" #define ROLL_PITCH_MAX_ANGLE 0.3490 // 20 degrees - int control_algorithm_init(parameter_t * ps) - { +void connect_autonomous(parameter_t* ps) { + struct computation_graph* graph = ps->graph; + graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->clamp_pitch, PID_CORRECTION); + graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->clamp_roll, PID_CORRECTION); + graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->throttle_trim_add, ADD_SUM); + graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->yaw_pid, PID_CORRECTION); +} + +void connect_manual(parameter_t* ps) { + struct computation_graph* graph = ps->graph; + graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->rc_pitch, CONST_VAL); + graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->rc_roll, CONST_VAL); + graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, CONST_VAL); + graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->rc_yaw, CONST_VAL); +} + +int control_algorithm_init(parameter_t * ps) +{ struct computation_graph* graph = create_graph(); ps->graph = graph; @@ -31,7 +48,13 @@ ps->yaw_r_pid = graph_add_node_pid(graph, "Yaw Rate PID"); ps->x_pos_pid = graph_add_node_pid(graph, "X pos PID"); ps->y_pos_pid = graph_add_node_pid(graph, "Y pos PID"); - ps->alt_pid = graph_add_node_pid(graph, "Altitude"); + ps->alt_pid = graph_add_node_pid(graph, "Altitude PID"); + ps->x_set = graph_add_node_const(graph, "X Setpoint"); + ps->y_set = graph_add_node_const(graph, "Y Setpoint"); + ps->alt_set = graph_add_node_const(graph, "Alt Setpoint"); + ps->yaw_set = graph_add_node_const(graph, "Yaw Setpoint"); + ps->throttle_trim = graph_add_node_const(graph, "Throttle trim"); + ps->throttle_trim_add = graph_add_node_add(graph, "T trim add"); // Create blocks for bounds checking ps->clamp_d_pwmP = graph_add_node_bounds(graph, "P PWM Clamp"); @@ -53,6 +76,11 @@ ps->phi_dot = graph_add_node_const(graph, "dPhi"); ps->psi_dot = graph_add_node_const(graph, "dPsi"); + // Create blocks for VRPN data + ps->vrpn_x = graph_add_node_const(graph, "VRPN X"); + ps->vrpn_y = graph_add_node_const(graph, "VRPN Y"); + ps->vrpn_alt = graph_add_node_const(graph, "VRPN Alt"); + // Create blocks for RC controller ps->rc_pitch = graph_add_node_const(graph, "RC Pitch"); ps->rc_roll = graph_add_node_const(graph, "RC Roll"); @@ -67,7 +95,7 @@ graph_set_source(graph, ps->pitch_r_pid, PID_SETPOINT, ps->pitch_pid, PID_CORRECTION); graph_set_source(graph, ps->pitch_r_pid, PID_CUR_POINT, ps->theta_dot, CONST_VAL); graph_set_source(graph, ps->pitch_r_pid, PID_DT, ps->dt, CONST_VAL); - graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->rc_pitch, CONST_VAL); + //graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->rc_pitch, CONST_VAL); graph_set_source(graph, ps->pitch_pid, PID_CUR_POINT, ps->cur_pitch, CONST_VAL); graph_set_source(graph, ps->pitch_pid, PID_DT, ps->dt, CONST_VAL); @@ -75,7 +103,7 @@ graph_set_source(graph, ps->roll_r_pid, PID_SETPOINT, ps->roll_pid, PID_CORRECTION); graph_set_source(graph, ps->roll_r_pid, PID_CUR_POINT, ps->phi_dot, CONST_VAL); graph_set_source(graph, ps->roll_r_pid, PID_DT, ps->dt, CONST_VAL); - graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->rc_roll, CONST_VAL); + //graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->rc_roll, CONST_VAL); graph_set_source(graph, ps->roll_pid, PID_CUR_POINT, ps->cur_roll, CONST_VAL); graph_set_source(graph, ps->roll_pid, PID_DT, ps->dt, CONST_VAL); @@ -83,15 +111,30 @@ graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->rc_yaw, PID_CORRECTION); graph_set_source(graph, ps->yaw_r_pid, PID_CUR_POINT, ps->psi_dot, CONST_VAL); graph_set_source(graph, ps->yaw_r_pid, PID_DT, ps->dt, CONST_VAL); - /* - graph_set_source(graph, ps->yaw_pid, PID_SETPOINT, ps->rc_yaw, CONST_VAL); - graph_set_source(graph, ps->yaw_pid, PID_CUR_POINT, ps->yaw, CONST_VAL); - graph_set_source(graph, ps->yaw_pid, PID_DT, ps->dt, CONST_VAL); - */ - // Connect angle clamping blocks - graph_set_source(graph, ps->clamp_pitch, BOUNDS_IN, ps->y_pos_pid, PID_CORRECTION); + + // X autonomous + graph_set_source(graph, ps->x_pos_pid, PID_DT, ps->dt, CONST_VAL); graph_set_source(graph, ps->clamp_roll, BOUNDS_IN, ps->x_pos_pid, PID_CORRECTION); + graph_set_source(graph, ps->x_pos_pid, PID_CUR_POINT, ps->vrpn_x, CONST_VAL); + graph_set_source(graph, ps->x_pos_pid, PID_SETPOINT, ps->x_set, CONST_VAL); + // Y autonomous + graph_set_source(graph, ps->y_pos_pid, PID_DT, ps->dt, CONST_VAL); + graph_set_source(graph, ps->clamp_pitch, BOUNDS_IN, ps->y_pos_pid, PID_CORRECTION); + graph_set_source(graph, ps->y_pos_pid, PID_CUR_POINT, ps->vrpn_y, CONST_VAL); + graph_set_source(graph, ps->y_pos_pid, PID_SETPOINT, ps->y_set, CONST_VAL); + // Alt autonomous + graph_set_source(graph, ps->alt_pid, PID_DT, ps->dt, CONST_VAL); + graph_set_source(graph, ps->alt_pid, PID_CUR_POINT, ps->vrpn_alt, CONST_VAL); + graph_set_source(graph, ps->alt_pid, PID_SETPOINT, ps->alt_set, CONST_VAL); + graph_set_source(graph, ps->alt_set, CONST_VAL, ps->vrpn_alt, CONST_VAL); + graph_set_source(graph, ps->throttle_trim_add, ADD_SUMMAND1, ps->alt_pid, PID_CORRECTION); + graph_set_source(graph, ps->throttle_trim_add, ADD_SUMMAND2, ps->throttle_trim, CONST_VAL); + // Yaw autonomous + graph_set_source(graph, ps->yaw_pid, PID_DT, ps->dt, CONST_VAL); + graph_set_source(graph, ps->yaw_pid, PID_SETPOINT, ps->yaw_set, CONST_VAL); + graph_set_source(graph, ps->yaw_pid, PID_CUR_POINT, ps->cur_yaw, CONST_VAL); + // Connect PWM clamping blocks graph_set_source(graph, ps->clamp_d_pwmP, BOUNDS_IN, ps->pitch_r_pid, PID_CORRECTION); @@ -99,11 +142,14 @@ graph_set_source(graph, ps->clamp_d_pwmY, BOUNDS_IN, ps->yaw_r_pid, PID_CORRECTION); // Connect signal mixer - graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, CONST_VAL); + //graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, CONST_VAL); graph_set_source(graph, ps->mixer, MIXER_PITCH, ps->clamp_d_pwmP, BOUNDS_OUT); graph_set_source(graph, ps->mixer, MIXER_ROLL, ps->clamp_d_pwmR, BOUNDS_OUT); graph_set_source(graph, ps->mixer, MIXER_YAW, ps->clamp_d_pwmY, BOUNDS_OUT); + // Set initial mode + connect_manual(ps); + // Set pitch PID constants graph_set_param_val(graph, ps->pitch_pid, PID_KP, PITCH_ANGLE_KP); graph_set_param_val(graph, ps->pitch_pid, PID_KI, PITCH_ANGLE_KI); @@ -128,6 +174,18 @@ graph_set_param_val(graph, ps->yaw_r_pid, PID_KI, YAW_ANGULAR_VELOCITY_KI); graph_set_param_val(graph, ps->yaw_r_pid, PID_KD, YAW_ANGULAR_VELOCITY_KD); + // Set X/Y/Alt constants + graph_set_param_val(graph, ps->x_pos_pid, PID_KP, XPOS_KP); + graph_set_param_val(graph, ps->x_pos_pid, PID_KI, XPOS_KI); + graph_set_param_val(graph, ps->x_pos_pid, PID_KD, XPOS_KD); + graph_set_param_val(graph, ps->y_pos_pid, PID_KP, YPOS_KP); + graph_set_param_val(graph, ps->y_pos_pid, PID_KI, YPOS_KI); + graph_set_param_val(graph, ps->y_pos_pid, PID_KD, YPOS_KD); + graph_set_param_val(graph, ps->alt_pid, PID_KP, ALT_ZPOS_KP); + graph_set_param_val(graph, ps->alt_pid, PID_KI, ALT_ZPOS_KI); + graph_set_param_val(graph, ps->alt_pid, PID_KD, ALT_ZPOS_KD); + + // Set angle clamping limits graph_set_param_val(graph, ps->clamp_pitch, BOUNDS_MIN, -ROLL_PITCH_MAX_ANGLE); graph_set_param_val(graph, ps->clamp_pitch, BOUNDS_MAX, ROLL_PITCH_MAX_ANGLE); @@ -161,23 +219,12 @@ if(cur_fm_switch == MANUAL_FLIGHT_MODE) user_defined_struct->flight_mode = MANUAL_FLIGHT_MODE; - static float roll_trim = 0.0; - static float pitch_trim = 0.0; - // flap switch was just toggled to auto flight mode if((last_fm_switch != cur_fm_switch) && (cur_fm_switch == AUTO_FLIGHT_MODE)) { user_defined_struct->engaging_auto = 1; - // Read in trimmed values because it should read trim values right when the pilot flips the flight mode switch - pitch_trim = user_input_struct->pitch_angle_manual_setpoint; //rc_commands[PITCH] - PITCH_CENTER; - roll_trim = user_input_struct->roll_angle_manual_setpoint; //rc_commands[ROLL] - ROLL_CENTER; - //sensor_struct->trimmedRCValues.yaw = yaw_manual_setpoint; //rc_commands[YAW] - YAW_CENTER; - -// sensor_struct->trims.roll = raw_actuator_struct->controller_corrected_motor_commands[ROLL]; -// sensor_struct->trims.pitch = raw_actuator_struct->controller_corrected_motor_commands[PITCH]; -// sensor_struct->trims.yaw = raw_actuator_struct->controller_corrected_motor_commands[YAW]; - sensor_struct->trims.throttle = user_input_struct->rc_commands[THROTTLE]; + graph_set_param_val(graph, parameter_struct->throttle_trim, CONST_SET, user_input_struct->rc_commands[THROTTLE]); log_struct->trims.roll = sensor_struct->trims.roll; log_struct->trims.pitch = sensor_struct->trims.pitch; @@ -194,26 +241,13 @@ // also reset the previous error and accumulated error from the position PIDs if((cur_fm_switch == AUTO_FLIGHT_MODE) && (user_defined_struct->engaging_auto == 2)) { - // TODO: Change this to reconnect PIDs - /* - // zero out the accumulated error so the I terms don't cause wild things to happen - parameter_struct->pid_controllers[ALT_ID].acc_error = 0.0; - parameter_struct->pid_controllers[LOCAL_X_ID].acc_error = 0.0; - parameter_struct->pid_controllers[LOCAL_Y_ID].acc_error = 0.0; - - // make previous error equal to the current so the D term doesn't spike - parameter_struct->pid_controllers[ALT_ID].prev_error = 0.0; - parameter_struct->pid_controllers[LOCAL_X_ID].prev_error = 0.0; - parameter_struct->pid_controllers[LOCAL_Y_ID].prev_error = 0.0; - - setpoint_struct->desiredQuadPosition.alt_pos = sensor_struct->currentQuadPosition.alt_pos; - setpoint_struct->desiredQuadPosition.x_pos = sensor_struct->currentQuadPosition.x_pos; - setpoint_struct->desiredQuadPosition.y_pos = sensor_struct->currentQuadPosition.y_pos; - setpoint_struct->desiredQuadPosition.yaw = 0.0;//currentQuadPosition.yaw; + graph_set_param_val(graph, parameter_struct->x_set, CONST_SET, sensor_struct->currentQuadPosition.x_pos); + graph_set_param_val(graph, parameter_struct->y_set, CONST_SET, sensor_struct->currentQuadPosition.y_pos); + graph_set_param_val(graph, parameter_struct->alt_set, CONST_SET, sensor_struct->currentQuadPosition.alt_pos); + graph_set_param_val(graph, parameter_struct->yaw_set, CONST_SET, sensor_struct->currentQuadPosition.yaw); // reset the flag that engages auto mode user_defined_struct->engaging_auto = 0; - */ // finally engage the AUTO_FLIGHT_MODE // this ensures that we've gotten a new update packet right after the switch was set to auto mode user_defined_struct->flight_mode = AUTO_FLIGHT_MODE; @@ -226,61 +260,26 @@ * a pitch or roll for the angle loop PIDs */ -// static int counter_between_packets = 0; - if(user_input_struct->locationFresh) { - // TODO: Change this to populate VRPN block - /* - parameter_struct->pid_controllers[LOCAL_Y_ID].current_point = sensor_struct->currentQuadPosition.y_pos; - parameter_struct->pid_controllers[LOCAL_Y_ID].setpoint = setpoint_struct->desiredQuadPosition.y_pos; - - parameter_struct->pid_controllers[LOCAL_X_ID].current_point = sensor_struct->currentQuadPosition.x_pos; - parameter_struct->pid_controllers[LOCAL_X_ID].setpoint = setpoint_struct->desiredQuadPosition.x_pos; - - parameter_struct->pid_controllers[ALT_ID].current_point = sensor_struct->currentQuadPosition.alt_pos; - parameter_struct->pid_controllers[ALT_ID].setpoint = setpoint_struct->desiredQuadPosition.alt_pos; - */ - //logging and PID computation - //log_struct->local_y_PID_values = pid_computation(&(parameter_struct->pid_controllers[LOCAL_Y_ID])); - //log_struct->local_x_PID_values = pid_computation(&(parameter_struct->pid_controllers[LOCAL_X_ID])); - //log_struct->altitude_PID_values = pid_computation(&(parameter_struct->pid_controllers[ALT_ID])); - - // yaw angular position PID calculation - graph_set_param_val(graph, parameter_struct->cur_yaw, CONST_SET, sensor_struct->currentQuadPosition.yaw); - // TODO: Set yaw setpoint - //parameter_struct->pid_controllers[YAW_ID].current_point = sensor_struct->currentQuadPosition.yaw;// in radians - //parameter_struct->pid_controllers[YAW_ID].setpoint = setpoint_struct->desiredQuadPosition.yaw; // constant setpoint - - //logging and PID computation - //log_struct->angle_yaw_PID_values = pid_computation(&(parameter_struct->pid_controllers[YAW_ID])); - + // VRPN values + graph_set_param_val(graph, parameter_struct->vrpn_x, CONST_SET, sensor_struct->currentQuadPosition.x_pos); + graph_set_param_val(graph, parameter_struct->vrpn_y, CONST_SET, sensor_struct->currentQuadPosition.y_pos); + graph_set_param_val(graph, parameter_struct->vrpn_alt, CONST_SET, sensor_struct->currentQuadPosition.alt_pos); + graph_set_param_val(graph, parameter_struct->cur_yaw, CONST_SET, sensor_struct->currentQuadPosition.yaw); } - + // Sensor values graph_set_param_val(graph, parameter_struct->cur_pitch, CONST_SET, sensor_struct->pitch_angle_filtered); graph_set_param_val(graph, parameter_struct->cur_roll, CONST_SET, sensor_struct->roll_angle_filtered); graph_set_param_val(graph, parameter_struct->theta_dot, CONST_SET, sensor_struct->theta_dot); graph_set_param_val(graph, parameter_struct->phi_dot, CONST_SET, sensor_struct->phi_dot); graph_set_param_val(graph, parameter_struct->psi_dot, CONST_SET, sensor_struct->psi_dot); - + // RC values graph_set_param_val(graph, parameter_struct->rc_pitch, CONST_SET, user_input_struct->pitch_angle_manual_setpoint); graph_set_param_val(graph, parameter_struct->rc_roll, CONST_SET, user_input_struct->roll_angle_manual_setpoint); graph_set_param_val(graph, parameter_struct->rc_yaw, CONST_SET, user_input_struct->yaw_manual_setpoint); graph_set_param_val(graph, parameter_struct->rc_throttle, CONST_SET, user_input_struct->rc_commands[THROTTLE]); - - /*parameter_struct->pid_controllers[PITCH_ID].setpoint = - (user_defined_struct->flight_mode == AUTO_FLIGHT_MODE)? - (parameter_struct->pid_controllers[LOCAL_X_ID].pid_correction) + pitch_trim : user_input_struct->pitch_angle_manual_setpoint; - - parameter_struct->pid_controllers[ROLL_ID].setpoint = - (user_defined_struct->flight_mode == AUTO_FLIGHT_MODE)? - (parameter_struct->pid_controllers[LOCAL_Y_ID].pid_correction) + roll_trim : user_input_struct->roll_angle_manual_setpoint; - */ - /* - int outputs[3] = {parameter_struct->pitch_r_pid, - parameter_struct->roll_r_pid, - parameter_struct->yaw_r_pid};*/ int outputs[1] = {parameter_struct->mixer}; graph_compute_nodes(graph, outputs, 1); @@ -291,39 +290,6 @@ if((user_input_struct->rc_commands[THROTTLE] > 118000) || (user_defined_struct->flight_mode == AUTO_FLIGHT_MODE)) { - - if(user_defined_struct->flight_mode == AUTO_FLIGHT_MODE) - { - /* - //THROTTLE - raw_actuator_struct->controller_corrected_motor_commands[THROTTLE] = - ((int)(parameter_struct->pid_controllers[ALT_ID].pid_correction)) + sensor_struct->trims.throttle; - - //ROLL - raw_actuator_struct->controller_corrected_motor_commands[ROLL] = - parameter_struct->pid_controllers[ROLL_RATE_ID].pid_correction; // + sensor_struct->trims.roll; - - //PITCH - raw_actuator_struct->controller_corrected_motor_commands[PITCH] = - parameter_struct->pid_controllers[PITCH_RATE_ID].pid_correction; // + sensor_struct->trims.pitch; - - //YAW - raw_actuator_struct->controller_corrected_motor_commands[YAW] = - parameter_struct->pid_controllers[YAW_RATE_ID].pid_correction;// + sensor_struct->trims.yaw; - */ - -// static int slow_down = 0; -// slow_down++; -// if(slow_down % 50 == 0) -// printf("X: %.3f\tY: %.3f\tZ: %.3f\tX_s: %.3f\tX_c: %.3f\tY_s: %.3f\tY_c: %.3f\tZ_s: %.3f\tZ_c: %.3f\t\n", -// parameter_struct->pid_controllers[LOCAL_X_ID].pid_correction, -// parameter_struct->pid_controllers[LOCAL_Y_ID].pid_correction, -// parameter_struct->pid_controllers[ALT_ID].pid_correction, -// parameter_struct->pid_controllers[LOCAL_X_ID].setpoint, parameter_struct->pid_controllers[LOCAL_X_ID].current_point, -// parameter_struct->pid_controllers[LOCAL_Y_ID].setpoint, parameter_struct->pid_controllers[LOCAL_Y_ID].current_point, -// parameter_struct->pid_controllers[ALT_ID].setpoint, parameter_struct->pid_controllers[ALT_ID].current_point); - } - else{ //THROTTLE actuator_struct->pwms[0] = graph_get_output(graph, parameter_struct->mixer, MIXER_PWM0); @@ -332,32 +298,6 @@ actuator_struct->pwms[2] = graph_get_output(graph, parameter_struct->mixer, MIXER_PWM2); actuator_struct->pwms[3] = graph_get_output(graph, parameter_struct->mixer, MIXER_PWM3); - } - - /* - //BOUNDS CHECKING - if(raw_actuator_struct->controller_corrected_motor_commands[THROTTLE] < 0) - raw_actuator_struct->controller_corrected_motor_commands[THROTTLE] = 0; - - //BOUNDS CHECKING - if(raw_actuator_struct->controller_corrected_motor_commands[ROLL] > 20000) - raw_actuator_struct->controller_corrected_motor_commands[ROLL] = 20000; - - if(raw_actuator_struct->controller_corrected_motor_commands[ROLL] < -20000) - raw_actuator_struct->controller_corrected_motor_commands[ROLL] = -20000; - - if(raw_actuator_struct->controller_corrected_motor_commands[PITCH] > 20000) - raw_actuator_struct->controller_corrected_motor_commands[PITCH] = 20000; - - if(raw_actuator_struct->controller_corrected_motor_commands[PITCH] < -20000) - raw_actuator_struct->controller_corrected_motor_commands[PITCH] = -20000; - - if(raw_actuator_struct->controller_corrected_motor_commands[YAW] > 20000) - raw_actuator_struct->controller_corrected_motor_commands[YAW] = 20000; - - if(raw_actuator_struct->controller_corrected_motor_commands[YAW] < -20000) - raw_actuator_struct->controller_corrected_motor_commands[YAW] = -20000; - */ } else { @@ -365,10 +305,6 @@ actuator_struct->pwms[1] = user_input_struct->rc_commands[THROTTLE]; actuator_struct->pwms[2] = user_input_struct->rc_commands[THROTTLE]; actuator_struct->pwms[3] = user_input_struct->rc_commands[THROTTLE]; - /* - raw_actuator_struct->controller_corrected_motor_commands[ROLL] = 0; - raw_actuator_struct->controller_corrected_motor_commands[PITCH] = 0; - raw_actuator_struct->controller_corrected_motor_commands[YAW] = 0;*/ } //logging diff --git a/quad/sw/modular_quad_pid/src/graph_blocks/node_add.c b/quad/sw/modular_quad_pid/src/graph_blocks/node_add.c new file mode 120000 index 0000000000000000000000000000000000000000..d7025e0c28ea1028022b77e23924a7734ee55e00 --- /dev/null +++ b/quad/sw/modular_quad_pid/src/graph_blocks/node_add.c @@ -0,0 +1 @@ +../../../../computation_graph/src/graph_blocks/node_add.c \ No newline at end of file diff --git a/quad/sw/modular_quad_pid/src/graph_blocks/node_add.h b/quad/sw/modular_quad_pid/src/graph_blocks/node_add.h new file mode 120000 index 0000000000000000000000000000000000000000..4f4b0ea11eb74e5c45426122afb754f13b098266 --- /dev/null +++ b/quad/sw/modular_quad_pid/src/graph_blocks/node_add.h @@ -0,0 +1 @@ +../../../../computation_graph/src/graph_blocks/node_add.h \ No newline at end of file diff --git a/quad/sw/modular_quad_pid/src/type_def.h b/quad/sw/modular_quad_pid/src/type_def.h index cdc34ce167adaa61f410570fda6edb13f866293a..efc37f2f8849c26397c74674dcd00bf3dfefaa46 100644 --- a/quad/sw/modular_quad_pid/src/type_def.h +++ b/quad/sw/modular_quad_pid/src/type_def.h @@ -307,11 +307,20 @@ typedef struct parameter_t { int theta_dot; int phi_dot; int psi_dot; + // VRPN blocks + int vrpn_x; + int vrpn_y; + int vrpn_alt; // RC blocks int rc_pitch; int rc_roll; int rc_yaw; int rc_throttle; + // Desired positions + int x_set; + int y_set; + int alt_set; + int yaw_set; // Loop time int dt; // Signal mixer @@ -322,6 +331,9 @@ typedef struct parameter_t { int clamp_d_pwmR; // Clamp the change in PWM values for roll int clamp_d_pwmP; // ... pitch int clamp_d_pwmY; // ... yaw + // "trim" for autonomous + int throttle_trim; + int throttle_trim_add; } parameter_t; /**