Commit Graph

322 Commits

Author SHA1 Message Date
Marco Hauswirth ca0bd4a8ac feat(ekf2): decorrelate vertical position and adjust baro bias during gnss altitude drift correction 2026-04-08 18:20:21 +02:00
Marco Hauswirth 7e4132a006 feat(ekf2): gnss altitude correction-drift detector 2026-04-08 17:35:38 +02:00
bresch f90b159401 feat(ekf2): generalize engine warmup mode
This is not only needed for engine warmup but in general, when the
vehicle is static on the ground, relying on fixed position to maintain a
valid global position estimate before takeoff, even when bumping it or
starting the engine.
2026-03-19 11:48:09 +01:00
Jacob Dahl 4b2e0a6f59 feat(sensors/gps): add per-receiver GPS delay parameters (#26660)
* sensors: add per-receiver GPS delay parameters

Add SENS_GPS{0,1}_DELAY params to vehicle_gps_position, following the
same device-ID matching pattern used for antenna offsets. Each receiver
can now have its own measurement delay relative to the IMU.

The delay is applied to timestamp_sample before blending. When PPS time
correction is active it takes priority over the parameter-based delay.
When a GPS driver already provides its own timestamp_sample the
per-receiver delay is not applied on top of it.

* fix(ekf2): remove EKF2_GPS_DELAY and perform param transation

* fix(param_translation): fix GPS param migration return values

Add missing return for EKF2_GPS_POS_Z and remove incorrect return for
EKF2_GPS_DELAY (1-to-many migration should not return PARAM_MODIFIED).

* fix(sensors,ekf2): rename pps_compensation and clarify delay default

* fix(ekf2): account for SENS_GPS*_DELAY in observation buffer sizing

* fix(docs): migrate EKF2_GPS_DELAY param
2026-03-17 18:19:08 -08:00
Jacob Dahl 89855926ef feat(sensors/gps): move GPS antenna offsets to per-receiver parameters (#26634)
* 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
2026-03-17 17:33:41 -08:00
bresch cdcdd1096f fix(ekf2): add missing in_transition flag 2026-03-13 17:46:31 +01:00
bresch 643c6fec24 feat(ekf2): clear heading correlation with other states when not observable 2026-03-13 17:46:31 +01:00
Ege Kural d72d99f2d8 fix(ci): clang-tidy bugprone-too-small-loop-variable(#26709) 2026-03-11 08:18:53 -07:00
Balduin e5071beaa3 fix(ekf2): fuse airspeed in both transition if above EKF2_ARSP_THR 2026-03-11 10:08:32 +01:00
Hamish Willee 9e41ffd537 docs:Fix in-source broken links in modules and airframes ref (#26611) 2026-03-02 18:18:00 +11:00
Marco Hauswirth 57a380d8ec ekf2: fix silent pass of preflt heading check if no heading src active 2026-02-27 13:26:47 +01:00
Ramon Roche b60aa5dd2b ekf2, fw_mode_manager, fw_rate_control: remove unused using declarations
Remove using-declarations for math::constrain, math::max, and
math::min that are never used — all call sites use the fully-qualified
form (e.g. math::constrain()).

Fixes misc-unused-using-decls clang-tidy diagnostic.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-02-12 21:20:27 -08:00
bresch 230276540f estimator_status_flags: remove useless logged flags
Those flags are not so useful for log analysis and can be found in the
aid_src topics
2026-01-22 17:58:04 +01:00
Nick c51502781f ekf2: revent yaw spikes on reset (#25972) 2025-12-18 09:08:44 -09:00
Marco Hauswirth 8393f46100 Ekf2 add jamming to gnss checks (#26085)
* add jamming check to gnss checks

* keep original order of gnss_check params for default backwards compability
2025-12-16 10:10:37 +01:00
Mahima Yoga bcd67b7bad ekf: enable constant position fusion during engine warm-up (#26041)
In cold weather, fuel engines need to be warmed up. Currently, this is done by switching to stabilized mode and throttle up. The issue is that when not using GNSS data, the vehicle is not detected as "at rest" due to vibrations and cannot switch into auto/takeoff modes.

If EKF2_ENGINE_WRM is enabled, and if the vehicle is armed and landed, constant position fusion is enabled.
2025-12-05 15:08:37 +01:00
Balduin 6caf4f0942 ekf2: fuse airspeed & beta only in fronttransition and fixed wing (#25980)
This allows airspeed and sideslip fusion to start during VTOL front
transition, but not in backtransition or MC. This mitigates issues seen
due to going in and out of airspeed fusion in strong headwinds in MC.

Co-authored-by: bresch <brescianimathieu@gmail.com>
2025-11-26 16:29:19 +01:00
Marco Hauswirth 5eab16c17c PPS time corection capability for GNSS measurements (#25838)
** add PPS time corection capability for GNSS measurements

* * add documentation
* add comment for 'future check'
* replace url with relative link
* Update docs/en/advanced/pps_time_sync.md

Co-authored-by: Silvan Fuhrer <silvan@auterion.com>
* Subedit and add to sidebar
* Apply suggestions from code review
* Update docs/en/SUMMARY.md
* remove offset jump check, clean up
* add comment pps_compensation activation condition. move documentation to hardware integration

---------

Co-authored-by: Hamish Willee <hamishwillee@gmail.com>
Co-authored-by: Silvan Fuhrer <silvan@auterion.com>
2025-11-11 20:56:56 +01:00
Marco Hauswirth c2c721a2d6 * add gnss-fault flags to estimator-status msg
* react to comments
2025-10-03 10:11:41 +02:00
Hamish Willee cbf39f5ceb msg: AirspeedValidated - uorb topic to standard (#25579)
* AirspeedValidated - uorb topic to standard

* Apply suggestions from code review

* Update msg/versioned/AirspeedValidated.msg

* Fix up links to renamed uORB constants

---------

Co-authored-by: PX4BuildBot <bot@pixhawk.org>
2025-09-25 11:02:02 +02:00
Louis-max-H e71faf38a0 Septentrio GNSS resilience reporting (#25012)
Co-authored-by: Tory9 <vvpost05@gmail.com>
2025-09-24 11:08:10 -04:00
bresch 82308da18d ekf2: support heading external update from MAV_CMD_EXTERNAL_ATTITUDE_ESTIMATE 2025-09-18 17:00:16 +02:00
bresch 361d66bb44 ekf2: add reporting of gnss_vel status flag 2025-09-18 17:00:16 +02:00
Jacob Dahl 078e4c911f ekf: always publish baro and gnss bias even if zero (#25385)
* ekf: always publish baro and gnss bias even if zero

* [SQUASH] ekf2: simplify hgt bias publish

---------

Co-authored-by: Daniel Agar <daniel@agar.ca>
2025-08-08 11:18:50 -08:00
Ian Scholl 4812311c6c ekf2: Add GPS fix type check bit (#25215) 2025-08-07 21:50:58 -04:00
Marco Hauswirth c9206d6bd1 EKF2: gnss reset improvements (#25297)
* ekf2: allow manual position reset when horizontal aiding is active

This allows the pilot to override position esitmates manually

* mavlink sim: add support of failure gps struck

* mavlink sim: add GNSS failure "wrong" type

* ekf2-gnss: add reset mode

This allows the user to choose whether the position should immediately
be reset to GNSS on fusion timeout or if the EKF can continue with
velocity dead-reckoning.

* ekf2: fix unit test changes due to GNSS start logic

Especially because the EKF doesn't need to reset the states if the test
ratio is already passing

* rename mode enum

* reset to gps lat lon on init

* remove obsolete reset-condition (handled in #25223)

* WIP try to upgrade compiler externally

---------

Co-authored-by: bresch <brescianimathieu@gmail.com>
Co-authored-by: Niklas Hauser <niklas@auterion.com>
2025-07-30 11:39:56 +02:00
bresch 582b8f0a2b ekf2: allow manual position reset when horizontal aiding is active
This allows the pilot to override position esitmates manually
2025-07-29 14:29:19 +02:00
Jacob Dahl 9cd6840695 fix formatting (#25270) 2025-07-23 19:52:16 +12:00
Marco Hauswirth 6e9fb2ca3c use imu-timestamp instead of hrt_abstime during replay for aid-srcs (#25117) 2025-07-22 22:35:45 -08:00
Jacob Dahl 6a8eea1df9 ekf: update parameter names for consistency (#25137) 2025-07-08 12:11:28 -06:00
Jacob Dahl 95119027a9 ekf2: variable to parameter name consistency (#25042)
Rename various EKF2 variable names to match the PX4 parameter names
2025-06-24 09:15:50 +02:00
bresch e487d59521 Vehicle_odometry: protect angular_velocity field against aliasing
Accumulate delta-angles between each publication to get the correct
angular velocity between two attitudes
2025-06-04 09:01:33 +02:00
Marco Hauswirth f0fdf0b53b EKF2: distinguish airspeed source and use synthetic for wind
Enable wind-dead-reckoning with airspeed source to synthetic airspeed
2025-05-02 13:37:18 +02:00
GuillaumeLaine 648e730c4a ev_odom: always convert reference frame enum 2025-04-04 09:12:53 +02:00
bresch 2aaa54037c ekf2: split gnss pos/vel flags
They can be selected independently in the control parameter, so there is
no reason why they should share the same flag.
2025-03-11 14:14:40 +01:00
Marco Hauswirth 4df65c133e add cs_baro_fault to switch to fallback baro if available (#24260) 2025-01-28 10:37:16 +01:00
bresch c76e74338b ekf-replay: fix airspeed replay
If available, the EKF uses airspeed_validated, not airspeed
2025-01-26 23:05:39 -05:00
Marco Hauswirth 4a5aa1e947 Fix max-hagl restriction to position/altitude control (#23667)
* fix max-hagl restriction to position/altitude control

* max hagl vel restriction in ManAcc position mode

* use interpolate func, change naming

* simplyfied vertical vel limitation

* move velocity-constraint adjustment to StickAccelXY
2025-01-20 15:50:21 +01:00
Nicolas MARTIN 4fe6d69966 local position acceleration: use mean value between two publications (#24105)
To avoid aliasing on the ned acceleration, add an accumulation of acceleration to improve the downsampling
2025-01-03 12:43:39 +01:00
bresch b19a6ee3b5 ekf2: store position state as lat/lon/alt
The position error state is still defined in a body-fixed NED frame but the
position state itself is latitude-longitude-altitude.
2024-11-22 15:13:47 +01:00
Andrew Brahim 834af98992 uavcan: support GNSS heading from relposheading with offset configurable in estimator
* uavcan: add GNSS heading from relposheading
* ekf2: new EKF2_GPS_YAW_OFF parameter to configure any offset in GNSS heading

Signed-off-by: dirksavage88 <dirksavage88@gmail.com>
Co-authored-by: Jacob Dahl <dahl.jakejacob@gmail.com>
2024-11-08 21:52:55 -05:00
Marco Hauswirth 0c451552c7 EKF2: add validity flags to global pos message (#23787)
Co-authored-by: Mathieu Bresciani <brescianimathieu@gmail.com>
2024-10-23 10:19:04 +02:00
Daniel Agar 9238656a33 ekf2: configurable velocity state constraint (EKF2_VEL_LIM)
- replace hardcoded 1000 m/s velocity state constraint with new EKF2_VEL_LIM parameter (default 100 m/s)
 - new velocity limit also used for GPS checks and external vision velocity
2024-10-07 10:35:48 +02:00
Marco Hauswirth 7d0e93b779 ekf2: always publish global position when origin has been set 2024-10-04 11:41:20 -04:00
bresch dbf51da99e ekf2: rework amsl to ellipsoid altitude conversion 2024-10-01 10:40:18 -04:00
Marco Hauswirth 22c2878cf8 send acknowledgement after receiving vehicle wind cmd 2024-09-12 09:34:08 +02:00
Marco Hauswirth 7dcea6b2e4 EKF2: range measurement rejection in rain/fog (#23579) 2024-08-30 17:25:56 +02:00
Daniel Agar 5b0014cb06 ekf2: remove legacy accel z bias checks (#23341)
Co-authored-by: Mathieu Bresciani <brescianimathieu@gmail.com>
2024-08-29 11:51:27 -04:00
bresch bab256bfe6 ekf2: handle external altitude resets 2024-08-28 11:02:26 +02:00
Daniel Agar 6c24413888 ekf2: filter flow vel (used for flow velocity reset)
- individual flow samples can be quite erratic
2024-08-27 10:38:17 -04:00