diff --git a/quad/src/gen_diagram/network.dot b/quad/src/gen_diagram/network.dot index 8fcbaa05fabb03f710419a8c58bee33255181d55..0e23343d46bd9e6d8ccc1aa4f3136cf515bc74a6 100644 --- a/quad/src/gen_diagram/network.dot +++ b/quad/src/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=35.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.880]"] "Roll" -> "Roll PID":f1 [label="Constant"] -"Yaw Correction" -> "Roll PID":f2 [label="Rotated Y"] +"RC Roll" -> "Roll PID":f2 [label="Constant"] "Ts_IMU" -> "Roll PID":f3 [label="Constant"] "Pitch PID"[shape=record label="<f0>Pitch PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=35.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.880]"] "Pitch trim add" -> "Pitch PID":f1 [label="Sum"] -"Yaw Correction" -> "Pitch PID":f2 [label="Rotated X"] +"RC Pitch" -> "Pitch PID":f2 [label="Constant"] "Ts_IMU" -> "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] |<f7> [alpha=0.000]"] @@ -28,7 +28,7 @@ label="<f0>Pitch Rate PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt | "Yaw Rate PID"[shape=record label="<f0>Yaw Rate PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=29700.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"] "Gyro Z" -> "Yaw Rate PID":f1 [label="Constant"] -"Yaw PID" -> "Yaw Rate PID":f2 [label="Correction"] +"RC Yaw" -> "Yaw Rate PID":f2 [label="Constant"] "Ts_IMU" -> "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.550] |<f5> [Ki=0.007] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"] @@ -69,10 +69,12 @@ label="<f0>Yaw |<f1> [Constant=0.000]"] label="<f0>Lidar |<f1> [Constant=0.000]"] "Flow Vel X"[shape=record label="<f0>Flow Vel X |<f1> [Constant=0.000]"] -"Flow Vel y"[shape=record -label="<f0>Flow Vel y |<f1> [Constant=0.000]"] +"Flow Vel Y"[shape=record +label="<f0>Flow Vel Y |<f1> [Constant=0.000]"] "Flow Quality"[shape=record label="<f0>Flow Quality |<f1> [Constant=0.000]"] +"Flow Distance"[shape=record +label="<f0>Flow Distance |<f1> [Constant=0.000]"] "Pitch trim"[shape=record label="<f0>Pitch trim |<f1> [Constant=0.045]"] "Pitch trim add"[shape=record @@ -143,9 +145,20 @@ label="<f0>Yaw Correction |<f1> --\>Current Yaw |<f2> --\>X Position |<f3> --\> "Yaw" -> "Yaw Correction":f1 [label="Constant"] "X Vel PID" -> "Yaw Correction":f2 [label="Correction"] "Y Vel PID" -> "Yaw Correction":f3 [label="Correction"] +"OF Offset"[shape=record +label="<f0>OF Offset |<f1> --\>Current Yaw |<f2> --\>X Position |<f3> --\>Y Position"] +"OF Offset Add" -> "OF Offset":f1 [label="Sum"] +"Flow Vel X" -> "OF Offset":f2 [label="Constant"] +"Flow Vel Y" -> "OF Offset":f3 [label="Constant"] +"OF Offset Rot"[shape=record +label="<f0>OF Offset Rot |<f1> [Constant=-0.622]"] +"OF Offset Add"[shape=record +label="<f0>OF Offset Add |<f1> --\>Summand 1 |<f2> --\>Summand 2"] +"OF Offset Rot" -> "OF Offset Add":f1 [label="Constant"] +"Yaw" -> "OF Offset Add":f2 [label="Constant"] "Signal Mixer"[shape=record label="<f0>Signal Mixer |<f1> --\>Throttle |<f2> --\>Pitch |<f3> --\>Roll |<f4> --\>Yaw"] -"T trim add" -> "Signal Mixer":f1 [label="Sum"] +"RC Throttle" -> "Signal Mixer":f1 [label="Constant"] "P PWM Clamp" -> "Signal Mixer":f2 [label="Bounded"] "R PWM Clamp" -> "Signal Mixer":f3 [label="Bounded"] "Y PWM Clamp" -> "Signal Mixer":f4 [label="Bounded"] diff --git a/quad/src/gen_diagram/network.png b/quad/src/gen_diagram/network.png index f31c3ad387c1823d7fc69f3477e5aa185fbd5292..d906f88752d0cdace964c10ed08141926a27f46f 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/control_algorithm.c b/quad/src/quad_app/control_algorithm.c index 87c1b3106e8708b4b929c87d4bb07d44805e3912..8160b89543f47c68ee2e1532de97eef064227b06 100644 --- a/quad/src/quad_app/control_algorithm.c +++ b/quad/src/quad_app/control_algorithm.c @@ -16,6 +16,7 @@ //#define USE_LIDAR #define PX4FLOW_QUAL_MIN (100) +#define OF_OFFSET_ANGLE (-0.62204) // -35.64 degrees #define ROLL_PITCH_MAX_ANGLE 0.35 // 20 degrees #define PWM_DIFF_BOUNDS 20000 @@ -105,6 +106,11 @@ int control_algorithm_init(parameter_t * ps) // Converts global X/Y to local X/Y ps->yaw_correction = graph_add_defined_block(graph, BLOCK_YAW_ROT, "Yaw Correction"); + // Optical Flow + ps->of_angle_corr = graph_add_defined_block(graph, BLOCK_YAW_ROT, "OF Offset"); + ps->of_angle_offset = graph_add_defined_block(graph, BLOCK_CONSTANT, "OF Offset Rot"); + ps->of_angle_add = graph_add_defined_block(graph, BLOCK_ADD, "OF Offset Add"); + ps->mixer = graph_add_defined_block(graph, BLOCK_MIXER, "Signal Mixer"); ps->angle_time = graph_add_defined_block(graph, BLOCK_CONSTANT, "Ts_IMU"); @@ -205,6 +211,14 @@ int control_algorithm_init(parameter_t * ps) 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); + // Connect optical flow + graph_set_source(graph, ps->of_angle_add, ADD_SUMMAND1, ps->of_angle_offset, CONST_VAL); + graph_set_source(graph, ps->of_angle_add, ADD_SUMMAND2, ps->cur_yaw, CONST_VAL); + graph_set_source(graph, ps->of_angle_corr, ROT_YAW, ps->of_angle_add, ADD_SUM); + graph_set_source(graph, ps->of_angle_corr, ROT_CUR_X, ps->flow_vel_x, CONST_VAL); + graph_set_source(graph, ps->of_angle_corr, ROT_CUR_Y, ps->flow_vel_y, CONST_VAL); + + // 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); @@ -272,6 +286,7 @@ int control_algorithm_init(parameter_t * ps) // Set trims graph_set_param_val(graph, ps->pitch_trim, CONST_SET, PITCH_TRIM); + graph_set_param_val(graph, ps->of_angle_offset, CONST_SET, OF_OFFSET_ANGLE); // Initial value for sampling periods graph_set_param_val(graph, ps->pos_time, CONST_SET, 0.04); diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c index 338e63bc6a6884a727ac7376d72ef279d41df15a..6b3ae8092da97dee00ebbc83a7aed6b8490e9220 100644 --- a/quad/src/quad_app/log_data.c +++ b/quad/src/quad_app/log_data.c @@ -114,6 +114,8 @@ void initialize_logging(log_t* log_struct, parameter_t* ps) { addOutputToLog(log_struct, ps->y_vel_pid, PID_CORRECTION, rad); addOutputToLog(log_struct, ps->x_vel, PID_CORRECTION, m_s); addOutputToLog(log_struct, ps->y_vel, PID_CORRECTION, m_s); + addOutputToLog(log_struct, ps->of_angle_corr, ROT_OUT_X, m_s); + addOutputToLog(log_struct, ps->of_angle_corr, ROT_OUT_Y, m_s); addParamToLog(log_struct, ps->cur_roll, CONST_VAL, rad); addParamToLog(log_struct, ps->cur_yaw, CONST_VAL, rad); diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h index 02dde9e0b0314d582366a1abf984d9ea2652ac16..2d6cdd157af1c53cfe1d980e622c836907d18e44 100644 --- a/quad/src/quad_app/type_def.h +++ b/quad/src/quad_app/type_def.h @@ -385,6 +385,9 @@ typedef struct parameter_t { int vel_y_gain; // Sensor processing int yaw_correction; + int of_angle_corr; // Corrects for the optical flow mounting angle + int of_angle_offset; // Offset for optical flow angle + int of_angle_add; // Adds optical flow static offset to current yaw } parameter_t; /**