refactor(commander): remove duplicate failure_detector_status from vehicle_status (#26754)

The failure_detector_status bitmask in vehicle_status duplicates the
separate FailureDetectorStatus topic. Remove it and read directly from
the dedicated topic in failureDetectorCheck and HIGH_LATENCY2.
This commit is contained in:
Jacob Dahl
2026-03-19 11:31:12 -08:00
committed by GitHub
parent 375d540cf8
commit 7d56582915
9 changed files with 286 additions and 30 deletions
+1 -2
View File
@@ -1925,7 +1925,6 @@ void Commander::run()
// Check for failure detector status
if (_failure_detector.update(_vehicle_status, _vehicle_control_mode)) {
_vehicle_status.failure_detector_status = _failure_detector.getStatus().value;
_status_changed = true;
}
@@ -1998,7 +1997,7 @@ void Commander::run()
send_parachute_command();
}
// publish states (armed, control_mode, vehicle_status, failure_detector_status) at 2 Hz or immediately when changed
// publish states (armed, control_mode, vehicle_status) at 2 Hz or immediately when changed
if ((now >= _vehicle_status.timestamp + 500_ms) || _status_changed || nav_state_or_failsafe_changed
|| !(_actuator_armed == actuator_armed_prev)) {
@@ -35,7 +35,13 @@
void FailureDetectorChecks::checkAndReport(const Context &context, Report &reporter)
{
if (context.status().failure_detector_status & vehicle_status_s::FAILURE_ROLL) {
failure_detector_status_s fd_status;
if (!_failure_detector_status_sub.copy(&fd_status)) {
return;
}
if (fd_status.fd_roll) {
/* EVENT
* @description
* The vehicle exceeded the maximum configured roll angle.
@@ -51,7 +57,7 @@ void FailureDetectorChecks::checkAndReport(const Context &context, Report &repor
mavlink_log_critical(reporter.mavlink_log_pub(), "Preflight Fail: Attitude failure (roll)");
}
} else if (context.status().failure_detector_status & vehicle_status_s::FAILURE_PITCH) {
} else if (fd_status.fd_pitch) {
/* EVENT
* @description
* The vehicle exceeded the maximum configured pitch angle.
@@ -68,7 +74,7 @@ void FailureDetectorChecks::checkAndReport(const Context &context, Report &repor
}
}
if (context.status().failure_detector_status & vehicle_status_s::FAILURE_ALT) {
if (fd_status.fd_alt) {
/* EVENT
*/
reporter.armingCheckFailure(NavModes::All, health_component_t::system, events::ID("check_failure_detector_alt"),
@@ -79,7 +85,7 @@ void FailureDetectorChecks::checkAndReport(const Context &context, Report &repor
}
}
if (context.status().failure_detector_status & vehicle_status_s::FAILURE_EXT) {
if (fd_status.fd_ext) {
/* EVENT
* @description
* <profile name="dev">
@@ -94,12 +100,10 @@ void FailureDetectorChecks::checkAndReport(const Context &context, Report &repor
}
}
reporter.failsafeFlags().fd_critical_failure = context.status().failure_detector_status &
(vehicle_status_s::FAILURE_ROLL | vehicle_status_s::FAILURE_PITCH | vehicle_status_s::FAILURE_ALT |
vehicle_status_s::FAILURE_EXT);
reporter.failsafeFlags().fd_critical_failure = fd_status.fd_roll || fd_status.fd_pitch || fd_status.fd_alt ||
fd_status.fd_ext;
reporter.failsafeFlags().fd_imbalanced_prop = context.status().failure_detector_status &
vehicle_status_s::FAILURE_IMBALANCED_PROP;
reporter.failsafeFlags().fd_imbalanced_prop = fd_status.fd_imbalanced_prop;
if (reporter.failsafeFlags().fd_imbalanced_prop) {
/* EVENT
@@ -35,6 +35,8 @@
#include "../Common.hpp"
#include <uORB/Subscription.hpp>
#include <uORB/topics/failure_detector_status.h>
class FailureDetectorChecks : public HealthAndArmingCheckBase
{
@@ -45,4 +47,5 @@ public:
void checkAndReport(const Context &context, Report &reporter) override;
private:
uORB::Subscription _failure_detector_status_sub{ORB_ID(failure_detector_status)};
};
+18 -4
View File
@@ -55,6 +55,7 @@
#include <uORB/topics/vehicle_local_position.h>
#include <uORB/topics/vehicle_attitude.h>
#include <uORB/topics/vehicle_status.h>
#include <uORB/topics/failure_detector_status.h>
#include <uORB/topics/failsafe_flags.h>
#include <uORB/topics/health_report.h>
#include <uORB/topics/vehicle_air_data.h>
@@ -135,6 +136,7 @@ private:
updated |= write_heading_if_updated(&msg);
updated |= write_mission_result_if_updated(&msg);
updated |= write_failsafe_flags(&msg);
updated |= write_failure_detector_status(&msg);
// these topics are already updated in update_data() and thus we just copy them here
write_airspeed(&msg);
@@ -454,10 +456,6 @@ private:
}
}
if (status.failure_detector_status & vehicle_status_s::FAILURE_MOTOR) {
msg->failure_flags |= HL_FAILURE_FLAG_ENGINE;
}
// flight mode
union px4_custom_mode custom_mode {get_px4_custom_mode(status.nav_state)};
msg->custom_mode = custom_mode.custom_mode_hl;
@@ -492,6 +490,21 @@ private:
return false;
}
bool write_failure_detector_status(mavlink_high_latency2_t *msg)
{
failure_detector_status_s fd_status;
if (_failure_detector_status_sub.update(&fd_status)) {
if (fd_status.fd_motor) {
msg->failure_flags |= HL_FAILURE_FLAG_ENGINE;
}
return true;
}
return false;
}
bool write_wind(mavlink_high_latency2_t *msg)
{
wind_s wind;
@@ -665,6 +678,7 @@ private:
uORB::Subscription _gps_sub{ORB_ID(vehicle_gps_position)};
uORB::Subscription _mission_result_sub{ORB_ID(mission_result)};
uORB::Subscription _status_sub{ORB_ID(vehicle_status)};
uORB::Subscription _failure_detector_status_sub{ORB_ID(failure_detector_status)};
uORB::Subscription _failsafe_flags_sub{ORB_ID(failsafe_flags)};
uORB::Subscription _tecs_status_sub{ORB_ID(tecs_status)};
uORB::Subscription _wind_sub{ORB_ID(wind)};