From e90f2636ac6a8646aec02232bc94d770fda0d2ea Mon Sep 17 00:00:00 2001 From: David Wehr <dawehr@iastate.edu> Date: Sat, 18 Feb 2017 00:01:34 -0600 Subject: [PATCH] Fixed X/Y and roll/pitch correspondence. Please enter the commit message for your changes. Lines starting --- .../modular_quad_pid/gen_diagram/gen_diagram | Bin 24170 -> 23720 bytes .../modular_quad_pid/gen_diagram/network.dot | 8 ++++---- quad/sw/modular_quad_pid/src/callbacks.c | 11 ++++++++++- .../modular_quad_pid/src/control_algorithm.c | 17 ++++++----------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/quad/sw/modular_quad_pid/gen_diagram/gen_diagram b/quad/sw/modular_quad_pid/gen_diagram/gen_diagram index c39dfb12558e81c2f9a4d6d6932afa7e726249ba..aa2340340c56fb06d2f034d2a9ce4c3dc25b885f 100755 GIT binary patch literal 23720 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 literal 24170 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 RYHG?HBlzevM!IT;{|oCBtmgm# diff --git a/quad/sw/modular_quad_pid/gen_diagram/network.dot b/quad/sw/modular_quad_pid/gen_diagram/network.dot index 8ebddda8b..022e6781f 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/network.dot +++ b/quad/sw/modular_quad_pid/gen_diagram/network.dot @@ -3,12 +3,12 @@ rankdir="LR" "Roll PID"[shape=record label="<f0>Roll PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=15.000] |<f5> [Ki=0.000] |<f6> [Kd=0.200]"] "Roll" -> "Roll PID":f1 [label="Constant"] -"RC Roll" -> "Roll PID":f2 [label="Constant"] +"Roll Clamp" -> "Roll PID":f2 [label="Bounded"] "dT" -> "Roll PID":f3 [label="Constant"] "Pitch PID"[shape=record label="<f0>Pitch PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=15.000] |<f5> [Ki=0.000] |<f6> [Kd=0.200]"] "Pitch" -> "Pitch PID":f1 [label="Constant"] -"RC Pitch" -> "Pitch PID":f2 [label="Constant"] +"Pitch Clamp" -> "Pitch PID":f2 [label="Bounded"] "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]"] @@ -70,10 +70,10 @@ label="<f0>Y PWM Clamp |<f1> --\>Bounds in |<f2> [Min=-20000.000] |<f3> [Max=20 "Yaw Rate PID" -> "Y PWM Clamp":f1 [label="Correction"] "Pitch Clamp"[shape=record label="<f0>Pitch Clamp |<f1> --\>Bounds in |<f2> [Min=-0.349] |<f3> [Max=0.349]"] -"Y pos PID" -> "Pitch Clamp":f1 [label="Correction"] +"X pos PID" -> "Pitch Clamp":f1 [label="Correction"] "Roll Clamp"[shape=record label="<f0>Roll Clamp |<f1> --\>Bounds in |<f2> [Min=-0.349] |<f3> [Max=0.349]"] -"X pos PID" -> "Roll Clamp":f1 [label="Correction"] +"Y pos PID" -> "Roll Clamp":f1 [label="Correction"] "Pitch"[shape=record label="<f0>Pitch |<f1> [Constant=0.000]"] "Roll"[shape=record diff --git a/quad/sw/modular_quad_pid/src/callbacks.c b/quad/sw/modular_quad_pid/src/callbacks.c index 2fb49c0f4..36f393434 100644 --- a/quad/sw/modular_quad_pid/src/callbacks.c +++ b/quad/sw/modular_quad_pid/src/callbacks.c @@ -16,8 +16,17 @@ static size_t total_payload_received = 0; /** * Currently does nothing. */ -int debug(modular_structs_t *structs) +int cb_debug(modular_structs_t *structs) { + char buf[255]; + + // Get the node ID, parameter ID, parameter value + u8 node_id = uart_buff_data_get_u8(0); + struct computation_graph* graph = structs->parameter_struct.graph; + float param_val = graph_get_output(graph, node_id, 0); + + int length = snprintf(buf, sizeof buf, "%f", param_val); + send_data(DEBUG_ID, 0, buf, length >= sizeof(buf) ? 255 : length + 1); return 0; } diff --git a/quad/sw/modular_quad_pid/src/control_algorithm.c b/quad/sw/modular_quad_pid/src/control_algorithm.c index f02329479..f18f39b76 100644 --- a/quad/sw/modular_quad_pid/src/control_algorithm.c +++ b/quad/sw/modular_quad_pid/src/control_algorithm.c @@ -22,21 +22,16 @@ 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->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); - */ - connect_autonomous(ps); - graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->rc_yaw, CONST_VAL); - graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, CONST_VAL); } int control_algorithm_init(parameter_t * ps) @@ -54,7 +49,7 @@ int control_algorithm_init(parameter_t * ps) 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 PID"); - ps->x_set = graph_add_node_const(graph, "X Setpoint"); + ps->x_set = graph_add_node_const(graph, "X Setpoint"); // ID 9 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"); @@ -69,7 +64,7 @@ int control_algorithm_init(parameter_t * ps) ps->clamp_roll= graph_add_node_bounds(graph, "Roll Clamp"); // Create blocks for sensor inputs - ps->cur_pitch = graph_add_node_const(graph, "Pitch"); + ps->cur_pitch = graph_add_node_const(graph, "Pitch"); // ID 20 ps->cur_roll = graph_add_node_const(graph, "Roll"); ps->cur_yaw = graph_add_node_const(graph, "Yaw"); // Yaw angular velocity PID @@ -120,12 +115,12 @@ int control_algorithm_init(parameter_t * ps) // 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->clamp_pitch, 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->clamp_roll, 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 @@ -222,7 +217,7 @@ int control_algorithm_init(parameter_t * ps) // to engage AUTO mode the code waits for a new packet after the flap is switched to auto // before actually engaging AUTO mode if(cur_fm_switch == MANUAL_FLIGHT_MODE) { - if (user_defined_struct->flight_mode == MANUAL_FLIGHT_MODE) { + if (last_fm_switch == AUTO_FLIGHT_MODE) { connect_manual(parameter_struct); } user_defined_struct->flight_mode = MANUAL_FLIGHT_MODE; -- GitLab