mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-03-25 03:04:12 +08:00
* sensors: move GPS antenna offsets to per-receiver parameters
Move antenna position configuration from the single EKF2_GPS_POS_X/Y/Z
parameter set into per-receiver SENS_GPS{0,1}_OFF{X,Y,Z} parameters in
the sensors module. Each offset slot is matched to a physical receiver
by device ID (SENS_GPS{0,1}_ID), falling back to uORB instance index
when no IDs are configured.
The antenna offset is now carried through the SensorGps uORB message
and blended alongside other GPS states when multi-receiver blending is
active, so EKF2 receives the correct lever arm for whichever receiver
(or weighted combination) is selected.
- Add antenna_offset_{x,y,z} fields to SensorGps.msg
- Remove EKF2_GPS_POS_X/Y/Z params; EKF2 reads offset from gnssSample
- Add SENS_GPS{0,1}_ID and SENS_GPS{0,1}_OFF{X,Y,Z} params (module.yaml)
- Blend antenna offsets in GpsBlending (weighted average)
- Add unit tests for single, blended, and failover antenna offset cases
- Migrate params.c to module.yaml for the vehicle_gps_position module
* sensors: gps_blending: add asymmetric weight and fallthrough offset tests
Add two additional antenna offset test cases:
- dualReceiverAsymmetricWeightAntennaOffset: verify that unequal eph
values produce correctly skewed blend weights (0.8/0.2) and that the
output antenna offset reflects the weighted average
- blendingFallthroughAntennaOffset: verify that when blending is enabled
but can_do_blending evaluates false (eph=0), the non-blending path
correctly assigns the selected receiver's antenna offset
* feat(param_translation): translate EKF2_GPS_POS_ to SENS_GPS0_OFF_
* fix(msgs): proper formatting
* chore(msg): 0 if invalid/unknown
* fix(ROMFS): migrate EKF2_GPS_POS_ params
* fix(docs): migrate EKF2_GPS_POS_ params
* fix(blending): unsigned param
* Update msg/SensorGps.msg
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix(sensors/gps): remove 'values:' tag in module.yaml
* fix(sensors/gps): unsigned instance index
* fix(blending): restore const on gps_blend_states()
Move antenna offset blending into blend_gps_data() where the
weights are computed, keeping gps_blend_states() const.
* fix(sensors/gps): fix msg annotation and restore SENS_GPS_PRIME values
Remove incorrect @invalid NaN annotation from antenna offset fields
(0.0 default is correct, not a sentinel). Restore values tag for
SENS_GPS_PRIME so QGC shows a dropdown.
* fix(gps_blending): fix pre-existing bug to clear _gps_updated flags
The loop iterates over i but always clears gps_select_index. The intent is to clear
all updated flags, but only the selected one gets cleared (N times)
* test(gps_blending): add stale update flag regression test
95 lines
4.7 KiB
Plaintext
95 lines
4.7 KiB
Plaintext
# GPS position in WGS84 coordinates.
|
|
# the field 'timestamp' is for the position & velocity (microseconds)
|
|
uint64 timestamp # time since system start (microseconds)
|
|
uint64 timestamp_sample
|
|
|
|
uint32 device_id # unique device ID for the sensor that does not change between power cycles
|
|
|
|
float64 latitude_deg # Latitude in degrees, allows centimeter level RTK precision
|
|
float64 longitude_deg # Longitude in degrees, allows centimeter level RTK precision
|
|
float64 altitude_msl_m # Altitude above MSL, meters
|
|
float64 altitude_ellipsoid_m # Altitude above Ellipsoid, meters
|
|
|
|
float32 s_variance_m_s # GPS speed accuracy estimate, (metres/sec)
|
|
float32 c_variance_rad # GPS course accuracy estimate, (radians)
|
|
uint8 FIX_TYPE_NONE = 1 # Value 0 is also valid to represent no fix.
|
|
uint8 FIX_TYPE_2D = 2
|
|
uint8 FIX_TYPE_3D = 3
|
|
uint8 FIX_TYPE_RTCM_CODE_DIFFERENTIAL = 4
|
|
uint8 FIX_TYPE_RTK_FLOAT = 5
|
|
uint8 FIX_TYPE_RTK_FIXED = 6
|
|
uint8 FIX_TYPE_EXTRAPOLATED = 8
|
|
uint8 fix_type # Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.
|
|
|
|
float32 eph # GPS horizontal position accuracy (metres)
|
|
float32 epv # GPS vertical position accuracy (metres)
|
|
|
|
float32 hdop # Horizontal dilution of precision
|
|
float32 vdop # Vertical dilution of precision
|
|
|
|
int32 noise_per_ms # GPS noise per millisecond
|
|
uint16 automatic_gain_control # Automatic gain control monitor
|
|
|
|
uint8 JAMMING_STATE_UNKNOWN = 0 #default
|
|
uint8 JAMMING_STATE_OK = 1
|
|
uint8 JAMMING_STATE_MITIGATED = 2
|
|
uint8 JAMMING_STATE_DETECTED = 3
|
|
uint8 jamming_state # indicates whether jamming has been detected or suspected by the receivers. O: Unknown, 1: OK, 2: Mitigated, 3: Detected
|
|
int32 jamming_indicator # indicates jamming is occurring
|
|
|
|
uint8 SPOOFING_STATE_UNKNOWN = 0 #default
|
|
uint8 SPOOFING_STATE_OK = 1
|
|
uint8 SPOOFING_STATE_MITIGATED = 2
|
|
uint8 SPOOFING_STATE_DETECTED = 3
|
|
uint8 spoofing_state # indicates whether spoofing has been detected or suspected by the receivers. O: Unknown, 1: OK, 2: Mitigated, 3: Detected
|
|
|
|
# Combined authentication state (e.g. Galileo OSNMA)
|
|
uint8 AUTHENTICATION_STATE_UNKNOWN = 0 #default
|
|
uint8 AUTHENTICATION_STATE_INITIALIZING = 1
|
|
uint8 AUTHENTICATION_STATE_ERROR = 2
|
|
uint8 AUTHENTICATION_STATE_OK = 3
|
|
uint8 AUTHENTICATION_STATE_DISABLED = 4
|
|
uint8 authentication_state # GPS signal authentication state
|
|
|
|
float32 vel_m_s # GPS ground speed, (metres/sec)
|
|
float32 vel_n_m_s # GPS North velocity, (metres/sec)
|
|
float32 vel_e_m_s # GPS East velocity, (metres/sec)
|
|
float32 vel_d_m_s # GPS Down velocity, (metres/sec)
|
|
float32 cog_rad # Course over ground (NOT heading, but direction of movement), -PI..PI, (radians)
|
|
bool vel_ned_valid # True if NED velocity is valid
|
|
|
|
int32 timestamp_time_relative # timestamp + timestamp_time_relative = Time of the UTC timestamp since system start, (microseconds)
|
|
uint64 time_utc_usec # Timestamp (microseconds, UTC), this is the timestamp which comes from the gps module. It might be unavailable right after cold start, indicated by a value of 0
|
|
|
|
uint8 satellites_used # Number of satellites used
|
|
|
|
uint32 SYSTEM_ERROR_OK = 0 #default
|
|
uint32 SYSTEM_ERROR_INCOMING_CORRECTIONS = 1
|
|
uint32 SYSTEM_ERROR_CONFIGURATION = 2
|
|
uint32 SYSTEM_ERROR_SOFTWARE = 4
|
|
uint32 SYSTEM_ERROR_ANTENNA = 8
|
|
uint32 SYSTEM_ERROR_EVENT_CONGESTION = 16
|
|
uint32 SYSTEM_ERROR_CPU_OVERLOAD = 32
|
|
uint32 SYSTEM_ERROR_OUTPUT_CONGESTION = 64
|
|
uint32 system_error # General errors with the connected GPS receiver
|
|
|
|
float32 heading # heading angle of XYZ body frame rel to NED. Set to NaN if not available and updated (used for dual antenna GPS), (rad, [-PI, PI])
|
|
float32 heading_offset # heading offset of dual antenna array in body frame. Set to NaN if not applicable. (rad, [-PI, PI])
|
|
float32 heading_accuracy # heading accuracy (rad, [0, 2PI])
|
|
|
|
float32 rtcm_injection_rate # RTCM message injection rate Hz
|
|
uint8 selected_rtcm_instance # uorb instance that is being used for RTCM corrections
|
|
|
|
bool rtcm_crc_failed # RTCM message CRC failure detected
|
|
|
|
uint8 RTCM_MSG_USED_UNKNOWN = 0
|
|
uint8 RTCM_MSG_USED_NOT_USED = 1
|
|
uint8 RTCM_MSG_USED_USED = 2
|
|
uint8 rtcm_msg_used # Indicates if the RTCM message was used successfully by the receiver
|
|
|
|
float32 antenna_offset_x # [m] [@frame body frame FRD] X Position of GNSS antenna
|
|
float32 antenna_offset_y # [m] [@frame body frame FRD] Y Position of GNSS antenna
|
|
float32 antenna_offset_z # [m] [@frame body frame FRD] Z Position of GNSS antenna
|
|
|
|
# TOPICS sensor_gps vehicle_gps_position
|