mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-23 02:03:33 +08:00
EKF2: Spoofing GPS check (#23366)
* estimator gps check fail flag for spoofing * warn whenever spoofing state changes to true, use default hysteresis to completely stop fusion * dont introduce more GPS namings, GNSS instead * flash: exclude mantis for cuav_x7pro
This commit is contained in:
@@ -48,15 +48,16 @@
|
||||
#include <mathlib/mathlib.h>
|
||||
|
||||
// GPS pre-flight check bit locations
|
||||
#define MASK_GPS_NSATS (1<<0)
|
||||
#define MASK_GPS_PDOP (1<<1)
|
||||
#define MASK_GPS_HACC (1<<2)
|
||||
#define MASK_GPS_VACC (1<<3)
|
||||
#define MASK_GPS_SACC (1<<4)
|
||||
#define MASK_GPS_HDRIFT (1<<5)
|
||||
#define MASK_GPS_VDRIFT (1<<6)
|
||||
#define MASK_GPS_HSPD (1<<7)
|
||||
#define MASK_GPS_VSPD (1<<8)
|
||||
#define MASK_GPS_NSATS (1<<0)
|
||||
#define MASK_GPS_PDOP (1<<1)
|
||||
#define MASK_GPS_HACC (1<<2)
|
||||
#define MASK_GPS_VACC (1<<3)
|
||||
#define MASK_GPS_SACC (1<<4)
|
||||
#define MASK_GPS_HDRIFT (1<<5)
|
||||
#define MASK_GPS_VDRIFT (1<<6)
|
||||
#define MASK_GPS_HSPD (1<<7)
|
||||
#define MASK_GPS_VSPD (1<<8)
|
||||
#define MASK_GPS_SPOOFED (1<<9)
|
||||
|
||||
void Ekf::collect_gps(const gnssSample &gps)
|
||||
{
|
||||
@@ -136,6 +137,8 @@ void Ekf::collect_gps(const gnssSample &gps)
|
||||
|
||||
bool Ekf::runGnssChecks(const gnssSample &gps)
|
||||
{
|
||||
_gps_check_fail_status.flags.spoofed = gps.spoofed;
|
||||
|
||||
// Check the fix type
|
||||
_gps_check_fail_status.flags.fix = (gps.fix_type < 3);
|
||||
|
||||
@@ -240,7 +243,8 @@ bool Ekf::runGnssChecks(const gnssSample &gps)
|
||||
(_gps_check_fail_status.flags.hdrift && (_params.gps_check_mask & MASK_GPS_HDRIFT)) ||
|
||||
(_gps_check_fail_status.flags.vdrift && (_params.gps_check_mask & MASK_GPS_VDRIFT)) ||
|
||||
(_gps_check_fail_status.flags.hspeed && (_params.gps_check_mask & MASK_GPS_HSPD)) ||
|
||||
(_gps_check_fail_status.flags.vspeed && (_params.gps_check_mask & MASK_GPS_VSPD))
|
||||
(_gps_check_fail_status.flags.vspeed && (_params.gps_check_mask & MASK_GPS_VSPD)) ||
|
||||
(_gps_check_fail_status.flags.spoofed && (_params.gps_check_mask & MASK_GPS_SPOOFED))
|
||||
) {
|
||||
_last_gps_fail_us = _time_delayed_us;
|
||||
return false;
|
||||
|
||||
@@ -183,6 +183,7 @@ struct gnssSample {
|
||||
float yaw{}; ///< yaw angle. NaN if not set (used for dual antenna GPS), (rad, [-PI, PI])
|
||||
float yaw_acc{}; ///< 1-std yaw error (rad)
|
||||
float yaw_offset{}; ///< Heading/Yaw offset for dual antenna GPS - refer to description for GPS_YAW_OFFSET
|
||||
bool spoofed{}; ///< true if GNSS data is spoofed
|
||||
};
|
||||
|
||||
struct magSample {
|
||||
@@ -536,6 +537,7 @@ union gps_check_fail_status_u {
|
||||
uint16_t vdrift : 1; ///< 7 - true if vertical drift is excessive (can only be used when stationary on ground)
|
||||
uint16_t hspeed : 1; ///< 8 - true if horizontal speed is excessive (can only be used when stationary on ground)
|
||||
uint16_t vspeed : 1; ///< 9 - true if vertical speed error is excessive
|
||||
uint16_t spoofed: 1; ///< 10 - true if the GNSS data is spoofed
|
||||
} flags;
|
||||
uint16_t value;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user