100 Commits
Author SHA1 Message Date
bresch f5f3394b64 chore(ekf2): add ground position lock documentation 2026-03-19 11:48:09 +01: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
bresch c71e196dcf feat(fw q att control): improve pitchrate tracking using turn coordination constraint
refactor(fw_att_control): clean-up & optimization
2026-03-17 17:59:20 +01:00
bresch cdcdd1096f fix(ekf2): add missing in_transition flag 2026-03-13 17:46:31 +01:00
bresch acab9fdceb chore(ekf2): update change indicator
Initialization slightly changes as no zero innovation update is used
anymore
2026-03-13 17:46:31 +01:00
bresch 074e787a91 feat(ekf2): remove zero innovation heading update
This is no longer necessary with the heading observability check
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
Mathieu Bresciani 1a0b7dae9d fix(ekf2): remove heading corrections from gravity fusion (#26694) 2026-03-09 11:31:44 -08:00
bresch 5395b3823a ekf2: disable heading update in drag fusion 2026-02-25 15:40:01 +01:00
bresch 5d5e1db97f ekf2: update change indicator 2026-01-23 14:46:08 +01:00
bresch d3da4fe608 ekf2 mag: clear mag_fault when healthy again 2026-01-23 14:46:08 +01: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
bresch 2ad25570ee do not check pointer validity before deleting
Deleting a nullptr has no effect
(this addresses a clang-tidy error)
2026-01-22 10:03:24 +01:00
Mathieu Bresciani c71e2d41d6 Fixedwing: Fix circular landing when global origin is not set (#26223)
When not specified by navigator, the center of the landing orbit is set
to the current position when landing is triggered.
2026-01-08 14:44:00 +01:00
bresch 6195629373 ekf2: add test for external wind reset 2025-12-18 11:37:10 +01:00
bresch 2c044b327e ekf2: refactor airspeed starting logic
- avoids using invalid velocity estimate to reset wind
- do not set fusion flags if starting was impossible
- reset wind to 0 before resetting velocity using airspeed if wind data
  is outdated
2025-12-18 11:37:10 +01:00
bresch ccaad82f61 mc_att: remove dependency to heading_god_for_control
Absolute heading is not required in stabilized mode and a change in
heading convergence is already handled by the StickYaw class using
unaided_heading
2025-12-17 16:59:47 +01:00
bresch d62f112017 ekf2: prevent false mag fault detection
A false positive could be triggered if velocity fusion started,
then stopped after takeoff and only position fusion started again
(because velocity fusion timed out and had a timestamp > time_last_on_ground).
We now also check if the fusion timeout is due to the innovation being
rejected (and not just a temporary check failure or data interruption).
2025-12-15 14:06:04 +01:00
bresch 4fbff2cdd9 fw gain compression: add docs 2025-11-27 17:33:06 +01:00
bresch 3646032296 fw rate: add gain compression algorithm 2025-11-27 17:33:06 +01:00
bresch 45e8712d60 VectorNav: set global position validity 2025-11-24 12:00:55 +01:00
bresch c06ba93175 mc-auto: handle EKF heading reset 2025-09-18 17:00:16 +02:00
bresch 82308da18d ekf2: support heading external update from MAV_CMD_EXTERNAL_ATTITUDE_ESTIMATE 2025-09-18 17:00:16 +02:00
bresch eba0b99950 ekf2: remove unnecessary code
The delta angles are now correctly accumulated in case
multiple resets are triggered during the same epoch
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
bresch 4a697d0191 ekf2: stop GNSS altittude and velocity aiding when gnss_fault is set 2025-08-25 10:22:23 +02:00
bresch cfe1666add Mavlink: Stream the received auxiliary global position from dds over Mavlink 2025-08-08 10:57:30 +02:00
bresch 77e8ccaf6a fw-atune: fix immediate failure on first try
The flight mode needs to be updated before starting the autotune,
otherwise it appears as a mode change and aborts the autotune
2025-08-04 16:42:54 +02:00
bresch 61e741e7d0 FlightTask manual acc: handle ekf position reset properly 2025-07-29 14:29:19 +02:00
bresch b740a43b3d ekf2: reset manual position update through fusion
This provides a position reset-like behavior while still updating the
correlated states through fusion of position information.
2025-07-29 14:29:19 +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
bresch 646133a4bf AGP: format enum names 2025-07-29 14:29:19 +02:00
bresch 0b2e4f1ab6 ekf-agp: add reset mode behavior 2025-07-29 14:29:19 +02:00
bresch bfbc76189e ekf-agp: use same timeout value as other aid sources 2025-07-16 10:07:15 +02:00
bresch 54f2652329 ekf2: always decorrelate pos and vel in vel reset 2025-07-15 13:44:55 +02:00
bresch d35c5f4a4e SIH-plane: tune angular rate controllers 2025-07-04 16:14:27 +02:00
bresch 457ce90541 ekf2: run simplified GNSS checks after initial fix
This prevents stopping GNSS fusion on slightly degraded solution when
tight checks are set
2025-06-06 15:59:56 +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
bresch 0e32b155f3 ekf2: simplify names of scoped variables 2025-06-03 09:22:32 +02:00
bresch c33d79cfb4 ekf2: move gnss_checks to their own class 2025-06-03 09:22:32 +02:00
bresch 2dbce4d958 ekf2: replace defines with enum class 2025-06-03 09:22:32 +02:00
bresch 5332010b13 ekf2: move on ground GNSS checks to separate function 2025-06-03 09:22:32 +02:00
bresch 6b8bf80423 ekf2-mag: never skip post-takeoff mag yaw reset 2025-05-06 11:24:31 -04:00
bresch e7250bc8d5 ekf2: do not let mag heading and declination update xy gyro biases
This can destabilize the tilt estimate when the mag field is disturbed
2025-05-02 10:23:43 +02:00
bresch a40377e544 ekf2: always update IMU filters 2025-05-02 10:23:43 +02:00
bresch 6a105bcbdb ekf2-grav: accelerate tilt alignment 2025-05-02 10:23:43 +02:00
bresch c59101e8ed ekf2-gravity: do not estimate accel bias when gravity fusion is active
Gravity fusion uses the bias corrected accelerometer data to correct the
tilt estimate. We should not continue to estimate the accel bias when
this is active as it creates an unwanted feedback loop.
2025-05-02 10:23:43 +02:00
bresch ee30b70a3c ekf2-gravity: start based on accel LPF instead of peak hold
This prevent rapid switching in presence of noise and the innovation
filter is good at rejecting spikes
2025-05-02 10:23:43 +02:00
bresch 6ec6f1b297 ekf2-decl: do not always update tilt 2025-05-02 10:23:43 +02:00
bresch b5f011a31f cal: transpose rotation instead of computing inverse
This is equivalent for an orthonormal matrix
2025-04-29 10:26:51 +02:00
bresch e35c1f430c EKF-AGP: only reset lat/lon when starting 2025-04-01 16:42:26 +03:00
bresch f73c7977dd ekf2-flow: limit minimum flow hagl 2025-03-31 11:34:25 +02:00
bresch 53bdceb895 ekf2-flow: check test ratio on Y axis separately 2025-03-31 11:34:25 +02:00
bresch cdab0cb6e4 ekf2-flow: use same measurement prediction as in jacobian derivation
Also avoid double division in flow prediction
2025-03-31 11:34:25 +02:00
bresch 82ea544e8c ekf2-test: add flow unit test for negative distance 2025-03-31 11:34:25 +02:00
bresch 82a482ec0b ekf2: reset heading when mag calibration changed 2025-03-26 22:32:51 -04:00
bresch 49624a6457 mag: synchronize calibration count with newly calibrated data
The data contained a mix between the old and new calibration. This
caused the EKF to reset to an incorrect (intermediate) heading.
2025-03-26 22:32:51 -04:00
bresch fa0ba69083 ReplayEkf: correctly add all subscriptions
Logged data and subscription messages can be mixed, so don't stop adding
subscriptions after finding the first logged message
2025-03-17 10:01:48 +01:00
bresch 30a6a854c1 ReplayEKF: reduce effect of IMU time slip 2025-03-17 10:01:48 +01:00
bresch 9ac03f03eb ekf2: consider GNSS vel as horizontal velocity aiding 2025-03-14 18:22:00 +01:00
bresch b5e2395982 GPS2_RAW: fill extension fields 2025-03-12 13:12:38 +01: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
bresch da3a0656d4 ekf replay: set timestamps in us 2025-03-11 14:14:00 +01:00
bresch cae4f94476 ekf2-replay: best effort replay when no ekf2_timestamps
Run at sensor_combined speed and publish all other sensors occuring
between 2 sonsor_combined samples.
This allows a crude replay in case ekf2 replay was not enabled during
the flight.
2025-03-11 14:14:00 +01:00
bresch 7e0d04e446 ekf2: fix flow derivation for negative hagl
The partial derivative of the flow observation with respect
to the terrain and height states involve calculating the derivative
of 1/x, which is -1/x^2. This function is even, making the estimate
diverge in case x (the height above ground) is negative.
The solution is to take the derivative of 1/|x|,
which is -x/|x|^3 and is an odd function; preserving the sign of x.
Note that for positive values of x, the expression reduces to -1/x^2
2025-03-10 17:11:53 -04:00
Mathieu Bresciani 0ab3e45c13 MC auto: improve behavior of RC help during landing
Letting the autopilot set the heading during landing while the pilot is
nudging the vehile leads to a weird UX as the vehicle would make a turn
instead of translating.
With this modification, the initial land heading is immediately overridden when the pilot
begins to adjust the drone's position, providing the sensation of full control.
2025-03-05 16:37:26 +01:00
bresch 71d514d359 replay: avoid recursion when adding subscriptions
readAndAddSubscription uses nextDataMessage to find the first
corresponding data and nextDataMessage calls readAndAddSubscription
when it finds a new message definition.
2025-03-03 22:32:55 -05:00
bresch 2d1652f499 Commander: fix parachute trigger
Setting "lockdown" disables the actuators. In this mode,
"force_failsafe" has no effect as the actuators are disabled, so the
parachute is not getting released as it requires the output to change to
its failsafe value.
2025-03-03 15:41:39 +01:00
bresch c09c63171c MC auto: fix land nudging
Revert removal of isTargetModified as this is required when the target
is changed by "RC help" (nudging) during landing.
2025-02-25 09:11:23 +01:00
bresch 5e06ab1430 ekf-agp: do not reset to AGP if GNSS fusion is active 2025-02-18 14:35:10 +01:00
bresch fe5c887895 mag check: do not require mag 0
sys_has_mag defines the required number of mags; if one mag is needed,
it can be any instance, not necessarily mag 0
2025-02-14 16:12:20 +01:00
bresch e3fd50667d Mag cal: automatically disable internal mags if external ones are available 2025-02-14 16:12:20 +01:00
bresch 8d296a50f9 FlightTask: properly initialize EKF reset counters
This fixes a race condition when switching from a flight mode that is
not a flight task (e.g.: stabilized). In this case, the reset counters
were initialized to 0 and deltas were applied to the first setpoints if
the EKF had any of its reset counters different from 0.
2025-02-05 13:21:32 -05:00
bresch 3b828e157a MC att: clarify prioritization algorithm
Especially rename "mix" which is just the delta yaw angle
2025-01-30 11:28:26 +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
bresch caaae6ed51 ekf2: allow sideslip fusion to always start with airspeed fusion
This allow sideslip fusion to start during VTOL front transition or even
on a multirotor with a vertical stabilizer and an airspeed sensor for example.
2025-01-22 09:33:16 +01:00
Mathieu Bresciani 0d22905558 VTOL params: fix param name 2025-01-20 15:50:06 +01:00
bresch c99cb6e94b ekf2: do not auto-generate sideslip measurement jacobian
This is to trade a bit of CPU load for more flash space.
2025-01-15 11:05:50 -05:00
8ecb76aba2 [Multirotor] add yaw torque low pass filter (#24173)
co-authored-by: danielmellinger <107884356+danielmellinger@users.noreply.github.com>
co-authored-by: Eric Katzfey <eric.katzfey@modalai.com>
2025-01-15 14:02:28 +01:00
bresch 12a9087e92 ekf2: constrain max variance by zero innovation update
Clipping the variance of the covariance matrix has a destabilizing
effect as it increases the correlation between the states.
2025-01-14 21:42:33 -05:00
bresch ab70ae3252 ekf2: fix GNSS drift false alarm
In SIH, the GNSS signal is zero-mean, but apparently not symmetric. The
issue is that saturating such a signal creates an artificial bias. This
made the check fail as the bias was above the threshold.
2025-01-08 21:40:25 -05:00
bresch b1773df441 ekf2: fix comments about primary height sources
Having the xxx_hgt flag set only means that the sensor is fused for
altitude/height aiding. It's not necessarily the height reference.
2025-01-07 10:23:13 +01:00
bresch f1a339e7c6 fw-att: avoid multiple conversions 2025-01-03 15:07:52 +01:00
bresch 9bf5257e0e fw-att: fix wheel controller 2025-01-03 15:07:52 +01:00
bresch c1589ddb18 ekf2-rng: do not continuously reset terrain in rng height ref
When the height reference datum is ground level (range finder height
ref), the terrain state is not updated through fusion and should stay at
a constant altitude.
2025-01-03 12:25:16 +01:00
bresch 1b105c937d RpmControl: remove raw RPM spikes using median filter 2024-12-19 07:30:25 +01:00
bresch 6b10f1ca12 ekf: update change indicator
The calculation of "alpha" in the accel_horiz and height_rate lowpass
filters is slightly different than before.
2024-12-18 14:11:08 +01:00
bresch 480c232bfd ekf2: use alpha filter class 2024-12-18 14:11:08 +01:00
bresch fa5a781e20 AlphaFilter: set time constant instead of alpha
Then the update function can set the dt at every iteration if needed
2024-12-18 14:11:08 +01:00
bresch 37401d6fd1 AlphaFilter: allow setting dt in update call 2024-12-18 14:11:08 +01:00
bresch 4a73195007 yaw_est: store attitude as quaternion instead of DCM
This saves flash and makes code simpler
2024-12-18 09:33:11 +01:00
bresch 6969e5b6b4 ekf2: do not pre-compute airspeed Kalman gain
The generated code is not much faster than the simple matrix-vector
multiplication
2024-12-17 22:32:16 -05:00
bresch 3941b19968 ekf2_replay: log groundtruth messages 2024-12-13 17:40:08 +01:00
bresch 3165a77e26 SIH-AGP: add sensor failure simulation 2024-12-13 17:40:08 +01:00
bresch 2a08d4bdb8 add SensorAgpSim to generate Aux Global Position data 2024-12-13 17:40:08 +01:00
bresch f9140fcd50 ekf2: set baro bias when GNSS is alt ref
Do this even when GNSS altitude fusion is disabled.
2024-12-13 14:55:46 +01:00
bresch fad9ae855d EKF2: reset aid src when resetting state to measurement
Filtered innovations and test ratios can be large before the reset and
would trigger pre-flight warnings
2024-12-13 14:26:57 +01:00
bresch cc92979b06 ekf-agp: fix timeout 2024-12-12 15:49:04 +01:00
bresch 8626019ae0 EKF2: reset global position using variance 2024-12-03 13:04:25 +01:00
bresch 6b637f82f8 lla; fix conversion to ECEF 2024-12-03 13:03:54 +01:00