mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-18 01:33:34 +08:00
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:
@@ -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)};
|
||||
};
|
||||
|
||||
@@ -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)};
|
||||
|
||||
Reference in New Issue
Block a user