|
|
|
@ -282,10 +282,12 @@ void Copter::zr_mkdir_in_takeoff()
@@ -282,10 +282,12 @@ void Copter::zr_mkdir_in_takeoff()
|
|
|
|
|
void Copter::takeoff_crash_detect() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
static uint16_t crash_counter; // number of iterations vehicle may have been crashed
|
|
|
|
|
static uint16_t crash_counter; |
|
|
|
|
static uint16_t err_counter; |
|
|
|
|
// return immediately if disarmed, or crash checking disabled
|
|
|
|
|
if (!motors->armed() || g.fs_crash_check == 0) { |
|
|
|
|
crash_counter = 0; |
|
|
|
|
err_counter = 0; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -296,17 +298,17 @@ void Copter::takeoff_crash_detect()
@@ -296,17 +298,17 @@ void Copter::takeoff_crash_detect()
|
|
|
|
|
// check for lean angle over 15 degrees 角度判断,角度小于稳定飞行值退出
|
|
|
|
|
const float lean_angle_deg = degrees(acosf(ahrs.cos_roll()*ahrs.cos_pitch())); |
|
|
|
|
if (lean_angle_deg > float(g.zr_takeoff_prt_deg)) { |
|
|
|
|
crash_counter +=1 ; |
|
|
|
|
crash_counter += 1 ; |
|
|
|
|
}else{ |
|
|
|
|
crash_counter = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// // check for angle error over 30 degrees
|
|
|
|
|
const float angle_error = attitude_control->get_att_error_angle_deg(); |
|
|
|
|
if (angle_error > float(g.zr_takeoff_prt_deg)/2.0) { |
|
|
|
|
crash_counter +=1 ; |
|
|
|
|
if (angle_error > float(g.zr_takeoff_prt_errdeg)) { |
|
|
|
|
err_counter += 1; |
|
|
|
|
}else{ |
|
|
|
|
crash_counter = 0; |
|
|
|
|
err_counter = 0; |
|
|
|
|
} |
|
|
|
|
// check if crashing for 2 seconds
|
|
|
|
|
AP::logger().Write("TKPT", "TimeUS,Ldeg,Aerr,Alt", "Qfff", |
|
|
|
@ -315,12 +317,12 @@ void Copter::takeoff_crash_detect()
@@ -315,12 +317,12 @@ void Copter::takeoff_crash_detect()
|
|
|
|
|
angle_error, |
|
|
|
|
rangefinder_state.alt_cm_filt.get()); |
|
|
|
|
|
|
|
|
|
if (crash_counter >= (g.zr_takeoff_prt_ps)) { |
|
|
|
|
if (crash_counter >= (g.zr_takeoff_prt_ps) || err_counter >= (g.zr_takeoff_prt_ps) ) { |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::CRASH_CHECK, LogErrorCode::CRASH_CHECK_CRASH); |
|
|
|
|
// keep logging even if disarmed:
|
|
|
|
|
AP::logger().set_force_log_disarmed(true); |
|
|
|
|
// send message to gcs
|
|
|
|
|
gcs().send_text(MAV_SEVERITY_EMERGENCY,"Crash: Takeoff crash protect");//Crash: Disarming
|
|
|
|
|
gcs().send_text(MAV_SEVERITY_EMERGENCY,"Crash: Takeoff crash protect"); |
|
|
|
|
// disarm motors
|
|
|
|
|
arming.disarm(); |
|
|
|
|
} |
|
|
|
|