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