Rover: added crash check

This commit is contained in:
Pierre Kancir 2016-11-21 17:08:24 +01:00 committed by Grant Morphett
parent a3ccca17ff
commit dec954bb0c
7 changed files with 90 additions and 1 deletions

View File

@ -76,6 +76,7 @@ const AP_Scheduler::Task Rover::scheduler_tasks[] = {
SCHED_TASK(dataflash_periodic, 50, 300), SCHED_TASK(dataflash_periodic, 50, 300),
SCHED_TASK(button_update, 5, 100), SCHED_TASK(button_update, 5, 100),
SCHED_TASK(stats_update, 1, 100), SCHED_TASK(stats_update, 1, 100),
SCHED_TASK(crash_check, 10, 1000),
}; };
/* /*

View File

@ -365,6 +365,25 @@ void Rover::Log_Write_RC(void)
} }
} }
struct PACKED log_Error {
LOG_PACKET_HEADER;
uint64_t time_us;
uint8_t sub_system;
uint8_t error_code;
};
// Write an error packet
void Rover::Log_Write_Error(uint8_t sub_system, uint8_t error_code)
{
struct log_Error pkt = {
LOG_PACKET_HEADER_INIT(LOG_ERROR_MSG),
time_us : AP_HAL::micros64(),
sub_system : sub_system,
error_code : error_code,
};
DataFlash.WriteBlock(&pkt, sizeof(pkt));
}
void Rover::Log_Write_Baro(void) void Rover::Log_Write_Baro(void)
{ {
DataFlash.Log_Write_Baro(barometer); DataFlash.Log_Write_Baro(barometer);
@ -436,6 +455,8 @@ const LogStructure Rover::log_structure[] = {
"STER", "Qff", "TimeUS,Demanded,Achieved" }, "STER", "Qff", "TimeUS,Demanded,Achieved" },
{ LOG_GUIDEDTARGET_MSG, sizeof(log_GuidedTarget), { LOG_GUIDEDTARGET_MSG, sizeof(log_GuidedTarget),
"GUID", "QBffffff", "TimeUS,Type,pX,pY,pZ,vX,vY,vZ" }, "GUID", "QBffffff", "TimeUS,Type,pX,pY,pZ,vX,vY,vZ" },
{ LOG_ERROR_MSG, sizeof(log_Error),
"ERR", "QBB", "TimeUS,Subsys,ECode" },
}; };
void Rover::log_init(void) void Rover::log_init(void)

View File

@ -316,6 +316,13 @@ const AP_Param::Info Rover::var_info[] = {
// @User: Standard // @User: Standard
GSCALAR(fs_gcs_enabled, "FS_GCS_ENABLE", 0), GSCALAR(fs_gcs_enabled, "FS_GCS_ENABLE", 0),
// @Param: FS_CRASH_CHECK
// @DisplayName: Crash check action
// @Description: What to do on a crash event. When enabled the rover will go to hold if a crash is detected.
// @Values: 0:Disabled,1:HOLD,2:HoldAndDisarm
// @User: Standard
GSCALAR(fs_crash_check, "FS_CRASH_CHECK", FS_CRASH_HOLD),
// @Param: RNGFND_TRIGGR_CM // @Param: RNGFND_TRIGGR_CM
// @DisplayName: Rangefinder trigger distance // @DisplayName: Rangefinder trigger distance
// @Description: The distance from an obstacle in centimeters at which the rangefinder triggers a turn to avoid the obstacle // @Description: The distance from an obstacle in centimeters at which the rangefinder triggers a turn to avoid the obstacle

View File

@ -136,6 +136,7 @@ public:
k_param_fs_throttle_enabled, k_param_fs_throttle_enabled,
k_param_fs_throttle_value, k_param_fs_throttle_value,
k_param_fs_gcs_enabled, k_param_fs_gcs_enabled,
k_param_fs_crash_check,
// obstacle control // obstacle control
k_param_sonar_enabled = 190, // deprecated, can be removed k_param_sonar_enabled = 190, // deprecated, can be removed
@ -271,6 +272,7 @@ public:
AP_Int8 fs_throttle_enabled; AP_Int8 fs_throttle_enabled;
AP_Int16 fs_throttle_value; AP_Int16 fs_throttle_value;
AP_Int8 fs_gcs_enabled; AP_Int8 fs_gcs_enabled;
AP_Int8 fs_crash_check;
// obstacle control // obstacle control
AP_Int16 sonar_trigger_cm; AP_Int16 sonar_trigger_cm;

View File

@ -389,7 +389,6 @@ private:
// Guided // Guided
GuidedMode guided_mode; // stores which GUIDED mode the vehicle is in GuidedMode guided_mode; // stores which GUIDED mode the vehicle is in
private: private:
// private member functions // private member functions
void ahrs_update(); void ahrs_update();
@ -439,6 +438,7 @@ private:
void Log_Write_Current(); void Log_Write_Current();
void Log_Write_Attitude(); void Log_Write_Attitude();
void Log_Write_RC(void); void Log_Write_RC(void);
void Log_Write_Error(uint8_t sub_system, uint8_t error_code);
void Log_Write_Baro(void); void Log_Write_Baro(void);
void Log_Write_Home_And_Origin(); void Log_Write_Home_And_Origin();
void Log_Write_Vehicle_Startup_Messages(); void Log_Write_Vehicle_Startup_Messages();
@ -547,6 +547,7 @@ private:
bool in_stationary_loiter(void); bool in_stationary_loiter(void);
void set_loiter_active(const AP_Mission::Mission_Command& cmd); void set_loiter_active(const AP_Mission::Mission_Command& cmd);
void Log_Write_GuidedTarget(uint8_t target_type, const Vector3f& pos_target, const Vector3f& vel_target); void Log_Write_GuidedTarget(uint8_t target_type, const Vector3f& pos_target, const Vector3f& vel_target);
void crash_check();
public: public:
bool print_log_menu(void); bool print_log_menu(void);

44
APMrover2/crash_check.cpp Normal file
View File

@ -0,0 +1,44 @@
#include "Rover.h"
// Code to detect a crash or block
#define CRASH_CHECK_TRIGGER_SEC 2 // 2 seconds blocked indicates a crash
#define CRASH_CHECK_THROTTLE_MIN 5.0f // vehicle must have a throttle greater that 5% to be considered crashed
#define CRASH_CHECK_VEL_MIN 0.08f // vehicle must have a velocity under 0.08 m/s to be considered crashed
// crash_check - disarms motors if a crash or block has been detected
// crashes are detected by the vehicle being static (no speed) for more than CRASH_CHECK_TRIGGER_SEC and motor are running
// called at 10Hz
void Rover::crash_check()
{
static uint16_t crash_counter; // number of iterations vehicle may have been crashed
// return immediately if disarmed, or crash checking disabled or in HOLD mode
if (!arming.is_armed() || g.fs_crash_check == FS_CRASH_DISABLE || (control_mode != GUIDED && control_mode != AUTO)) {
crash_counter = 0;
return;
}
// TODO : Check if min vel can be calculated
// min_vel = ( CRASH_CHECK_THROTTLE_MIN * g.speed_cruise) / g.throttle_cruise;
if ((ahrs.groundspeed() >= CRASH_CHECK_VEL_MIN)|| ((100 * fabsf(channel_throttle->norm_output())) < CRASH_CHECK_THROTTLE_MIN)) {
crash_counter = 0;
return;
}
// we may be crashing
crash_counter++;
// check if crashing for 2 seconds
if (crash_counter >= (CRASH_CHECK_TRIGGER_SEC * 10)) {
// log an error in the dataflash
Log_Write_Error(ERROR_SUBSYSTEM_CRASH_CHECK, ERROR_CODE_CRASH_CHECK_CRASH);
// send message to gcs
gcs_send_text(MAV_SEVERITY_EMERGENCY, "Crash: Going to HOLD");
// change mode to hold and disarm
set_mode(HOLD);
if (g.fs_crash_check == FS_CRASH_HOLD_AND_DISARM) {
disarm_motors();
}
}
}

View File

@ -60,6 +60,7 @@ enum GuidedMode {
#define LOG_ARM_DISARM_MSG 0x08 #define LOG_ARM_DISARM_MSG 0x08
#define LOG_STEERING_MSG 0x0D #define LOG_STEERING_MSG 0x0D
#define LOG_GUIDEDTARGET_MSG 0x0E #define LOG_GUIDEDTARGET_MSG 0x0E
#define LOG_ERROR_MSG 0x13
#define TYPE_AIRSTART_MSG 0x00 #define TYPE_AIRSTART_MSG 0x00
#define TYPE_GROUNDSTART_MSG 0x01 #define TYPE_GROUNDSTART_MSG 0x01
@ -90,3 +91,15 @@ enum GuidedMode {
#define MAVLINK_SET_POS_TYPE_MASK_FORCE (1<<9) #define MAVLINK_SET_POS_TYPE_MASK_FORCE (1<<9)
#define MAVLINK_SET_POS_TYPE_MASK_YAW_IGNORE (1<<10) #define MAVLINK_SET_POS_TYPE_MASK_YAW_IGNORE (1<<10)
#define MAVLINK_SET_POS_TYPE_MASK_YAW_RATE_IGNORE (1<<11) #define MAVLINK_SET_POS_TYPE_MASK_YAW_RATE_IGNORE (1<<11)
// Error message sub systems and error codes
#define ERROR_SUBSYSTEM_CRASH_CHECK 12
// subsystem specific error codes -- crash checker
#define ERROR_CODE_CRASH_CHECK_CRASH 1
enum fs_crash_action {
FS_CRASH_DISABLE = 0,
FS_CRASH_HOLD = 1,
FS_CRASH_HOLD_AND_DISARM = 2
};