diff --git a/libraries/AP_Compass/AP_Compass.cpp b/libraries/AP_Compass/AP_Compass.cpp index 7e8f205419..a046e2c12d 100644 --- a/libraries/AP_Compass/AP_Compass.cpp +++ b/libraries/AP_Compass/AP_Compass.cpp @@ -1281,61 +1281,50 @@ void Compass::motor_compensation_type(const uint8_t comp_type) bool Compass::consistent() const { - Vector3f primary_mag_field = get_field(); - Vector3f primary_mag_field_norm; + const Vector3f &primary_mag_field = get_field(); + const Vector2f primary_mag_field_xy = Vector2f(primary_mag_field.x,primary_mag_field.y); - if (!primary_mag_field.is_zero()) { - primary_mag_field_norm = primary_mag_field.normalized(); - } else { + if (primary_mag_field_xy.is_zero()) { return false; } - Vector2f primary_mag_field_xy = Vector2f(primary_mag_field.x,primary_mag_field.y); - Vector2f primary_mag_field_xy_norm; - - if (!primary_mag_field_xy.is_zero()) { - primary_mag_field_xy_norm = primary_mag_field_xy.normalized(); - } else { - return false; - } + const Vector3f primary_mag_field_norm = primary_mag_field.normalized(); + const Vector2f primary_mag_field_xy_norm = primary_mag_field_xy.normalized(); for (uint8_t i=0; i AP_COMPASS_MAX_XYZ_ANG_DIFF; + mag_field.normalize(); + mag_field_xy.normalize(); - // check for an unacceptable angle difference on the xy plane - bool xy_ang_diff_large = xy_ang_diff > AP_COMPASS_MAX_XY_ANG_DIFF; + const float xyz_ang_diff = acosf(constrain_float(mag_field*primary_mag_field_norm,-1.0f,1.0f)); + const float xy_ang_diff = acosf(constrain_float(mag_field_xy*primary_mag_field_xy_norm,-1.0f,1.0f)); - // check for an unacceptable length difference on the xy plane - bool xy_length_diff_large = xy_len_diff > AP_COMPASS_MAX_XY_LENGTH_DIFF; + // check for gross misalignment on all axes + if (xyz_ang_diff > AP_COMPASS_MAX_XYZ_ANG_DIFF) { + return false; + } - // check for inconsistency in the XY plane - if (xyz_ang_diff_large || xy_ang_diff_large || xy_length_diff_large) { - return false; - } + // check for an unacceptable angle difference on the xy plane + if (xy_ang_diff > AP_COMPASS_MAX_XY_ANG_DIFF) { + return false; + } + + // check for an unacceptable length difference on the xy plane + if (xy_len_diff > AP_COMPASS_MAX_XY_LENGTH_DIFF) { + return false; } } return true;