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");
  }
}
Beispiel #4
0
gint
rc_get_int(guchar *key)
{
   guchar *value = rc_get(key);
   if (value == NULL) return RC_NOT_EXISTS;
   return atoi(value);
}
Beispiel #5
0
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));
}
Beispiel #7
0
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;
}