From 4e59a060a835d444baec36408fa11d1df3ce930f Mon Sep 17 00:00:00 2001 From: mahima-yoga Date: Fri, 30 Jan 2026 10:23:04 +0100 Subject: [PATCH] HomePosition: only set home position using GNSS if bit 0 in EKF2_GPS_CTRL is active If the vehicle position is not set by GNSS, then the home position should not be either. --- src/modules/commander/HomePosition.cpp | 20 ++++++++++++++++++-- src/modules/commander/HomePosition.hpp | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/modules/commander/HomePosition.cpp b/src/modules/commander/HomePosition.cpp index 3825ffe9f5..4eb0f068de 100644 --- a/src/modules/commander/HomePosition.cpp +++ b/src/modules/commander/HomePosition.cpp @@ -40,7 +40,9 @@ #include "commander_helper.h" HomePosition::HomePosition(const failsafe_flags_s &failsafe_flags): ModuleParams(nullptr), - _failsafe_flags(failsafe_flags) {} + _failsafe_flags(failsafe_flags), + _param_ekf2_gps_ctrl_handle(param_find("EKF2_GPS_CTRL")) +{} bool HomePosition::hasMovedFromCurrentHomeLocation() { @@ -299,6 +301,19 @@ void HomePosition::setHomePosValid() _valid = true; } +bool HomePosition::isGpsHorizontalFusionEnabled() +{ + // If parameter doesn't exist, allow GPS usage + if (_param_ekf2_gps_ctrl_handle == PARAM_INVALID) { + return true; + } + + // Check if bit 0 (horizontal position fusion) is set + int32_t ekf2_gps_ctrl = 0; + param_get(_param_ekf2_gps_ctrl_handle, &ekf2_gps_ctrl); + return (ekf2_gps_ctrl & 1); +} + void HomePosition::updateHomePositionYaw(float yaw) { home_position_s home = _home_position_pub.get(); @@ -348,7 +363,8 @@ void HomePosition::update(bool set_automatically, bool check_if_changed) const bool epv_valid = vehicle_gps_position.epv < kHomePositionGPSRequiredEPV; const bool evh_valid = vehicle_gps_position.s_variance_m_s < kHomePositionGPSRequiredEVH; - _gps_position_for_home_valid = time_valid && fix_valid && eph_valid && epv_valid && evh_valid; + _gps_position_for_home_valid = time_valid && fix_valid && eph_valid && epv_valid && evh_valid + && isGpsHorizontalFusionEnabled(); if (_param_com_home_en.get() && _gps_position_for_home_valid && _last_gps_timestamp != 0 && _last_baro_timestamp != 0 && _takeoff_time != 0 && now < _takeoff_time + kHomePositionCorrectionTimeWindow) { diff --git a/src/modules/commander/HomePosition.hpp b/src/modules/commander/HomePosition.hpp index dd218c902e..fd5eb1e72d 100644 --- a/src/modules/commander/HomePosition.hpp +++ b/src/modules/commander/HomePosition.hpp @@ -74,6 +74,7 @@ public: private: bool hasMovedFromCurrentHomeLocation(); + bool isGpsHorizontalFusionEnabled(); void setHomePosValid(); void updateHomePositionYaw(float yaw); @@ -113,4 +114,5 @@ private: DEFINE_PARAMETERS( (ParamBool) _param_com_home_en ) + param_t _param_ekf2_gps_ctrl_handle{PARAM_INVALID}; };