Skip to content

Commit d97a8d7

Browse files
eyeam3bkueng
authored andcommitted
mode: control auto set home from an external mode
The mode executor can run land mode which updates the home position to the landing location. This can be not the desirable behavior and the home position should stay at the original location. A flag is added to the configuration overrides to control if the home position is updated or not.
1 parent a2299b0 commit d97a8d7

File tree

6 files changed

+73
-5
lines changed

6 files changed

+73
-5
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Configurable overrides by (external) modes or mode executors
2+
3+
uint32 MESSAGE_VERSION = 0
4+
5+
uint64 timestamp # time since system start (microseconds)
6+
7+
bool disable_auto_disarm # Prevent the drone from automatically disarming after landing (if configured)
8+
9+
bool defer_failsafes # Defer all failsafes that can be deferred (until the flag is cleared)
10+
int16 defer_failsafes_timeout_s # Maximum time a failsafe can be deferred. 0 = system default, -1 = no timeout
11+
12+
13+
int8 SOURCE_TYPE_MODE = 0
14+
int8 SOURCE_TYPE_MODE_EXECUTOR = 1
15+
int8 source_type
16+
17+
uint8 source_id # ID depending on source_type
18+
19+
uint8 ORB_QUEUE_LENGTH = 4
20+
21+
# TOPICS config_overrides config_overrides_request

msg/translation_node/translations/all_translations.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "translation_arming_check_reply_v1.h"
1111
#include "translation_arming_check_request_v1.h"
1212
#include "translation_battery_status_v1.h"
13+
#include "translation_config_overrides_v1.h"
1314
#include "translation_event_v1.h"
1415
#include "translation_home_position_v1.h"
1516
#include "translation_register_ext_component_reply_v1.h"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/****************************************************************************
2+
* Copyright (c) 2025 PX4 Development Team.
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
****************************************************************************/
5+
#pragma once
6+
7+
// Translate ConfigOverrides v0 <--> v1
8+
#include <px4_msgs_old/msg/config_overrides_v0.hpp>
9+
#include <px4_msgs/msg/config_overrides.hpp>
10+
11+
class ConfigOverridesV1Translation {
12+
public:
13+
using MessageOlder = px4_msgs_old::msg::ConfigOverridesV0;
14+
static_assert(MessageOlder::MESSAGE_VERSION == 0);
15+
16+
using MessageNewer = px4_msgs::msg::ConfigOverrides;
17+
static_assert(MessageNewer::MESSAGE_VERSION == 1);
18+
19+
static constexpr const char* kTopic = "fmu/in/config_overrides_request";
20+
21+
static void fromOlder(const MessageOlder &msg_older, MessageNewer &msg_newer) {
22+
msg_newer.timestamp = msg_older.timestamp;
23+
msg_newer.disable_auto_disarm = msg_older.disable_auto_disarm;
24+
msg_newer.defer_failsafes = msg_older.defer_failsafes;
25+
msg_newer.defer_failsafes_timeout_s = msg_older.defer_failsafes_timeout_s;
26+
msg_newer.disable_auto_set_home = false;
27+
msg_newer.source_type = msg_older.source_type;
28+
msg_newer.source_id = msg_older.source_id;
29+
}
30+
31+
static void toOlder(const MessageNewer &msg_newer, MessageOlder &msg_older) {
32+
msg_older.timestamp = msg_newer.timestamp;
33+
msg_older.disable_auto_disarm = msg_newer.disable_auto_disarm;
34+
msg_older.defer_failsafes = msg_newer.defer_failsafes;
35+
msg_older.defer_failsafes_timeout_s = msg_newer.defer_failsafes_timeout_s;
36+
msg_older.source_type = msg_newer.source_type;
37+
msg_older.source_id = msg_newer.source_id;
38+
}
39+
};
40+
41+
REGISTER_TOPIC_TRANSLATION_DIRECT(ConfigOverridesV1Translation);

msg/versioned/ConfigOverrides.msg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# Configurable overrides by (external) modes or mode executors
22

3-
uint32 MESSAGE_VERSION = 0
3+
uint32 MESSAGE_VERSION = 1
44

55
uint64 timestamp # time since system start (microseconds)
66

77
bool disable_auto_disarm # Prevent the drone from automatically disarming after landing (if configured)
88

99
bool defer_failsafes # Defer all failsafes that can be deferred (until the flag is cleared)
1010
int16 defer_failsafes_timeout_s # Maximum time a failsafe can be deferred. 0 = system default, -1 = no timeout
11-
11+
bool disable_auto_set_home # Prevent the drone from automatically setting the home position on arm or takeoff
1212

1313
int8 SOURCE_TYPE_MODE = 0
1414
int8 SOURCE_TYPE_MODE_EXECUTOR = 1

src/modules/commander/Commander.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ transition_result_t Commander::arm(arm_disarm_reason_t calling_reason, bool run_
638638
events::send<events::px4::enums::arm_disarm_reason_t>(events::ID("commander_armed_by"), events::Log::Info,
639639
"Armed by {1}", calling_reason);
640640

641-
if (_param_com_home_en.get() && !_mission_in_progress) {
641+
if (_param_com_home_en.get() && !_mission_in_progress && !_config_overrides.disable_auto_set_home) {
642642
_home_position.setHomePosition();
643643
}
644644

@@ -1850,7 +1850,8 @@ void Commander::run()
18501850
_mission_in_progress = (_vehicle_status.nav_state == vehicle_status_s::NAVIGATION_STATE_AUTO_MISSION)
18511851
&& !_mission_result_sub.get().finished;
18521852

1853-
_home_position.update(_param_com_home_en.get(), !isArmed() && _vehicle_land_detected.landed && !_mission_in_progress);
1853+
_home_position.update(_param_com_home_en.get(), !isArmed() && _vehicle_land_detected.landed && !_mission_in_progress
1854+
&& !_config_overrides.disable_auto_set_home);
18541855

18551856
handleAutoDisarm();
18561857

@@ -2140,7 +2141,7 @@ void Commander::landDetectorUpdate()
21402141
}
21412142

21422143
// automatically set or update home position
2143-
if (_param_com_home_en.get() && !_mission_in_progress) {
2144+
if (_param_com_home_en.get() && !_mission_in_progress && !_config_overrides.disable_auto_set_home) {
21442145
// set the home position when taking off
21452146
if (!_vehicle_land_detected.landed) {
21462147
if (was_landed) {

src/modules/commander/ModeManagement.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,10 @@ void ModeManagement::updateActiveConfigOverrides(uint8_t nav_state, config_overr
563563
current_overrides.disable_auto_disarm = true;
564564
}
565565

566+
if (executor_overrides.disable_auto_set_home) {
567+
current_overrides.disable_auto_set_home = true;
568+
}
569+
566570
if (executor_overrides.defer_failsafes) {
567571
current_overrides.defer_failsafes = true;
568572
current_overrides.defer_failsafes_timeout_s = executor_overrides.defer_failsafes_timeout_s;

0 commit comments

Comments
 (0)