Georacer
(George Zogopoulos)
March 25, 2026, 9:20am
1
Attendees (max) : 10
UTC0700
master ← Huibean:pr-fix-lte-modem-lua-bad-tac-hex
opened 05:58AM - 25 Mar 26 UTC
## Summary
## Testing (more checks increases chance of being merged)
Fix… error raised in the LTE modem lua
```AP: LTE_modem error: ./scripts/LTE_modem.lua:1126: bad argument #1 to 'tonumber' (string expected, got nil)```
- [x] Checked by a human programmer
- [x] Tested in SITL
- [x] Tested on hardware
- [ ] Logs attached
- [x] Logs available on request
- [ ] Autotest included
## Description
1. fix hex regex expression to filter string like ```abc 0x1234```, ```0x1234 xyz```, ```0xGHIJK```, ```0x12_34```
2. fix passing nil to ```to_numbder``` with 16 base
bad data captured
```+CPSI: LTE,Online,***-..,.x1234,*********,76,EUTRAN-BAND3,1300,5,5,-92,-952,-667,14```
Andrew : The .x1234 part looks like garbage. Could it be the result of bad level shifting?
Huibean : Perhaps, that “.” jumps around. But it is easily reproducible.
A : But yes, we do need to catch errors better.
And throw away the whole packet.
Could you send me the ltemodem.log file?
H : Yes, I’ll generate a new one.
UTC0711
master ← rmackay9:secure-firemware-typo-fix
opened 04:57AM - 25 Mar 26 UTC
## Summary
These are some fixes (I think) to the signing README discovered wh… ile following our [Creating Tamperproof Firmware wiki instructions](https://ardupilot.org/dev/docs/secure-firmware.html)
## Testing (more checks increases chance of being merged)
- [x] Checked by a human programmer
- [ ] Tested in SITL
- [x] Tested on hardware
- [ ] Logs attached
- [ ] Logs available on request
- [ ] Autotest included
I'd like feedback from experts in this area on whether they think these change are correct
MergeOnCIPass!
A : By the way, the reason we can’t block the upload of unsigned firmware, is that in order to check it, we need to store it in the flash. And we don’t have the space to store it temporarily.
UTC0722
master ← aryanputta:patch-1
opened 08:24PM - 23 Mar 26 UTC
## Summary
Write_POS() now logs the best-guess position when get_location() r… eturns false instead of silently skipping the record.
Fixes issue #32458.
## Testing
- [x] Checked by a human programmer
## Description
get_location() fills loc with the best available position estimate even when it returns false (e.g. when GPS fix has not been acquired). The early return in Write_POS() caused the POS log message to be silently skipped during that window, losing estimated-path data that is useful for post-flight analysis and EKF debugging.
Remove the early return and unconditionally call get_location(loc) so that a POS record is always written, using whatever position estimate the AHRS currently holds.
No AI used.
Peter : Would be nice if we could establish a flag value that tells the plotting tools that values are invalid and should not be plotted.
UTC0728
master ← snktshrma:dev/multi-dds
opened 09:51AM - 21 Mar 26 UTC
## Summary
Closes https://github.com/ArduPilot/ardupilot/issues/23567. Adds s… upport for multiple DDS clients and vehicles by introducing namespacing based on sysid.
## Testing (more checks increases chance of being merged)
- [x] Checked by a human programmer
- [x] Tested in SITL
- [ ] Tested on hardware
- [ ] Logs attached
- [ ] Autotest included
- [ ] Logs available on request
## Description
Earlier, running more than one AP + DDS setup against a single agent caused conflicts because all instances used the same client ID and non-namespaced ROS 2 names.
This PR introduces namespacing and client identification based on the vehicle’s sysid. ROS naming is updated to use a /v\<sysid\> format (e.g., /ap/v3/...) for vehicle identifiers.
SITL tests with multiple vehicles (of different builds as well) works as intended
Adds a new param `DDS_USE_NS` to toggle between namespaced ros2 names.
### To test:
1. Run micro ros agent:
```
ros2 run micro_ros_agent micro_ros_agent udp4 -p 2019
```
2. Run atleast 2 instances of sitl with DDS enabled and enable `DDS_USE_NS 1` and reboot (either use -n arg or simple -I arg for different instances, but make sure sysid is different):
```
sim_vehicle.py -v ArduPlane --console --enable-DDS --map -DG -I0
sim_vehicle.py -v ArduCopter --console --enable-DDS --map -DG -I1
```
It is also possible to run multiple agents. Just change the port (default 2019) when running the agent and match that with vehicle's `DDS_UDP_PORT` .
TO-DO:
- [x] Add namespacing and variable client ID
- [x] Update DDS tests with new nomenclature
- [x] Finalise test with ardupilot_gz with multi-vehicle support (https://github.com/ArduPilot/ardupilot_gz/pull/67) (@srmainwaring)
<img width="1920" height="1043" alt="Screenshot from 2026-03-21 13-46-45" src="https://github.com/user-attachments/assets/4826b144-a31d-498b-b011-219e157ee1a6" />
Rhys : We are using the SysID as a namespace, to encapsulate the DDS messages.
Peter : We could have the default to add the new SysID, instead of having it opt-in.
Rhys : I thought I wouldn’t break the existing functionality.
By the way, the Zenoh transport layer has been working much better for me in lossy networks.
master ← andyp1per:ahrs-dcm-fallback-fix
opened 05:50PM - 20 Mar 26 UTC
Fix AHRS_OPTIONS DISABLE_DCM_FALLBACK bits (0+1) being bypassed when the EKF los… es vert_vel or vert_pos but still has
attitude.
In _active_EKF_type(), the !can_use_ekf path unconditionally returned DCM, positioned before the DISABLE_DCM_FALLBACK
check. When GPS spoofing corrupted the EKF state covariance, the EKF could lose vert_vel or vert_pos while still
having a valid IMU-based attitude estimate. The code fell through to DCM despite the user explicitly disabling DCM
fallback.
This caused rapid DCM/EKF toggling (5+ times in 15 seconds) during GPS spoofing events. Each toggle produced an
attitude discontinuity that compounded flight controller instability. This toggling can
amplify the uncontrolled descent despite AHRS_OPTIONS bits 0+1 being set.
Fix: Check DISABLE_DCM_FALLBACK in the !can_use_ekf path, gated on whether the EKF still has attitude. Only genuine
attitude loss (IMU failure, complete filter divergence) triggers DCM fallback when the disable bits are set.
Also handles a secondary issue: on Plane, always_use_EKF() returns true when DISABLE_DCM_FALLBACK is set, which uses
getFilterFaults() (zero during GPS spoofing) instead of EKF3.healthy() (false during GPS spoofing) to decide ret. When
ret was stuck as DCM from fallback_active_EKF_type(), filt_state was never queried from EKF3, guaranteeing
can_use_ekf=false. The fix uses ekf_type() to return the user's configured EKF type when ret is DCM but the user
disabled DCM fallback.
Validated in RealFlight with simulated GPS spoofing (200 m/s velocity error, 500m altitude offset on GPS1 while GPS2
stays clean with EK3_AFFINITY=1). No DCM fallback during spoofing.
UTC0801
master ← andyp1per:ahrs-recorded-origin-fix
opened 03:56PM - 20 Mar 26 UTC
Fix a race condition where the recorded EKF origin is lost at startup, breaking … position reporting and navigation.
### Problem
When using recorded origin (`AHRS_OPTIONS` bit 0), `use_recorded_origin_maybe()` sets the origin on EKF3 cores during the AHRS update loop. However, `InitialiseFilterBootstrap()` calls `InitialiseVariables()` ~1s after boot, which resets `validOrigin` on each core. Since `state.origin_ok` was already set true, the AHRS never re-applies the recorded origin.
**Impact:** `getLLH()` returns false for the rest of the session:
- `GLOBAL_POSITION_INT` lat/lng never updates — GCS shows stationary vehicle
- `have_position` is false — navigation modes (RTL, GUIDED, LOITER) cannot compute correct bearings or distances
- Vehicle drifts 1km+ instead of returning to launch on RTL
### Fix
Guard `NavEKF3_core::setOriginLLH()` to reject calls while `statesInitialised` is false. This prevents the origin from being set before `InitialiseVariables()` wipes it. AHRS's `use_recorded_origin_maybe()` naturally retries each cycle, so the origin is applied once the filter is ready.
This replaces the earlier AHRS-level workaround (detecting and re-applying the lost origin) with a fix at the source, per review feedback from @rmackay9.
## Testing
- [X] `AHRSOriginRecorded` autotest passes
- [X] Tested in SITL
- [ ] Tested on hardware
P : This will not work correctly when a GCS asks to set the origin before it’s possible. This will fail, but won’t return the correct failure value.
Randy : It’s better that we fix the original problem at the source, instead of patching origin issues.
I also had another branch which modifies initializeFilterBootstrap().
Andy : I had the same fix initially, but opted out of it.
Merged.
UTC0816
master ← peterbarker:pr-claude/gps-fixtype-changes
opened 06:37AM - 20 Mar 26 UTC
## Summary
We have too many enumerations used for this stuff - this gets rid … of one of them!
## Testing (more checks increases chance of being merged)
- [x] Checked by a human programmer
- [ ] Tested in SITL
- [ ] Tested on hardware
- [ ] Logs attached
- [ ] Logs available on request
- [ ] Autotest included
## Description
We have AP_GPS_FixType which is present even when the AP_GPS library is not. That means you can compile out the AP_GPS header and still have e.g. AP_ADSB still compile.
This is pretty much a no-compiler-output change, except where objects were storing an instance of the enumeration from the mavlink bindings. Since the new thing is only 8 bits wide, there are alignment and machine code instruction changes in the ADSB and ExternalAHRS libraries. Only boards using those libraries are modified
P : Gets rid of one of the many enums describing GNSS RX state.
Almost a no compiler change.
MergeOnCIPass
UTC0820
master ← srmainwaring:prs/ros2-use-instance-dir
opened 05:13PM - 19 Mar 26 UTC
## Summary
Add an optional boolean launch argument to the ROS 2 SITL launch s… cripts. If `use_instance_dir` is True then create a directory based on the instance to store `eeprom.bin` and other files created by SITL. This is required for multi-vehicle launches to avoid conflict.
Related: https://github.com/ArduPilot/ardupilot_gz/pull/67
## Testing (more checks increases chance of being merged)
- [x] Checked by a human programmer
- [x] Tested in SITL
- [ ] Tested on hardware
- [ ] Logs attached
- [ ] Logs available on request
- [ ] Autotest included
## Description
Add a new launch argument `use_instance_dir` to the `SITLLaunch`. The default is `False` preserving existing behaviour.
When `True` a subdirectory is created in the current working directory using the `instance` argument. This is passed to the `ExecuteProcess` launch directive ensuring SITL is started in the scoped directory.
Merged!
UTC0821
master ← peterbarker:pr-claude/AP_MAVLINK_UTM_GLOBAL_POSITION_SENDING_ENABLED
opened 05:47AM - 18 Mar 26 UTC
## Summary
Adds the ability to send the MAVLink `UTM_GLOBAL_POSITION` message…
## Testing (more checks increases chance of being merged)
- [x] Checked by a human programmer
- [x] Tested in SITL
- [ ] Tested on hardware
- [ ] Logs attached
- [x] Logs available on request
- [x] Autotest included
## Description
Apparently this is becoming rather popular for traffic management purposes.
I've gated the new `wp` method on the new define to preserve no-compiler-output-change for boards that don't have this compiled in. It shouldn't stay that forever, and it's possible we might factor `NAV_CONTROLLER_OUTPUT` up at some stage to use it (replacing `wp_bearing` and `wp_distance`, perhaps).
Even when compiled in this is not streamed by default.
I've chosen to re-use the `global_position_relative_alt()` method (and friend), on the basis that the Sub guys know what they're doing ( @Williangalvani )
P : We had this tested IRL, with positive impressions.
Approved!
MergeOnCIPass!
UTC0829
master ← Georacer:pr/log_spool_rate
opened 09:43PM - 05 Dec 25 UTC
I thought I'd log this one.
I opted for logging at loop rate, since its chang… es are very fast, but also crucial to track down the logic. At the default 10Hz which MOTB gets logged (the closest message), we'd be bound to miss data. Plus, MOTB gets logged only for multicopters, whereas the spool state is also used in other Copter frames.
It's set to log only upon changes, so the log size impact should be negligible.
It gets logged only when the MotBatt logging flag is set.
Tested to work in SITL.
MergeOnCIPass
UTC0834
master ← andyp1per:pr-gpsxy-origin
opened 12:03PM - 17 Mar 26 UTC
## Summary
- Fix `use_recorded_origin_maybe()` to check GPS *position* source i… nstead of any GPS usage
- Prevents recorded origin from being incorrectly blocked when GPS is used only for VelZ or yaw, not position
## Testing
- [x] Checked by a human programmer
- [x] Tested in SITL
- [x] Tested on hardware
- [ ] Logs attached
- [ ] Logs available on request
- [ ] Autotest included
## Description
The recorded EKF origin is immutable once set. When GPS is configured as the horizontal position source, GPS will set the origin when it gets a fix — so the recorded origin must not be loaded (it would prevent GPS from setting a correct one later).
Previously, `use_recorded_origin_maybe()` called `using_gps()`, which checks all GPS source types (PosXY, VelXY, VelZ, and GSF yaw). This caused recorded origin loading to be blocked in GPS-denied configurations where `EK3_SRC1_POSXY` was set to EXTNAV but `EK3_SRC1_VELZ` defaulted to GPS.
This PR:
1. **AP_NavEKF3:** Adds `configuredToUseGPSForPos()` which checks if GPS is configured as either the XY or Z position source (extends the existing `configuredToUseGPSForPosXY()`)
2. **AP_AHRS:** Adds `using_gps_for_pos()` which checks if GPS is configured as the position source for the active EKF type, and uses it in `use_recorded_origin_maybe()` instead of the overly broad `using_gps()`
Merged!
UTC0837
master ← Georacer:pr/log_rangefinder_state
opened 10:12PM - 24 Nov 25 UTC
I've recently tried to debug some landing logs and I've always stumbled guessing… the rangefinder state information.
This PR adds logging of the whole structure.
MergeOnCIPass!
UTC0843
master ← andyp1per:pr-ins-low-noise
opened 08:57PM - 08 Mar 26 UTC
## Summary
- Add `AP_INERTIALSENSOR_LOW_NOISE` define that boards can set in … their hwdef to indicate a low-noise IMU configuration
- When enabled, reduce EKF3 gyro bias learning limits (`GYRO_BIAS_LIMIT` from 0.5 to `radians(2.0)` and `InitialGyroBiasUncertainty` from 2.5 to 1.0) since low-noise IMUs don't need as wide bias estimation range
This allows boards with known low-noise IMUs (e.g. ICM-42688-P with good vibration isolation) to get tighter EKF tuning automatically, improving convergence speed and reducing false bias estimates.
## Test plan
- [x] Build with `AP_INERTIALSENSOR_LOW_NOISE0` (default) - verify unchanged behavior
- [x] Build with `AP_INERTIALSENSOR_LOW_NOISE1` in hwdef - verify tighter bias limits
- [x] SITL test comparing EKF3 gyro bias convergence with and without the flag
- [x] Verify no build warnings or errors on common boards
A : A better name would be AP_INERTIALSENSOR_LOW_DRIFT.
Andy : We should probably add a property to the sensors to describe the drift expected limit.