void compute_pids() { pid(PID_RATE_X)->input = imu_rates().x; pid(PID_RATE_Y)->input = imu_rates().y; pid(PID_ANGLE_X)->input = imu_angles().x; pid(PID_ANGLE_Y)->input = imu_angles().y; pid(PID_RATE_Z)->input = imu_rates().z; if (flight_mode == STABILIZE) { pid(PID_ANGLE_X)->setpoint = rc_get(RC_ROLL); pid(PID_ANGLE_Y)->setpoint = rc_get(RC_PITCH); pid_compute(PID_ANGLE_X); pid_compute(PID_ANGLE_Y); pid(PID_RATE_X)->setpoint = pid(PID_ANGLE_X)->output; pid(PID_RATE_Y)->setpoint = pid(PID_ANGLE_Y)->output; } else { pid(PID_RATE_X)->setpoint = rc_get(RC_ROLL); pid(PID_RATE_Y)->setpoint = rc_get(RC_PITCH); } pid(PID_RATE_Z)->setpoint = rc_get(RC_YAW); pid_compute(PID_RATE_X); pid_compute(PID_RATE_Y); pid_compute(PID_RATE_Z); }
void fc_safety_check() { if (rc_get(RC_THROTTLE) == 0 && rc_get(RC_YAW) > RC_CH4_OUT_MAX/2-10) { fc_disarm(); } if (rc_get(RC_THROTTLE) == 0 && rc_get(RC_YAW) < RC_CH4_OUT_MIN/2+10) { fc_arm(); } // watchdog to prevent stale imu values if (imu_rates().x == last_gyro_value) { gyro_freeze_counter++; if (gyro_freeze_counter == 500) { Serial.println("gyro freeze"); fc_emergency_stop(); } } else { gyro_freeze_counter = 0; last_gyro_value = imu_rates().x; } if (ANGLE_SAFETY_STOP && (imu_angles().x > 45.0 || imu_angles().x < -45.0 || imu_angles().y > 45.0 || imu_angles().y < -45.0)) { Serial.println("angles too high"); fc_emergency_stop(); } }
void fc_safety_check() { float yaw = rc_get(RC_YAW); float yaw_max = rc_out_max(RC_YAW); if (rc_get(RC_THROTTLE) == 0 && yaw < yaw_max * -0.9) { fc_disarm(); } if (rc_get(RC_THROTTLE) == 0 && yaw > yaw_max * 0.9) { fc_arm(); } // watchdog to prevent stale imu values if (imu_rates().x == last_gyro_value) { gyro_freeze_counter++; if (gyro_freeze_counter == 500) { fc_emergency_stop("gyro freeze"); } } else { gyro_freeze_counter = 0; last_gyro_value = imu_rates().x; } if (ANGLE_SAFETY_STOP && (imu_angles().x > SAFE_ANGLE || imu_angles().x < -SAFE_ANGLE || imu_angles().y > SAFE_ANGLE || imu_angles().y < -SAFE_ANGLE)) { fc_emergency_stop("angles too high"); } }
gint rc_get_int(guchar *key) { guchar *value = rc_get(key); if (value == NULL) return RC_NOT_EXISTS; return atoi(value); }
gboolean rc_get_boolean(guchar *key) { guchar *value = rc_get(key); if (value == NULL) return FALSE; if (value[0] != '1') return FALSE; return TRUE; }
void compute_motor_outputs() { float m1_fr_out = rc_get(RC_THROTTLE) - pid(PID_RATE_X)->output - pid(PID_RATE_Y)->output + pid(PID_RATE_Z)->output; float m2_bl_out = rc_get(RC_THROTTLE) + pid(PID_RATE_X)->output + pid(PID_RATE_Y)->output + pid(PID_RATE_Z)->output; float m3_fl_out = rc_get(RC_THROTTLE) - pid(PID_RATE_Y)->output + pid(PID_RATE_X)->output - pid(PID_RATE_Z)->output; float m4_br_out = rc_get(RC_THROTTLE) + pid(PID_RATE_Y)->output - pid(PID_RATE_X)->output - pid(PID_RATE_Z)->output; motors_set_output(M1, (int16_t)(m1_fr_out + 0.5)); motors_set_output(M2, (int16_t)(m2_bl_out + 0.5)); motors_set_output(M3, (int16_t)(m3_fl_out + 0.5)); motors_set_output(M4, (int16_t)(m4_br_out + 0.5)); }
VOID gsx_sclip(GRECT *pt) { rc_get(pt, &gl_xclip, &gl_yclip, &gl_wclip, &gl_hclip); if ( gl_wclip && gl_hclip ) { ptsin[0] = gl_xclip; ptsin[1] = gl_yclip; ptsin[2] = gl_xclip + gl_wclip - 1; ptsin[3] = gl_yclip + gl_hclip - 1; vs_clip(gl_handle, TRUE, &ptsin[0]); } else vs_clip(gl_handle, FALSE, &ptsin[0]); } /* gsx_setclip */
bool min_throttle() { return rc_get(RC_THROTTLE) >= 1070; }
bool min_throttle() { return rc_get(RC_THROTTLE) >= RC_THROTTLE_MIN; }