diff --git a/quad/Makefile b/quad/Makefile index 002f34a72fe3e8db7f63456bb0ba22bb9f9f931e..2cabb0468cc8658db03b3bdec963d1f9d0f47f61 100644 --- a/quad/Makefile +++ b/quad/Makefile @@ -18,15 +18,15 @@ libs: $(MAKE) -C src/commands $(MAKE) -C src/quad_app -bins: - $(MAKE) -C src/virt_quad +bins: libs + $(MAKE) -C src/virt_quad clean default + $(MAKE) -C src/gen_diagram clean default zybo: bash scripts/build_zybo.sh # For creating an image of the control network. -gen_diagram: - $(MAKE) -C src/gen_diagram +diagram: bins bash src/gen_diagram/create_png.sh boot: $(BOOT) diff --git a/quad/src/computation_graph/computation_graph.c b/quad/src/computation_graph/computation_graph.c index f20a0d0f50f4824fd41baab7f2adb80a3a8d1960..81ebbf44e5dbdd5e07d039619d26093c4f53ce16 100644 --- a/quad/src/computation_graph/computation_graph.c +++ b/quad/src/computation_graph/computation_graph.c @@ -11,9 +11,9 @@ static double exec_input_vals[GRAPH_MAX_INPUTS]; // Macro functions for setting and clearing single bits in int array // From http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html -#define setBit(A,k) ( A[(k / (8*sizeof(&A)))] |= (1 << (k % (8*sizeof(&A)))) ) -#define clearBit(A,k) ( A[(k / (8*sizeof(&A)))] &= ~(1 << (k % (8*sizeof(&A)))) ) -#define testBit(A,k) ( A[(k / (8*sizeof(&A)))] & (1 << (k % (8*sizeof(&A)))) ) +#define setBit(A,k) ( A[(k / (8*sizeof(*A)))] |= (1 << (k % (8*sizeof(*A)))) ) +#define clearBit(A,k) ( A[(k / (8*sizeof(*A)))] &= ~(1 << (k % (8*sizeof(*A)))) ) +#define testBit(A,k) ( A[(k / (8*sizeof(*A)))] & (1 << (k % (8*sizeof(*A)))) ) struct computation_graph *create_graph() { struct computation_graph *the_graph = malloc(sizeof(struct computation_graph)); diff --git a/quad/src/gen_diagram/Makefile b/quad/src/gen_diagram/Makefile index 302077f0c7aa1fe819be10487b269eb3f478fd8f..c9b2f683d2857f7435fdd615f8ba05334d49c9af 100644 --- a/quad/src/gen_diagram/Makefile +++ b/quad/src/gen_diagram/Makefile @@ -1,6 +1,9 @@ +# Running this make file directly will not re-link with quad_app, even if it has changed +# You should run `make diagram` from the top-level quad folder TOP=../.. NAME = gen_diagram -REQLIBS = -lquad_app, -lgraph_blocks, -lcomputation_graph +REQLIBS = -lquad_app -lgraph_blocks -lcomputation_graph -lm -include $(TOP)/library.mk \ No newline at end of file + +include $(TOP)/executable.mk \ No newline at end of file diff --git a/quad/src/gen_diagram/create_png.sh b/quad/src/gen_diagram/create_png.sh index dae08313279d6dcc2c9f10d544f2308ace38d931..5c4a2939cf9eda23eb267bc95ca3e6818ce4e846 100755 --- a/quad/src/gen_diagram/create_png.sh +++ b/quad/src/gen_diagram/create_png.sh @@ -1,4 +1,6 @@ #/bin/bash -dot -Tpng "$(dirname $0)/network.dot" -o "$(dirname $0)/network.png" +cd $(dirname $0) +./../../bin/gen_diagram +dot -Tpng network.dot -o network.png diff --git a/quad/src/gen_diagram/generate.c b/quad/src/gen_diagram/generate.c index 9b7b323729b2673330350513b2bec89a7142ac6e..3e712a2c04ded92ebc4e3465fcfb5404b466af19 100644 --- a/quad/src/gen_diagram/generate.c +++ b/quad/src/gen_diagram/generate.c @@ -1,4 +1,5 @@ #include <stdio.h> +#include "computation_graph.h" #include "control_algorithm.h" int main() { diff --git a/quad/src/gen_diagram/network.dot b/quad/src/gen_diagram/network.dot index bd697cf68bc407933c1fb0899382e20387b768ed..862aace068984b2f3bddf264eb8873d092ef1a27 100644 --- a/quad/src/gen_diagram/network.dot +++ b/quad/src/gen_diagram/network.dot @@ -7,7 +7,7 @@ label="<f0>Roll PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [ "Ts_IMU" -> "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] |<f7> [alpha=0.000]"] -"Pitch" -> "Pitch PID":f1 [label="Constant"] +"Pitch trim add" -> "Pitch PID":f1 [label="Sum"] "RC Pitch" -> "Pitch PID":f2 [label="Constant"] "Ts_IMU" -> "Pitch PID":f3 [label="Constant"] "Yaw PID"[shape=record @@ -65,6 +65,12 @@ label="<f0>Pitch |<f1> [Constant=0.000]"] label="<f0>Roll |<f1> [Constant=0.000]"] "Yaw"[shape=record label="<f0>Yaw |<f1> [Constant=0.000]"] +"Pitch trim"[shape=record +label="<f0>Pitch trim |<f1> [Constant=0.000]"] +"Pitch trim add"[shape=record +label="<f0>Pitch trim add |<f1> --\>Summand 1 |<f2> --\>Summand 2"] +"Pitch trim" -> "Pitch trim add":f1 [label="Constant"] +"Pitch" -> "Pitch trim add":f2 [label="Constant"] "dTheta"[shape=record label="<f0>dTheta |<f1> [Constant=0.000]"] "dPhi"[shape=record diff --git a/quad/src/gen_diagram/network.png b/quad/src/gen_diagram/network.png index 3152aa2cf13de32d5cab578f0a029869757c325c..65999177c759abd9b73da5ee19f7b4fea3b766e4 100644 Binary files a/quad/src/gen_diagram/network.png and b/quad/src/gen_diagram/network.png differ diff --git a/quad/src/quad_app/PID.h b/quad/src/quad_app/PID.h index 4c5e4b81f0273a9a62aa175b6c0f350914fb67a2..5a83225b0b9813e4d311bf61c8f1eae89c7f24a0 100644 --- a/quad/src/quad_app/PID.h +++ b/quad/src/quad_app/PID.h @@ -21,7 +21,7 @@ //#define YAW_ANGLE_KD 0.0f // when using units of radians -#define YAW_ANGULAR_VELOCITY_KP 190.0f * 2292.0f//200.0f * 2292.0f +#define YAW_ANGULAR_VELOCITY_KP 29700//200.0f * 2292.0f #define YAW_ANGULAR_VELOCITY_KI 0.0f #define YAW_ANGULAR_VELOCITY_KD 0.0f #define YAW_ANGLE_KP 2.6f diff --git a/quad/src/quad_app/control_algorithm.c b/quad/src/quad_app/control_algorithm.c index 424f098cbe02be1fb3e7707b6383fa0814c99957..3002cfc2697bc760dd657e4f7d6fa11df0264577 100644 --- a/quad/src/quad_app/control_algorithm.c +++ b/quad/src/quad_app/control_algorithm.c @@ -13,8 +13,8 @@ #include "util.h" #include "timer.h" -#define ROLL_PITCH_MAX_ANGLE 1.5708 // 90 degrees -#define PWM_DIFF_BOUNDS 30000 +#define ROLL_PITCH_MAX_ANGLE 0.35 // 20 degrees +#define PWM_DIFF_BOUNDS 20000 #define VRPN_REFRESH_TIME 0.01f // 10ms void connect_autonomous(parameter_t* ps) { diff --git a/quad/src/quad_app/iic_utils.c b/quad/src/quad_app/iic_utils.c index 90cdfb6872963b2c3ef5c7437a8abb9435e0c581..a0061e6b00432768feded1b15495c850fad5a914 100644 --- a/quad/src/quad_app/iic_utils.c +++ b/quad/src/quad_app/iic_utils.c @@ -30,7 +30,7 @@ int iic0_mpu9150_start(){ // Set clock reference to Z Gyro iic0_mpu9150_write(0x6B, 0x03); // Configure Digital Low/High Pass filter - iic0_mpu9150_write(0x1A,0x06); // Level 6 low pass on gyroscope + iic0_mpu9150_write(0x1A,0x05); // Level 5 low pass on gyroscope // Configure Gyro to 2000dps, Accel. to +/-8G iic0_mpu9150_write(0x1B, 0x18); diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c index 9448fc10d5d47ec8e32c31e364983f5a94a8c873..3e67c14aa36862cae1ad885955e944a86056007b 100644 --- a/quad/src/quad_app/log_data.c +++ b/quad/src/quad_app/log_data.c @@ -112,6 +112,9 @@ void initialize_logging(log_t* log_struct, parameter_t* ps) { addOutputToLog(log_struct, ps->vrpn_alt, CONST_VAL, m); addOutputToLog(log_struct, ps->vrpn_pitch, CONST_VAL, rad); addOutputToLog(log_struct, ps->vrpn_roll, CONST_VAL, rad); + addOutputToLog(log_struct, ps->x_set, CONST_VAL, m); + addOutputToLog(log_struct, ps->y_set, CONST_VAL, m); + addOutputToLog(log_struct, ps->alt_set, CONST_VAL, m); addOutputToLog(log_struct, ps->mixer, MIXER_PWM0, pwm_val); addOutputToLog(log_struct, ps->mixer, MIXER_PWM1, pwm_val); addOutputToLog(log_struct, ps->mixer, MIXER_PWM2, pwm_val); diff --git a/quad/src/quad_app/log_data.h b/quad/src/quad_app/log_data.h index 34f1658d02f316918547bc0eedd760bcbf121264..becc2c2e188a819e1e9735cc625e93dd514f52c7 100644 --- a/quad/src/quad_app/log_data.h +++ b/quad/src/quad_app/log_data.h @@ -9,7 +9,7 @@ #define LOG_DATA_H_ #include "type_def.h" -#define LOG_STARTING_SIZE 8192 //262144 // 2^18 32768 2^15 +#define LOG_STARTING_SIZE 60000 //262144 // 2^18 32768 2^15 // Maximum number of block outputs you can record, and maximum number of block parameters to record #define MAX_LOG_NUM 50 diff --git a/quad/src/quad_app/quad_app.c b/quad/src/quad_app/quad_app.c index 1e301732814d8cf7faba2984ca192c99387afb00..01eabe9017f733685ae8f9737398099e657a0bf0 100644 --- a/quad/src/quad_app/quad_app.c +++ b/quad/src/quad_app/quad_app.c @@ -75,15 +75,12 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct)) // update the GUI update_GUI(&(structs.log_struct)); - // Processing of loop timer at the end of the control loop - timer_end_loop(&(structs.log_struct)); - if (!this_kill_condition) { + // Log the data collected in this loop + log_data(&(structs.log_struct), &(structs.parameter_struct)); + if(structs.user_defined_struct.flight_mode == AUTO_FLIGHT_MODE) { - // Log the data collected in this loop - log_data(&(structs.log_struct), &(structs.parameter_struct)); - static int loop_counter = 0; loop_counter++; @@ -113,6 +110,9 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct)) } last_kill_condition = this_kill_condition; + + // Processing of loop timer at the end of the control loop + timer_end_loop(&(structs.log_struct)); } kill_motors(&(structs.hardware_struct.pwm_outputs));